Android開發 —— apk打包流程

waynelu92發表於2017-03-31

0. 前言

apk 全稱是Android應用程式包(Android application package),一種能被Android系統識別並執行的檔案格式。

apk 檔案基於 zip 檔案格式,它與 jar 檔案的構造方式相似。


在總結 apk 的打包流程之前,先要了解一下一個 apk包 究竟有哪些檔案:

  • classes.dex 檔案:java原始檔經過編譯和轉換後生成的二進位制的位元組碼檔案。
  • resource.arsc 檔案:經過 aapt 編譯後的二進位制的資原始檔。
  • AndroidManifest.xml 檔案:經過 aapt 編譯後的二進位制的 xml 檔案。
  • res 資料夾:除圖片和 res/raw 資料夾下的檔案外,其餘的 xml 檔案都被 aapt 編譯成二進位制的 xml 檔案。
  • assets 資料夾(可選):存放不進行編譯的原生檔案,可以是一些圖片,或者是html、js、css檔案。
  • lib 資料夾(可選):存放應用程式依賴的 native 庫檔案,一般是用 c/c++ 編寫,如 so 檔案。
  • META-INF 資料夾:存放簽名資訊。


1. 官方流程圖



2. apk 的打包流程

Android Studio中,打包工具主要位於 sdk/build-tools/版本號/ 目錄下。


#1 打包資原始檔,生成相應的 R.java 檔案

【工具】aapt(Android Asset Package Tool)

【輸入】res 資料夾,assets 資料夾,AndroidManifest.xml 檔案

【輸出】R.java,二進位制的 resource.arsc ,res 資料夾(包括二進位制的 xml 檔案以及 沒有改變的圖片和 res/raw 下的檔案),

沒有改變的 assets 資料夾,二進位制的 AndroidManifest.xml 檔案


#2 處理 aidl 檔案,生成相應的 java 檔案

【工具】aidl(Android Interface Denifition Language)

【輸入】aidl檔案

【輸出】相應的 java 介面檔案


#3 編譯所有的 java 檔案,生成 class 檔案

【工具】javac(java 編譯器)

【輸入】R.java,java介面檔案,java原始檔

【輸出】class檔案


#4 把class檔案轉換成dex檔案

【工具】dx.bat

【輸入】class檔案,第三方庫檔案.jar(jar包中大都是class檔案)

【輸出】classes.dex檔案


#5 打包生成apk檔案

【工具】apkbuilder(主要用到的是sdk/tools/lib/sdklib.jar檔案中的ApkBuilderMain類)

【輸入】resource.arsc檔案,AndroidManifest.xml檔案,res資料夾,assets資料夾,classes.dex檔案

【輸出】apk檔案


#6 對apk檔案進行簽名

【工具】apksigner

【輸入】未簽名的apk檔案

【輸出】簽名的apk檔案


#7 對簽名後的apk檔案進行對齊處理

【工具】zipalign

【輸入】簽名的apk檔案

【輸出】最終的apk檔案

注:如果是release版本,需要對apk檔案進行對齊處理。

對齊處理使得apk包中的所有資原始檔距離檔案起始偏移為4位元組整數倍,這樣通過記憶體對映訪問apk檔案時的速度更快,同時減少執行時記憶體的使用。


3. 詳細流程圖


相關文章