summary
build-process
- 編譯src文件,生成class文件
- 將class文件編譯成為dex文件
- 編譯資源文件(不包括assets,raw和so等文件),生成R文件
- 將上述的兩個以及一些依賴進行聯合編譯成為一個apk
- 壓平
- 簽名(debug,release)
- debug:default
- release:生成一個keystore文件
class->dex
class:基于棧
dex:基于寄存器

difference_between_class_dex
1、優化常量池;
2、基于寄存器更容易操作硬件內容,適合移動端
detail
build-process-detail
資源打包系統
二進制格式的XML文件占用空間更小。
這是由于所有XML元素的標簽、屬性名稱、屬性值和內容所涉及到的字符串都會被統一收集到一個字符串資源池中去,并且會去重。有了這個字符串資源池,原來使用字符串的地方就會被替換成一個索引到字符串資源池的整數值,從而可以減少文件的大小。
二進制格式的XML文件解析速度更快。
這是由于二進制格式的XML元素里面不再包含有字符串值,因此就避免了進行字符串解析,從而提高速度。
小結
- 除了assets和res/raw資源被原裝不動地打包進APK之外,其它的資源都會被編譯或者處理;
- 除了assets資源之外,其它的資源都會被賦予一個資源ID;
- 打包工具負責編譯和打包資源,編譯完成之后,會生成一個resources.arsc文件和一個R.java,前者保存的是一個資源索引表,后者定義了各個資源ID常量。
- 應用程序配置文件AndroidManifest.xml同樣會被編譯成二進制的XML文件,然后再打包到APK里面去。
- 應用程序在運行時通過AssetManager來訪問資源,或通過資源ID來訪問,或通過文件名來訪問。
how to package a apk by hand
- 創建一個android工程
android create project \
-n packageTest2 \
-a MainActivity \
-k com.package.test2 \
-t android-23 \
-p ./PackageTest2
- 編譯R文件
aapt package \
-f \
-J ./gen \
-M ./AndroidManifest.xml \
-S ./res/ \
-I /Users/RadAsm/Library/AndroidSDK/sdk/platforms/android-23/android.jar
- 編譯源代碼文件
javac -source 1.6 \
-target 1.6 \
-cp /Users/RadAsm/Library/AndroidSDK/sdk/platforms/android-23/android.jar \
./src/com/packtest/test1/MainActivity.java ./src/com/packtest/test1/R.java \
-d ./gen/classes
- class->dex
dx --dex \
--verbose \
--output ./gen/dex/packtest1.dex
./gen/classes/
- apk生成
aapt package
-f \
-J ./gen \
-M ./AndroidManifest.xml \
-S ./res/ \
-I /Users/RadAsm/Library/AndroidSDK/sdk/platforms/android-23/android.jar \
-F ./output/res.apk
- 對齊
zipalign -v -p 4 packagetest_unsigned.apk packagetest_aligned_unsigned.apk
- 簽名
apksigner sign --ks my-release-key.jks my-app.apk