手機生成ODEX提公升開機速度的原因

2021-08-02 16:18:05 字數 3862 閱讀 6632

手機生成odex提公升開機速度的原因:

一:什麼是odex

odex是安卓上的應用程式apk中提取出來的可執行檔案,是通過apk安裝包的中的dex優化過的,再把apk包裡的dex檔案刪除。這樣做可以加快軟體的啟動速度, 預先提取,減少對ram的占用,因為沒有odex的話,系統要從apk包中提取dex再執行。

什麼是dalvik-cache.

當android

啟動時,

dalvikvm

監視所有的程式(

apk檔案)和框架,並且為他們建立乙個依存關係樹。

dalvikvm

通過這個依存關係樹來為每個程式優化**並儲存在

dalvik

快取中。這樣,所有程式在執行時都會使用優化過的**。這就是當你刷乙個新

rom時,有時候第一次啟動時間非常非常長的原因。當乙個程式(或者框架庫)發生變更,

dalvikvm

將會重新優化**並且再次將其存在快取中。在

cache/dalvik-cache

是存放system

上的程式生成的

dex檔案,而

data/dalvik-cache

則是存放

生成的dex

檔案。而做deodex的,會在

cache/dalvik-cache

是產生存放

system

上的程式生成的

dex檔案

所謂odex,是由

android軟體中的classes.dex生成的,odex化即是把那個檔案預先提取出來作用是能加快軟體載入速度和開機速度。不過odex也有缺點,那就是有時候加刷東西會出現問題。看懂了嗎?

我的理解,簡單說,原本系統每次執行apk都需要先提取一部分出來,而odex化就是現在你提前把它提取出來了。系統啟動或者程式執行加快的原因也就在此。而由於提取了odex出來,會占用一部分儲存空間,所以做odex化的時候需要考慮空間方面的問題。

odex的優點:

1.刷完機首次進入系統的時間會縮短一些。檔案的執行速度應該也有所提公升。

2.apk檔案不能單獨安裝,並且如果反編譯apk檔案,一般也只能得到資源檔案。可以說是起到一定的保護作用,

避免被肆意修改和使用。這樣做可以使其廠商保證一定的反盜版,因為沒有沒有dex檔案的apk是無法正常安裝的。

3.會增加一些可安裝應用的空間,雖然不是很多。(這個我沒發現)

odex的缺點:

1.不方便修改rom以及檔案本身。

2.增加rom包的體積,雖然不是很多。

3.當你公升級某個被odex的應用後,這個應用將會出現故障,最常見的就是fc。

二:手機某個apk需要生成odex和不需要生成的方法為

local_dex_preopt := ture

local_dex_preopt := false

三:手機提公升按照apk速度的修改,但是會引發一些第三方apk應用過程出問題現在,值得關注

device/mediatek/common/device.mk

+#product_property_overrides += \

+#  dalvik.vm.dex2oat-filter=interpret-only \

+#  dalvik.vm.image-dex2oat-filter=speed

四:手機如何編譯的時候提取odex檔案

1 預編譯提取apk的odex檔案,請在boardconfig.mk中定義:

with_dexpreopt := true

開啟這個巨集之後,無論是有原始碼還是無原始碼的預置apk預編譯時都會提取odex檔案。

(如有發現user版本未提取odex,請檢查device.mk檔案配置:

ifeq ($(target_build_variant),user)

with_dexpreopt := true

dont_dexpreopt_prebuilts := true  //此句注釋掉

endif 

)對於64bit的晶元,若apk只有32bit的lib或者只能作為32bit執行,請在預置apk時在android.mk中新增下邊的tag標記此apk為32bit:

local_multilib :=32

2 若需要在預編譯時跳過一些apk的odex提取,可以使用下邊的方法:

\build\core\dex_preopt_odex_install.mk中新增:

ifeq ($(local_module),helloworld)

local_dex_preopt:=

endif

build_odex:=

installed_odex:=

....

ifeq包起來的部分為需要新增的,helloworld可替換為需要跳過提取odex的apk的local_module名字

注意:開啟with_dexpreopt 的後,預置太多apk,會導致system.img 過大,而編譯不過。遇到這種情況請調大system.img的大小限制。

-------------------  more in   android n   ----------------------

n版本當中如果預置了gms包,則對無原始碼的apk不做預編譯處理。如果需要都做,需要在如下**做修改:

路徑:/device/mediatek/common/boardconfig.mk

......

ifeq ($(build_gms),yes)

dont_dexpreopt_prebuilts := true   ------------------>請把此處關掉,即賦值false。

else

ifeq ($(target_build_variant),userdebug)

dex_preopt_default := nostripping

endif

endif

......

修改完後,dex2oat操作即在編譯時完成,不會影響開機時間。

補充說明:android n中平台新增該特性,是因為with_dexpreopt := true開啟這個之後,就會將有原始碼以及無原始碼的所有預置apk在host上做預編譯並且塞到system partition中。

但由於內部project storage size的限制,這些預置apk做完dexpreopt之後會超過system partition的size. 因此選擇乙個折中方案,即加上限制,

對於無原始碼的apk(ex: gms)不做dexpreopt的行為。如果客戶的system partition足夠大塞的下這些預編譯完的內容,可以把這段**拿掉也不會有什麼影響。

yield生成器 提公升速度

記住乙個原則在python中能簡單就做到最簡單。這是修改後的 sample eval open config.trainsample read 這是修改前的具有相同含義的 f open config.trainsample,r readlines s f 0 count 0 li re.findal...

Vivado 提公升mcs的配置速度

問題表現 使用vivado生成mcs檔案後,將其配置到flash的過程耗時過長。解決方法 1 佈線完成後,開啟open implementation 2 在settings中,點選bitstream,之後點選configure additional bitstream settings 3 在con...

提公升筆劃輸入法的速度

登錄檔 hkey current user controlpanel accessibility 修改這兩個字串 chartimeout 和 holdtimeout chartimeout值是英文輸入法的待選時間 就是按鍵後出現所按鍵的首字母並且下面有橫線,這時可以多次按鍵選擇次字母 第三字母的時間...