android打包流程

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
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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容