Android 第一次开机速度优化
現在很多Android項目都需要預裝很多apk。
主要在/system/app,/system/priv-app/,/system/vendor/app等目錄下。
預置很多應用的結果就是,第一次開機的時候?systemService.java 會調用PackageManagerService.java對這幾個目錄下的apk多dexopt的優化,生成oat文件。apk越多,首次開機的時間也就越長,導致第一次開機需要5-6分鐘,不利于用戶體驗。
對于這些應用,我們可以對其進行odex優化:
一、在devices所建立的子項目下的BoardConfig.mk文件中添加
????????DISABLE_DEXPREOPT := false
? ? ? ? WITH_DEXPREOPT := true
可以再編譯時對apk,jar都做odex的提取優化,如果不想jar包做odex優化,可以在/buid/core/java_library.mk文件中設置:
LOCAL_DEX_PREOPT := false
在實際開發過程中,有些apk如果做了odex優化,可能會出問題,可以在apk的Android.mk文件中添加該屬性
二、打開宏WITH_DEXPREOPT:=true后,首次開機無效果仍然慢;
????????說明開機之后又去提取預置apk的odex文件(原本應該是在預編譯階段就生成的);
? ? ? ? 主要原因是預置apk的Android.mk對32bit和64bit的配置不準確導致。
搜索main log關鍵字:dex2oat : /system/bin/dex2oat?
??這條log打印出就代表這個apk有在做dex2oat且是32還是64的指令集
?I dex2oat : /system/bin/dex2oat --zip-fd=11 --zip-location=/system/app/***.apk --oat-fd=12?--oat-location=/data/dalvik-cache/arm or arm64/system@app@**@**.apk@classes.dex?--instruction-set=arm or arm64?--instruction-set-features=default --runtime-arg -Xms64m --runtime-arg -Xmx512m --swap-fd=13
?oat-location表示odex文件存儲位置
??Instruction-set表示此apk的primaryCpuAbi對應的指令集(arm對應32bit / arm64對應64bit)
?請嚴格遵守:
?????? 1、對于64bit的芯片,若apk只32bit的lib或者只能作為32bit運行,請在預置apk時在android.mk中添加下邊的TAG標記此apk為32bit:
?????????????LOCAL_MULTILIB :=32?
?????????? (比如出現上述做dex2oat arm的log,則需這樣設定)
?????? 2、而對于有源碼無lib庫的apk,
? ? ? ? ? ? ?請注釋掉LOCAL_MULTILIB :=32?
??????????? (比如出現上述做dex2oat arm64的log,則需這樣注釋掉)
?????? 3、開機之后既提取arm又提取arm64的apk,
?????????????請設定LOCAL_MULTILIB :=both
??????????? (比如出現上述做dex2oat arm以及arm64的log,則需這樣設定)
總之,對32bit 和 64bit?的apk做不同處理。
例:對于第三方QQ或者微信等預置apk做提取odex處理需要添加WITH_DEXPREOPT := true外
還需要在android.mk文件中添加LOCAL_MULTILIB :=both才可以。
總結
以上是生活随笔為你收集整理的Android 第一次开机速度优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发者从应用程序商店难以赚到真金白银
- 下一篇: android sina oauth2.