在源碼環境下,使用mm命令編譯module,APK會輸出到out/target/product/product_name目錄下。java
mm -B:強制從新編譯,至關於clean後再編譯。android
Dalvik緩存
JIT(Just-in-time)實時編譯,運行的時候將字節碼翻譯成機器碼,所運行的目標(dex)與硬件平臺無關,APP運行效率低。
bash
ARTapp
AOT(Ahead-Of-Time,預先編譯),運行前將字節碼翻譯成機器碼,所運行的目標文件(oat)與硬件平臺相關。APP運行效率高,可是會佔用空間,APK安裝所需時間增長。
工具
odex是幹什麼的優化
dalvik時代:apk運行的時候,會把Apk中的classes.dex解壓出來並經過dexopt優化爲.odex文件。緩存在/data/dalvick-cache目錄下,提升後續執行的效率。ui
ART時代:APK安裝的時候,會把APK中的classes.dex解壓後,經過dex2oat工具轉換爲.odex文件(ELF格式),存儲在apk所在的目錄的oat目錄下。this
一、進入AOSP系統App目錄,下面以Calculator爲例spa
cd android6.0/packages/apps/Calculator複製代碼
二、在sublime中打開該項目
subl .複製代碼
三、查找須要修改的文件,這裏以Calculator.java爲例
Ctrl+P複製代碼
而後輸入Calculator.java
四、查找須要修改的方法,這裏以onCreate方法爲例
Ctrl+P複製代碼
而後在輸入@onCreate
五、進行代碼的修改而且保存該文件,在onCreate方法中加一個log
Log.wtf("hpp", "this is my first log");複製代碼
六、進行命令執行下面命令編譯該項目
mm複製代碼
七、編譯完成以後,經過Install:關鍵字定位編譯輸出的文件
咱們能夠看到生成了一個Calculator.apk 和 一個Calculator.odex
進入這兩個文件所在的目錄
nautilus $(gettop)/out/target/product/generic/system/app/Calculator/Calculator.apk複製代碼
咱們會發現Calculator.apk文件中只有資源文件沒有代碼,代碼其實就是這個單獨的Calculator.odex。
優勢:
一、下降系統更新後啓動的時間
爲odex的Rom。首次開機的過程會執行odex操做,編譯時作,開機的時候就不用作了。
二、減小在設備上進行odex操做所形成的空間浪費
編譯時,dexopt/dex2oat,會直接將APK的資源與代碼拆開,若是在設備上安裝時dexopt/dex2oat,apk的大小不會減小,但又會多一個odex文件佔據磁盤空間。
缺點:
一、增長開發時編譯的時間
二、不能直接執行APK的install操做,須要將APK和odex都sync到設備上。
LOCAL_DEX_PREOPT = false複製代碼
## eng ##
ifeq ($(TARGET_BUILD_VARIANT), eng)
tags_to_install := debug eng
# 關閉odex優化
WITH_DEXPREOPT := false複製代碼
adb install -r $(gettop)/out/target/product/generic/system/app/Calculator/Calculator.apk複製代碼
運行Calculator應用,過濾log
adb logcat -s 'hpp'複製代碼
參考視頻:
https://www.365yg.com/i6436850885292196353#mid=1565254704995330
https://www.365yg.com/i6436851843262841346/#mid=1565254704995330
https://www.365yg.com/i6436852898566504962/#mid=1565254704995330
https://www.365yg.com/i6436853799767245314/#mid=1565254704995330