android打包流程

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
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容