Android編譯流程
通過之前兩篇文章,我們已經大致瞭解了編譯相關的Gradle,它們的編譯流程如下圖所示,這篇文章我們來通過手動編譯的方式,來模擬Gradle 編譯Android APK文件。
手動編譯APK
從這裏,我們就要開始手動編譯Apk文件了。
創建一個Android項目
首先,我們要有一個Android項目,爲了更簡單,我去除了多餘的代碼,我們編譯的時候,可以直接使用該項目。
下載地址 Android 手動編譯APK-代碼資源下載
創建build文件夾
我們把下載好的項目解壓,然後使用cmd,進入其app目錄下,然後創建build文件夾
mkdir build
編譯資源
aapt2 compile -o build/res.zip --dir src/main/res
然後,會生成一個zip文件
我們打開這個zip文件,可以看到所有資源已經被打包成了.flat格式
對資源進行鏈接
aapt2 link build/res.zip -I C:\Developer\Android\SDK\platforms\android-29\android.jar --java build --manifest src\main\AndroidManifest.xml -o build\app-debug.apk
執行後,可以看到生成了app-debug.apk
在com文件夾裏,還有R.java文件
來看下R.java
然後,我們把R.java賦值到我們項目代碼中,這樣就不用再導包了。
編譯java文件
javac -d build -cp C:/Developer/Android/SDK/platforms/android-29/android.jar src/main/java/com/heiko/mytest/*.java
這樣我們就得到了class字節碼文件
Java 代碼是由 javac 編譯的,Kotlin 代碼是由 kotlinc 編譯的
生成Dex文件
可以用老的dx編譯器,也可以用新的d8編譯器。
這裏我們用d8編譯器。
d8 --output build --lib C:/Developer/Android/SDK/platforms/android-29/android.jar build/com/heiko/mytest/*.class
這樣,我們就生成了dex文件
將dex文件放入apk文件中
我們要調用zip命令,這裏的zip也就是我們常用的解壓縮軟件,不過要通過命令行使用,我們需要先配置到環境變量中。
詳見【終端】“zip不是內部或外部命令,也不是可執行程序”詳細解決辦法
zip -j build/app-debug.apk build/classes.dex
可以看到,新的app-deblug.apk文件,比原來要大一點
我們看下其內部,可以看到dex文件已經在裏面了
生成簽名
這個時候,apk文件中的內容還少META-INF
,也就是簽名信息。
這裏我們可以使用debug簽名,密碼是固定的android
apksigner sign -ks C:\Users\Heiko\.android\debug.keystore build/app-debug.apk
我們再來看下app-debug.apk
可以看到,已經有META-INF
文件夾了。
安裝apk
最後,我們把apk安裝到手機上,可以看到,正常運行成功 !
至此,我們手動編譯APK就成功了 !
Android 編譯流程解析系列
Android 編譯流程解析01-AppPlugin初始化
Android 編譯流程解析02-相關Task解析
Android 編譯流程解析03-手動編譯Apk