summary

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

difference_between_class_dex
1、優(yōu)化常量池;
2、基于寄存器更容易操作硬件內(nèi)容,適合移動(dòng)端
detail

build-process-detail
資源打包系統(tǒng)
二進(jìn)制格式的XML文件占用空間更小。
這是由于所有XML元素的標(biāo)簽、屬性名稱、屬性值和內(nèi)容所涉及到的字符串都會(huì)被統(tǒng)一收集到一個(gè)字符串資源池中去,并且會(huì)去重。有了這個(gè)字符串資源池,原來使用字符串的地方就會(huì)被替換成一個(gè)索引到字符串資源池的整數(shù)值,從而可以減少文件的大小。
二進(jìn)制格式的XML文件解析速度更快。
這是由于二進(jìn)制格式的XML元素里面不再包含有字符串值,因此就避免了進(jìn)行字符串解析,從而提高速度。
小結(jié)
- 除了assets和res/raw資源被原裝不動(dòng)地打包進(jìn)APK之外,其它的資源都會(huì)被編譯或者處理;
- 除了assets資源之外,其它的資源都會(huì)被賦予一個(gè)資源ID;
- 打包工具負(fù)責(zé)編譯和打包資源,編譯完成之后,會(huì)生成一個(gè)resources.arsc文件和一個(gè)R.java,前者保存的是一個(gè)資源索引表,后者定義了各個(gè)資源ID常量。
- 應(yīng)用程序配置文件AndroidManifest.xml同樣會(huì)被編譯成二進(jìn)制的XML文件,然后再打包到APK里面去。
- 應(yīng)用程序在運(yùn)行時(shí)通過AssetManager來訪問資源,或通過資源ID來訪問,或通過文件名來訪問。
how to package a apk by hand
- 創(chuàng)建一個(gè)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