一、概念
手機應用安裝的方式有非常多,在移動端測試中,我們比較關注應用是全新安裝,還是覆蓋升級安裝,因為這兩不同的安裝方式可能會帶來一些隱藏比較深的問題。而對于一個在市場已經有大量用戶的APP來說,升級安裝應該是絕大多數用戶選擇的方式,在上個季度復盤覆蓋安裝導致的bug時,統計發現影響用戶數量在80%以上,也就是說至少80%的用戶是通過應用市場更新的。
覆蓋安裝,是指用戶在不清除用戶數據或本地緩存設置的情況下,對應用進行功能性的升級,在升級過程中,老版本所產生的用戶數據需要正確遷移,才能保障用戶升級后的功能可用性。
那么,移動應用的覆蓋安裝測試中我們需要關注哪些點?應用中功能很多,覆蓋時不可能全部遍歷,在每次的項目測試中,我們也不可能把項目用例都過一遍。因此,我們需要理清在應用覆蓋安裝過程中究竟做了什么操作以及會影響到哪些功能,那剩余不受影響的部分就是我們能夠“減少工作量”的地方。
二、覆蓋安裝關注點
2.1應用安裝過程
首先了解一下應用安裝的四大步驟:
(1)拷貝apk到指定的目錄:默認情況下,用戶安裝的apk首先會拷貝到/data/data/app下,用戶有訪問/data/data/app目錄的權限,但系統出廠的apk文件會被放到/system分區下,包括/system/app,/system/vendor/app,以及/system/priv-app等,該分區需要root權限的用戶才能訪問。
(2)加載apk、拷貝文件、創建應用的數據目錄:為了加快APP的啟動速度,apk在安裝的時候,會首先將APP的可執行文件(dex)拷貝到/data/dalvik-cache目錄下,緩存起來。再在/data/data/包名目錄下創建應用程序的數據目錄(以應用包名命令),用來存放應用的數據庫、xml文件、cache、二進制的so動態庫等。
(3)解析apk的AndroidManifest.xml文件:在安裝apk的過程中,會解析apk的AndroidManifest.xml文件,將apk的權限、應用包名、apk的安裝位置、版本、userID等重要信息保存在/data/system/packages.xml文件中。
(4)顯示icon圖標:應用程序經過PMS中的邏輯處理后,相當于已經注冊好了,如果想要在Android桌面上看到icon圖標,則需要Launcher將系統中已經安裝的程序展現在桌面上。
在應用安裝過程中,主要涉及以下幾個目錄:
/data/app/包名: 代碼程序安裝目錄,安裝時會把apk文件復制到此目錄下
/data/data/包名:存放用戶數據的目錄
不管是全新安裝還是覆蓋安裝,程序代碼目錄/data/app/包名肯定是完全更新了的,但用戶數據目錄/data/data/包名則需要視業務而定,如果新舊版本對數據格式或內容要求一樣,則用戶數據目錄不需要更新,但若新版本的數據格式不兼容舊版本,則需要將舊版本數據按新版本的格式進行遷移,這些數據變化所影響到的功能模塊便是測試關注的重點。
2.2 主要的數據
對于一個應用來說,可能會用到的本地緩存有:
- sqlite本地數據庫文件
- share preference配置的xml文件
- 其他文本或二進制文件
從數據庫來看,其變更可以分為:
- 已有數據庫表結構的增加、刪除、修改
- 數據內容的更新
- 新增/刪除數據庫或表
對于其他文本或二進制文件,則需要根據業務使用情況而定了
三、小程序框架
3.1 所用數據庫
對于小程序框架業務而言,用到了哪些本地緩存相關的呢?我們可以直接用adb shell命令查看,如果手機沒有root,是無法查看/data/目錄的,但如果安裝的應用開啟了debug模式,可以用run-as命令進入該數據目錄,如下圖所示
用戶數據目錄存放的文件非常多,具體業務用到哪些可以咨詢下開發。但通常來講,databases目錄是存放sqlite數據庫文件的,files存放普通文本文件,shared_prefs是一些xml文件。
從上圖得知,小程序框架的數據庫主要有ai_apps.db和ai_apps_pms.db兩個數據庫,但未root的手機,adb shell里無法直接執行sqlite3命令,如果想查看數據庫內容,可以先用tar命令將databases目錄打包,然后mv到/sdcard/目錄,最后用adb pull到PC端,用sqlite3查看便可。如果有android studio可以用view → tools window → device file explorer,找到目錄然后右鍵save as到PC機也行
拿到數據庫.db文件后,就可以在pc端用sqlite3命令查看了,也可以安裝一個sqlite studio軟件。小程序框架用到的ai_apps庫中有4個表,ai_apps_aps_data是百度的統計信息,由于我們有自己的pingback,所以無需關注,ai_apps_favorites,ai_apps_cloud_config是百度那邊下發的一些云配置相關,看代碼應該是已經棄用 ,剩下的favorites收藏表和history訪問歷史表,收藏即是更多菜單欄內 “添加到我的小程序”功能,訪問歷史是記錄用戶打開過的小程序列表,這兩塊功能在愛奇藝端已經單獨實現,不依賴此本地數據庫,所以也不需要關注
在ai_apps_pms數據庫中,有extension表保存的是當前extension私有擴展js庫的版本號信息,framework表保存的是swan core基礎庫版本信息,在安裝或日常啟動小程序時,會檢測小程序js基礎庫最新版與當前本地緩存版本對比,若有更新,則更新本地的基礎庫。pkg_main和pkg_sub保存的訪問過的小程序代碼包的信息,在小程序再次啟動時會優先用本地緩存包,同時會調接口檢查是否有新版,若有新版,則下載新版小程序包并保存到本地,下次啟動時便是新版代碼了。swan_app是保存訪問過的小程序的基礎信息,主要是聯合其他表使用。
這個數據庫的操作代碼全部位于swan-android,即百度開源的項目,對于宿主來說,基本不會去動,除了需要升級小程序框架外(同步百度最新的框架代碼),如下是涉及到數據庫更新表結構相關的代碼。
因此綜上所述,涉及到數據庫相關的,我們可能要關注的功能有:
添加到我的小程序小程序訪問記錄- 基礎庫swan-core版本的更新
- 私有擴展庫extension版本的更新
- 小程序代碼包的下載和更新
- 小程序sub分包的下載和更新
3.2 所用緩存文件
小程序框架所用到的緩存文件集中在files/aiapps_folder和files/zeus/內,zeus目錄是用來存放百度webview內核(支持同層渲染,針對小程序定制的webview,系統webview不支持),aiapps_folder內主要是訪問過的小程序代碼包、swan-core(基礎庫)、extension(私有api擴展庫)、cloud_config(小程序配置信息,主要是配置的可訪問域名信息),如下圖所示
因此綜上所述,涉及到緩存文件相關的功能有:
- 基礎庫swan-core js
- 私有擴展庫extension js
- 小程序代碼包的加載
- 配置的可訪問域名信息
- 百度同層渲染webview內核的更新
四、總結
經過對小程序框架內所用數據庫和緩存文件的分析,我們已經總結出可能需要驗證覆蓋安裝case的功能。再以日常項目為維度出發,我們需重點關注覆蓋安裝的項目有:
- 框架升級
愛奇藝內一般不會緊隨百度版本,所以框架升級一次一般會跨越百度多個版本,涉及功能變更較大,其數據庫或使用的緩存文件格式可能會有所改變,因此必須驗證覆蓋安裝 - 增加或更新私有API邏輯
增加或更新私有API,都會涉及extension.js的更改,該js文件有版本控制,全新安裝時會使用新包內的js,而覆蓋安裝時會對比老版本,若檢測到版本不變則不會更新,可能會導致新增或修改過的API不可用 - 百度同層渲染webview內核
目前百度webview內核存在云端,首次啟動小程序會下載該so庫放于本地,因此若涉及到更新webview內核時,需驗證覆蓋安裝時,內核是否成功更新 - 百度發布新版本基礎庫
小程序在啟動時,會檢查基礎庫版本,若百度發布了新版本,則會下載更新本地庫,也就是說基礎庫是保持和百度發版一致的