背景
客戶反饋說開機時間過長,需要優化。
原文:https://blog.csdn.net/croop520/article/details/73930184
介紹
現在很多Android都需要預裝很多apk,這些apk主要在/system/app,/system/priv-app/,/system/vendor/app等目錄下。
如果沒有做odex優化,在首次開機時,systemService.java 會調用PackageManagerService.java對這幾個目錄下的apk多dexopt的優化,生成oat文件。apk越多,首次開機的時間也就越長。
首次開機時,通常在手機上開到正在優化第*個應用,總共 * 個應用。就是在對apk做dexopt的優化。
解決方式
編譯時odex優化
如果我們要提高首次開機的速度,可以做如下設置:
1、在安卓源碼樹/device/xxx/項目/BoardConfig.mk
修改下面兩個設置:
#Joe add 20181221
# Enable dex pre-opt to speed up initial boot
#ifneq ($(TARGET_USES_AOSP),true)
# ifeq ($(HOST_OS),linux)
ifeq ($(WITH_DEXPREOPT),)
WITH_DEXPREOPT := true
WITH_DEXPREOPT_PIC := true
ifneq ($(TARGET_BUILD_VARIANT),user)
# Retain classes.dex in APK's for non-user builds
DEX_PREOPT_DEFAULT := nostripping
endif
endif
修改下面兩個設置,在編譯時,對jar,apk都做odex優化,生成對應的odex文件
DISABLE_DEXPREOPT := false
WITH_DEXPREOPT := true
如果不想在編譯時做odex優化,可以注釋掉這兩行,或者把這兩個值設置成:
注釋:
#DISABLE_DEXPREOPT := false
#WITH_DEXPREOPT := true
或:
DISABLE_DEXPREOPT := true
WITH_DEXPREOPT := false
jar包odex優化
2、如果設置了:
DISABLE_DEXPREOPT := false
WITH_DEXPREOPT := true
在編譯的時候,/system/framework/
目錄下面的jar包,和/system/app
,/system/priv-app/
,/system/vendor/app
下面的apk文件,都會在編譯時,做odex優化。
如果不想jar包做odex優化,可以在/buid/core/java_library.mk文件中設置:
LOCAL_DEX_PREOPT := false
這樣在編譯時,jar包就不會做odex優化。
單獨的APK優化
3、在實際開發過程中,有些apk如果做了odex優化,可能會出問題,可以通過在apk的編譯目錄Android.mk文件中添加:
LOCAL_DEX_PREOPT := false
這樣該apk就不會做odex優化。
如果jar包和apk都做odex優化,在我的項目中,原來的首次開機速度3分鍾左右可以提高到1分05秒左右。