Android開啟odex開關和開機速度優化


 

開odex優化首次開機速度,是犧牲空間換取時間的做法,僅限於空間足夠的設備。開了odex之后,在編譯的時候,整個system image就會被預先優化。由於在啟動時不再需要進行app的dex文件進行優化(dex2oat操作)從而提升其啟動速度。 
關於odex,有幾個下面幾個宏開關:

1、WITH_DEXPREOPT

這個開關在6.0 USER版本上是默認開啟的,意思就是USER版本要開odex預編譯。會導致system image中的所有東西都被提前優化(pre-optimized)。這可能導致system image非常大。

那么問題就來了,既然 WITH_DEXPREOPT := true 默認開啟,那么為什么首次啟動依然耗時很長呢?這個就和第二個宏開關——DONT_DEXPREOPT_PREBUILTS有關了。

2、DONT_DEXPREOPT_PREBUILTS

如果我們不想把prebuilts目錄中的第三方應用進行預先優化(這些應用在他們的Android.mk文件中有include$(BUILD_PREBUILT) ),而是希望這些app通過playstore 或者app提供商進行升級,那么我們可以打開這個宏開關。

事實上,6.0上面,這個宏開關也是默認開啟的。我們全局搜索一下“(BUILD_PREBUILT) ”會發現很多結果,這也就是為什么默認odex都開了,為什么開機並沒有覺得快的原因了。


因此我們在做odex優化的時候,都會關閉DONT_DEXPREOPT_PREBUILTS,然后重新給我們預置的App添加 LOCAL_DEX_PREOPT :=false 讓它們不進行預編譯,這樣也就能節省一些不必要的空間消耗。同時因為關閉了DONT_DEXPREOPT_PREBUILTS,很多可以隨ROM升級的系統App也就進行了預編譯,因此開機速度就有了明顯的提高。

3、LOCAL_DEX_PREOPT

上面我們已經提到了,在App的Android.mk文件里面添加這個宏開關,可以控制這個App時候要預編譯。一般預置的第三方App都會把這個宏開關置為false,這樣既可以避免提取odex出現異常導致App功能異常,也能節省一定空間消耗。編譯生成的文件沒有oat文件,也就意味着沒有被提前優化。

LOCAL_DEX_PREOPT := false // 不進行預先優化 
LOCAL_DEX_PREOPT := true // 進行預先優化 
4、WITH_DEXPREOPT_BOOT_IMG_ONLY

這個開關只是把boot image 進行預先優化。簡單來說,其主要生成boot.art 和boot.oat。這能顯著的減少systemimage 大小。但是,所有的app 都需要在第一次啟動的時候進行優化需要花更長的boottime 時間。我們一般不配置這個開關。

5、WITH_DEXPREOPT_PIC

ART 在system 有一份OAT file,在運行時也會copy 一份到/data/ dalvik-cache下。如果我們內部存儲不夠,可以打開這個選項,但是這個選項可能會影響運行時的性能。因為ART 會關閉和position相關的優化。這個開關我們一般也不需要配置。

6、WITH_ART_SMALL_MODE

如果手機沒有足夠的空間,我們可以打開 這個宏。ART只會預先優化boot class。第一次啟動的時間會大大的提升,但是也會大大影響運行時性能。因為其它的appcode 是解釋性執行的。但這個開關是老版本的,現在新版本的Android版本一般不用關注。

(轉)


免責聲明!

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



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