一、概念
手機(jī)應(yīng)用安裝的方式有非常多,在移動(dòng)端測試中,我們比較關(guān)注應(yīng)用是全新安裝,還是覆蓋升級安裝,因?yàn)檫@兩不同的安裝方式可能會(huì)帶來一些隱藏比較深的問題。而對于一個(gè)在市場已經(jīng)有大量用戶的APP來說,升級安裝應(yīng)該是絕大多數(shù)用戶選擇的方式,在上個(gè)季度復(fù)盤覆蓋安裝導(dǎo)致的bug時(shí),統(tǒng)計(jì)發(fā)現(xiàn)影響用戶數(shù)量在80%以上,也就是說至少80%的用戶是通過應(yīng)用市場更新的。
覆蓋安裝,是指用戶在不清除用戶數(shù)據(jù)或本地緩存設(shè)置的情況下,對應(yīng)用進(jìn)行功能性的升級,在升級過程中,老版本所產(chǎn)生的用戶數(shù)據(jù)需要正確遷移,才能保障用戶升級后的功能可用性。
那么,移動(dòng)應(yīng)用的覆蓋安裝測試中我們需要關(guān)注哪些點(diǎn)?應(yīng)用中功能很多,覆蓋時(shí)不可能全部遍歷,在每次的項(xiàng)目測試中,我們也不可能把項(xiàng)目用例都過一遍。因此,我們需要理清在應(yīng)用覆蓋安裝過程中究竟做了什么操作以及會(huì)影響到哪些功能,那剩余不受影響的部分就是我們能夠“減少工作量”的地方。
二、覆蓋安裝關(guān)注點(diǎn)
2.1應(yīng)用安裝過程
首先了解一下應(yīng)用安裝的四大步驟:
(1)拷貝apk到指定的目錄:默認(rèn)情況下,用戶安裝的apk首先會(huì)拷貝到/data/data/app下,用戶有訪問/data/data/app目錄的權(quán)限,但系統(tǒng)出廠的apk文件會(huì)被放到/system分區(qū)下,包括/system/app,/system/vendor/app,以及/system/priv-app等,該分區(qū)需要root權(quán)限的用戶才能訪問。
(2)加載apk、拷貝文件、創(chuàng)建應(yīng)用的數(shù)據(jù)目錄:為了加快APP的啟動(dòng)速度,apk在安裝的時(shí)候,會(huì)首先將APP的可執(zhí)行文件(dex)拷貝到/data/dalvik-cache目錄下,緩存起來。再在/data/data/包名目錄下創(chuàng)建應(yīng)用程序的數(shù)據(jù)目錄(以應(yīng)用包名命令),用來存放應(yīng)用的數(shù)據(jù)庫、xml文件、cache、二進(jìn)制的so動(dòng)態(tài)庫等。
(3)解析apk的AndroidManifest.xml文件:在安裝apk的過程中,會(huì)解析apk的AndroidManifest.xml文件,將apk的權(quán)限、應(yīng)用包名、apk的安裝位置、版本、userID等重要信息保存在/data/system/packages.xml文件中。
(4)顯示icon圖標(biāo):應(yīng)用程序經(jīng)過PMS中的邏輯處理后,相當(dāng)于已經(jīng)注冊好了,如果想要在Android桌面上看到icon圖標(biāo),則需要Launcher將系統(tǒng)中已經(jīng)安裝的程序展現(xiàn)在桌面上。
在應(yīng)用安裝過程中,主要涉及以下幾個(gè)目錄:
/data/app/包名: 代碼程序安裝目錄,安裝時(shí)會(huì)把a(bǔ)pk文件復(fù)制到此目錄下
/data/data/包名:存放用戶數(shù)據(jù)的目錄
不管是全新安裝還是覆蓋安裝,程序代碼目錄/data/app/包名肯定是完全更新了的,但用戶數(shù)據(jù)目錄/data/data/包名則需要視業(yè)務(wù)而定,如果新舊版本對數(shù)據(jù)格式或內(nèi)容要求一樣,則用戶數(shù)據(jù)目錄不需要更新,但若新版本的數(shù)據(jù)格式不兼容舊版本,則需要將舊版本數(shù)據(jù)按新版本的格式進(jìn)行遷移,這些數(shù)據(jù)變化所影響到的功能模塊便是測試關(guān)注的重點(diǎn)。
2.2 主要的數(shù)據(jù)
對于一個(gè)應(yīng)用來說,可能會(huì)用到的本地緩存有:
- sqlite本地?cái)?shù)據(jù)庫文件
- share preference配置的xml文件
- 其他文本或二進(jìn)制文件
從數(shù)據(jù)庫來看,其變更可以分為:
- 已有數(shù)據(jù)庫表結(jié)構(gòu)的增加、刪除、修改
- 數(shù)據(jù)內(nèi)容的更新
- 新增/刪除數(shù)據(jù)庫或表
對于其他文本或二進(jìn)制文件,則需要根據(jù)業(yè)務(wù)使用情況而定了
三、小程序框架
3.1 所用數(shù)據(jù)庫
對于小程序框架業(yè)務(wù)而言,用到了哪些本地緩存相關(guān)的呢?我們可以直接用adb shell命令查看,如果手機(jī)沒有root,是無法查看/data/目錄的,但如果安裝的應(yīng)用開啟了debug模式,可以用run-as命令進(jìn)入該數(shù)據(jù)目錄,如下圖所示

用戶數(shù)據(jù)目錄存放的文件非常多,具體業(yè)務(wù)用到哪些可以咨詢下開發(fā)。但通常來講,databases目錄是存放sqlite數(shù)據(jù)庫文件的,files存放普通文本文件,shared_prefs是一些xml文件。

從上圖得知,小程序框架的數(shù)據(jù)庫主要有ai_apps.db和ai_apps_pms.db兩個(gè)數(shù)據(jù)庫,但未root的手機(jī),adb shell里無法直接執(zhí)行sqlite3命令,如果想查看數(shù)據(jù)庫內(nèi)容,可以先用tar命令將databases目錄打包,然后mv到/sdcard/目錄,最后用adb pull到PC端,用sqlite3查看便可。如果有android studio可以用view → tools window → device file explorer,找到目錄然后右鍵save as到PC機(jī)也行

拿到數(shù)據(jù)庫.db文件后,就可以在pc端用sqlite3命令查看了,也可以安裝一個(gè)sqlite studio軟件。小程序框架用到的ai_apps庫中有4個(gè)表,ai_apps_aps_data是百度的統(tǒng)計(jì)信息,由于我們有自己的pingback,所以無需關(guān)注,ai_apps_favorites,ai_apps_cloud_config是百度那邊下發(fā)的一些云配置相關(guān),看代碼應(yīng)該是已經(jīng)棄用 ,剩下的favorites收藏表和history訪問歷史表,收藏即是更多菜單欄內(nèi) “添加到我的小程序”功能,訪問歷史是記錄用戶打開過的小程序列表,這兩塊功能在愛奇藝端已經(jīng)單獨(dú)實(shí)現(xiàn),不依賴此本地?cái)?shù)據(jù)庫,所以也不需要關(guān)注

在ai_apps_pms數(shù)據(jù)庫中,有extension表保存的是當(dāng)前extension私有擴(kuò)展js庫的版本號(hào)信息,framework表保存的是swan core基礎(chǔ)庫版本信息,在安裝或日常啟動(dòng)小程序時(shí),會(huì)檢測小程序js基礎(chǔ)庫最新版與當(dāng)前本地緩存版本對比,若有更新,則更新本地的基礎(chǔ)庫。pkg_main和pkg_sub保存的訪問過的小程序代碼包的信息,在小程序再次啟動(dòng)時(shí)會(huì)優(yōu)先用本地緩存包,同時(shí)會(huì)調(diào)接口檢查是否有新版,若有新版,則下載新版小程序包并保存到本地,下次啟動(dòng)時(shí)便是新版代碼了。swan_app是保存訪問過的小程序的基礎(chǔ)信息,主要是聯(lián)合其他表使用。
這個(gè)數(shù)據(jù)庫的操作代碼全部位于swan-android,即百度開源的項(xiàng)目,對于宿主來說,基本不會(huì)去動(dòng),除了需要升級小程序框架外(同步百度最新的框架代碼),如下是涉及到數(shù)據(jù)庫更新表結(jié)構(gòu)相關(guān)的代碼。


因此綜上所述,涉及到數(shù)據(jù)庫相關(guān)的,我們可能要關(guān)注的功能有:
添加到我的小程序小程序訪問記錄- 基礎(chǔ)庫swan-core版本的更新
- 私有擴(kuò)展庫extension版本的更新
- 小程序代碼包的下載和更新
- 小程序sub分包的下載和更新
3.2 所用緩存文件
小程序框架所用到的緩存文件集中在files/aiapps_folder和files/zeus/內(nèi),zeus目錄是用來存放百度webview內(nèi)核(支持同層渲染,針對小程序定制的webview,系統(tǒng)webview不支持),aiapps_folder內(nèi)主要是訪問過的小程序代碼包、swan-core(基礎(chǔ)庫)、extension(私有api擴(kuò)展庫)、cloud_config(小程序配置信息,主要是配置的可訪問域名信息),如下圖所示

因此綜上所述,涉及到緩存文件相關(guān)的功能有:
- 基礎(chǔ)庫swan-core js
- 私有擴(kuò)展庫extension js
- 小程序代碼包的加載
- 配置的可訪問域名信息
- 百度同層渲染webview內(nèi)核的更新
四、總結(jié)
經(jīng)過對小程序框架內(nèi)所用數(shù)據(jù)庫和緩存文件的分析,我們已經(jīng)總結(jié)出可能需要驗(yàn)證覆蓋安裝case的功能。再以日常項(xiàng)目為維度出發(fā),我們需重點(diǎn)關(guān)注覆蓋安裝的項(xiàng)目有:
- 框架升級
愛奇藝內(nèi)一般不會(huì)緊隨百度版本,所以框架升級一次一般會(huì)跨越百度多個(gè)版本,涉及功能變更較大,其數(shù)據(jù)庫或使用的緩存文件格式可能會(huì)有所改變,因此必須驗(yàn)證覆蓋安裝 - 增加或更新私有API邏輯
增加或更新私有API,都會(huì)涉及extension.js的更改,該js文件有版本控制,全新安裝時(shí)會(huì)使用新包內(nèi)的js,而覆蓋安裝時(shí)會(huì)對比老版本,若檢測到版本不變則不會(huì)更新,可能會(huì)導(dǎo)致新增或修改過的API不可用 - 百度同層渲染webview內(nèi)核
目前百度webview內(nèi)核存在云端,首次啟動(dòng)小程序會(huì)下載該so庫放于本地,因此若涉及到更新webview內(nèi)核時(shí),需驗(yàn)證覆蓋安裝時(shí),內(nèi)核是否成功更新 - 百度發(fā)布新版本基礎(chǔ)庫
小程序在啟動(dòng)時(shí),會(huì)檢查基礎(chǔ)庫版本,若百度發(fā)布了新版本,則會(huì)下載更新本地庫,也就是說基礎(chǔ)庫是保持和百度發(fā)版一致的