天天看點

打通“任督二脈”:Android 應用安裝優化實戰

apk安裝過程,涉及到data/app、data/data等檔案夾的通路與資源的存儲,了解安裝流程,可以幫助業務進行整改,解決線上問題

疑問:

(1)了解APK安裝流程有什麼好處

(2)了解APK安裝流程可以解決什麼問題

安裝就分為下面三個階段,每個階段可以做些什麼工作,可以幫助我們優化安裝流程,解決安裝後的一些問題呢?

(1)安裝前、安裝中:這兩個階段,第三方應用做不了什麼,一般是應用分發APP應用商店、遊戲中心、浏覽器、應用寶這些應用會關注這兩個狀态。

(2)安裝後:這個階段,無論是内置應用還是第三方應用,或多或少的會遇到一些問題,如so檔案找不到,圖檔存儲、緩存資料等出現異常等...

打通“任督二脈”:Android 應用安裝優化實戰

安裝前無非是根據自己的應用情況,選擇一種可以使用的安裝方法。

對于具有系統簽名的廠商應用,具備靜默安裝能力,使用pm指令即可實作。

非系統簽名的應用寶這種應用,隻能使用包安裝管理器進行安裝。

使用session安裝的原因,是因為從Android 8.0開始,pm指令無法實作靜默安裝,否則會直接顯示安裝失敗。但是網上并未發現對靜默方法的适配方案,也許這是因為這個相容隻有廠商關注,第三方應用不關注這個方法的相容。下面給出相容方案:

該方法是從packageManager中抽取出的代碼,可實作應用的靜默安裝。

APK檔案其實是zip格式,一般包含一個或多個dex檔案、resources.arsc、AndroidManifest.xml、res目錄、META-INF目錄及包含so庫的lib目錄:

打通“任督二脈”:Android 應用安裝優化實戰

system/app——内置應用,也就是系統自帶的應用程式,無法删除。

data/app——使用者程式安裝的目錄,有删除權限。安裝時把apk檔案複制到此目錄。

data/data——存放應用程式的資料,比如一些sp緩存資料。

data/dalvik-cache——将APK中的dex檔案安裝到dalvik-cache目錄下(dex檔案是dalvik虛拟機的可執行檔案,其大小約為原始APK檔案大小的四分之一)。

打通“任督二脈”:Android 應用安裝優化實戰

安裝過程概括為:複制APK安裝包到/data/app目錄下,解壓并掃描安裝包,向資料總管注入APK資源,解析AndroidManifest檔案,并在/data/data目錄下建立對應的應用資料目錄,然後針對dalvik/art環境優化dex檔案,儲存到dalvik-cache目錄,将AndroidManifest檔案解析出的元件、權限注冊到PackageManagerService,完成後發送廣播。

安裝中,這個過程看上去沒有什麼可以做的,但是對于廠商應用來說,應用的安裝速度,卻是可以有很大的提升空間的。如應用更新的差分包更新就是一種常見的增量更新方式。

經過一系列測試與驗證,發現應用安裝的速度,本身與一些因素有關,最主要的是CPU的使用頻率。

衆所周知,現在的手機較為高端,為8核,但是在應用安裝過程中,分析trace檔案,可以确認,并不是8核線程全負荷工作去完成一個應用的安裝,而是一部分線程運作在高核,一部分在低核。

cpuinfo_max_freq cpuinfo_min_freq :分别給出了 CPU 硬體所支援的最高運作頻率及最低運作頻率,

cpuinfo_cur_freq 則會從CPU 硬體寄存器中讀取CPU 目前所處的運作頻率。

Governor 在選擇合适的運作頻率時隻會在scaling_max_freq 和 scaling_min_freq 所确定的頻率範圍内進行選擇。

scaling_cur_freq 傳回的是cpufreq 子產品緩存的CPU目前運作頻率,而不會對CPU 硬體寄存器進行檢查。

scaling_available_governors 會告訴使用者目前有哪些 governors 可供使用者使用。

scaling_driver 則會顯示該 CPU 所使用的變頻驅動程式。

Scaling_governor 則會顯示目前的管理政策,往這個上 echo 其他類型會有相應的轉變。

scaling_setspeed :需将 governor 類型切換為 userspace ,才會出現,往這個檔案 echo 數值,會切換主頻。

基于此,可以在應用安裝時,提升CPU的工作頻率,即可使CPU運作在合适的頻率。

除了可以直接根據安裝速度判斷安裝速度是否提升外,也可以根據下面日志判斷提頻是否有效:

可以直接看到頻率變化:

打通“任督二脈”:Android 應用安裝優化實戰

微信安裝速度可以由前面CPU低頻時的20s,提升到CPU頻率較高時的10s左右。

注意:頻率不是越高越好,頻率越高,手機耗電會越高,容易發熱。

應用安裝後,會遇到各種各樣的問題,啟動失敗,合規整改(這個其實在應用開發時就要完成),那麼哪些問題又是可能遇到,又可以借助apk的安裝流程去解決的

在《符合 Google Play 的目标 API 級别要求》 一文中,根據google官方要求,需要對隐私權限進行管控,強制執行分區存儲,這就要求,每個應用不得在sd卡進行資源存儲。那麼問題來了,假如你的項目使用了Glide,Glide的存儲路徑之前設定到了sd卡下面,現在又無法使用外部存儲目錄,該怎麼辦?

當了解了apk的安裝流程之後,知道應用的資料會存儲在data/data/packagename下面,這就給Glide的資源存儲提供了一個内部檔案夾,唯一要做的事情,就是為了防止data/data占用過大,把Glide的存儲目錄設定個上限即可。

如果你的應用接了騰訊的mmkv,你可能遇到了這樣的問題:

這個表示應用加載libmmkv.so出現異常。

出現問題的原因是什麼:根據日志可以确認,是找不到應用data/app/檔案夾下面的libmmkv.so檔案。

前面提到,應用的資料會存儲在data/data下面,這個路徑下面也包含了應用解壓之後的so庫,是以可以做一件事情解決上面libmmkv.so的問題,重連結data/data下面的資源到data/app下面,實作資源共享。實踐證明該方案完全可行,有效解決了so庫找不到的問題。

從apk發起安裝,安裝中、一直到安裝結束,應用狀态的變化,CPU的使用,資源的共享,牽涉到一系列知識點,這些知識點是可以串聯起來的,對提升個人的知識體系有幫助。當然,由于文章篇幅有限,本文章隻是作為一個引導,大緻說明安裝過程中存在什麼知識點,PMS、檔案管理、程序拉起等等安全可以另起一章節進行介紹,後續會介紹這些方面的内容。

廠商應用更多的關注安裝前、安裝中遇到的問題,第三方應用關注安裝後遇到的問題。掌握了安裝過程中的每一個環節,通過上面的分析,可以知道,能夠快速幫助定位問題。

作者:vivo網際網路用戶端團隊-Xu Jie

分享 vivo 網際網路技術幹貨與沙龍活動,推薦最新行業動态與熱門會議。