APK打包流程

APK結構

apk結構

apk是一個壓縮包,裏面有lib,META-INF,classes.dex,res,resources.arsc文件夾和文件。下面看看它們各自的作用。

名稱 內容 詳細
lib 放的是so動態鏈接庫 apk打包不需要處理的動態庫
META-INF 簽名文件夾 三個簽名證書(MANIFEST.MF、CERT.SF、CERT.RSA)。MANIFEST.MF文件是對每個文件的SHA-256-Digest;CERT.SF是對每個文件的頭3行進行SHA-256-Digest;CERT.RSA這個文件保存了簽名和公鑰證書。
classes.dex 執行文件 java編譯後的Android可執行的dex文件
AndroidManifest.xml 聲明文件 記錄應用的名字、版本、權限、引用的庫文件等信息
res 資源文件 有animator,anim,color,drawable,layout,menu,raw等文件夾
resources.arsc 編譯後的二進制資源文件 記錄了所有的應用程序資源目錄的信息,包括每一個資源名稱、類型、值、ID以及所配置的維度信息。 這是一個索引文件。

初略流程

build
谷歌官方給出的打包流程圖。
先是把代碼編譯成Dex,然後是和資源文件整合成一個APK,再者加簽名,最後出來之前還要用zipalign工具優化一下。

細化流程

詳細打包流程
上面這個圖主要是有7個打包流程。

1.打包資源文件,生成R.java文件

aapt來打包res資源文件,生成R.java、resources.arsc和res文件。

  • res目錄
文件 描述
animator 放屬性動畫
anim 放補間動畫
color 顏色資源
drawable 存放XML、Bitmap文件,或者.png, .9.png, .jpg, .gif文件等圖像資源。打包過程中可能會被優化,比如色彩數可能會被優化,256色變8色。
layout 佈局資源,佈局的xml文件。
menu 應用程序菜單
raw 直接複製到設備中的任意文件。用參數是資源的ID調用,R.raw.somefilename。和assets 不同的是,raw下面不能有目錄,而和assets可以有目錄。
values 數值XML文件用來描述數組、顏色、尺寸、字符串和樣式值等
xml 應用配置信息
  • R.java文件
    R.java是我們在編寫代碼的時候會用到的,裏面有靜態內部類,資源等。
  • resources.arsc文件
    resources.arsc這個文件記錄了所有的應用程序資源目錄的信息,包括每一個資源名稱、類型、值、ID以及所配置的維度信息。是一個資源索引表,在給定資源ID和設備配置信息的情況下能快速找到資源。

2.處理aidl文件,生成相應的Java文件

aidl(Android Interface Definition Language,Android接口描述語言),位於android-sdk/platform-tools目錄下。aidl工具解析接口定義文件然後生成相應的Java代碼接口供程序調用。如果項目沒用到aidl則跳過這一步。

3.編譯項目源代碼,生成class文件

Java Compiler階段。項目中所有的Java代碼,包括R.java和.aidl文件,都會變Java編譯器(javac)編譯成.class文件,生成的class文件位於工程中的bin/classes目錄下。

4.轉換所有的class文件,生成classes.dex文件

dex階段。通過dx工具,將.class文件和第三方庫中的.class文件處理生成classes.dex文件。該工具位於android-sdk/platform-tools 目錄下。dx工具的主要工作是將Java字節碼轉成成Dalvik字節碼、壓縮常量池、消除冗餘信息等。

5.打包生成APK文件

apkbuilder階段。通過apkbuilder工具,將aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk。打包的工具apkbuilder位於 android-sdk/tools目錄下。

6.對APK文件進行簽名

Jarsigner階段。通過Jarsigner工具,對上面的apk進行debug或release簽名。

7. 對簽名後的APK文件進行對齊處理

通過zipalign工具,將簽名後的apk進行對齊處理。工具位於android-sdk/tools目錄下。對齊的主要過程是將APK包中所有的資源文件距離文件起始偏移爲4字節整數倍,這樣通過內存映射訪問apk文件時的速度會更快。對齊的作用就是減少運行時內存的使用。

總結一下

詳細打包流程。
詳細打包流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章