Android 通過odex優化提高首次開機速度


背景

客戶反饋說開機時間過長,需要優化。

原文: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秒左右。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM