如何編譯APK
在原始碼環境下,使用mm命令編譯module,APK會輸出到out/target/product/product_name目錄下。
mm -B:強制重新編譯,相當於clean後再編譯。
Dalvik與ART的區別
Dalvik
JIT(Just-in-time)實時編譯,執行的時候將位元組碼翻譯成機器碼,所執行的目標(dex)與硬體平臺無關,APP執行效率低。
ART
AOT(Ahead-Of-Time,預先編譯),執行前將位元組碼翻譯成機器碼,所執行的目標檔案(oat)與硬體平臺相關。APP執行效率高,但是會佔用空間,APK安裝所需時間增加。
odex是幹什麼的
dalvik時代:apk執行的時候,會把Apk中的classes.dex解壓出來並通過dexopt優化為.odex檔案。快取在/data/dalvick-cache目錄下,提高後續執行的效率。
ART時代:APK安裝的時候,會把APK中的classes.dex解壓後,通過dex2oat工具轉換為.odex檔案(ELF格式),儲存在apk所在的目錄的oat目錄下。
編譯APK的過程
1、進入AOSP系統App目錄,下面以Calculator為例
cd android6.0/packages/apps/Calculator複製程式碼
2、在sublime中開啟該專案
subl .複製程式碼
3、查詢需要修改的檔案,這裡以Calculator.java為例
Ctrl+P複製程式碼
然後輸入Calculator.java
4、查詢需要修改的方法,這裡以onCreate方法為例
Ctrl+P複製程式碼
然後在輸入@onCreate
5、進行程式碼的修改並且儲存該檔案,在onCreate方法中加一個log
Log.wtf("hpp", "this is my first log");複製程式碼
6、進行命令執行下面命令編譯該專案
mm複製程式碼
7、編譯完成之後,通過Install:關鍵字定位編譯輸出的檔案
我們可以看到生成了一個Calculator.apk 和 一個Calculator.odex
進入這兩個檔案所在的目錄
nautilus $(gettop)/out/target/product/generic/system/app/Calculator/Calculator.apk複製程式碼
我們會發現Calculator.apk檔案中只有資原始檔沒有程式碼,程式碼其實就是這個單獨的Calculator.odex。
為什麼在原始碼環境下編譯會單獨得到odex檔案
優點:
1、降低系統更新後啟動的時間
為odex的Rom。首次開機的過程會執行odex操作,編譯時做,開機的時候就不用做了。
2、減少在裝置上進行odex操作所造成的空間浪費
編譯時,dexopt/dex2oat,會直接將APK的資源與程式碼拆開,如果在裝置上安裝時dexopt/dex2oat,apk的大小不會減少,但又會多一個odex檔案佔據磁碟空間。
缺點:
1、增加開發時編譯的時間
2、不能直接執行APK的install操作,需要將APK和odex都sync到裝置上。
如何在開發階段關閉dex2oat
- 在當前的module的Android.mk裡面關閉,在inclue $(BUILD_PACKAGE)之前加上下面程式碼
LOCAL_DEX_PREOPT = false複製程式碼
- 在buid/core/main.mk中關閉所有module的dex優化
## eng ##
ifeq ($(TARGET_BUILD_VARIANT), eng)
tags_to_install := debug eng
# 關閉odex優化
WITH_DEXPREOPT := false複製程式碼
安裝編譯後的APK
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