APK構(gòu)建流程

1.總述 apk打包總體流程

apk打包流程

2.工具列表

工具 描述
aapt Android資源打包工具
aidl Android接口描述語言轉(zhuǎn)化為跨進程通信.java文件的工具
javac Java編譯器
proguard 代碼混淆工具
dx/d8 轉(zhuǎn)化.class文件為Dalvik VM能識別的.dex文件
apkbuilder 打包生成apk包
jarsigner 簽名工具
zipalign 字節(jié)碼對齊優(yōu)化工具

3.資源文件編譯

aapt:Android Asset Packaging Tool
資源合并流程
資源文件編譯

生成res資源,AndroidManifest文件,assets資源

  • 生成R.java文件。賦予每一個非assets資源一個ID值,以常量的形式定義于R.java文件中
public final class R {
    private R()

    public static final class anim{...}
    public static final class attr{...}
    public static final class bool{...}
    public static final class color{...}
    public static final class dimen{...}
    public static final class drawable{...}
    public static final class id{...}
    public static final class integer{...}
    public static final class layout{...}
    public static final class string{...}
    public static final class style{...}
}
例
R.string.appname = 0x7f07006b
package_id(資源包) -- 0x7f
style_id(String類型) -- 07
index_id(當前類型中的序號) -- 006b
  • 生成resources.arsc文件,用來描述那些具有ID值的資源的配置信息,它的內(nèi)容就相當于是一個資源索引表。包含了所有的id值的數(shù)據(jù)集合。在該文件中,如果某個id對應的是string,那么該文件會直接包含該值,如果id對應的資源是某個layout或者drawable資源,那么該文件會存入對應資源的路徑。
    可以通過Analyze apk功能查看resource.arsc的文件結(jié)構(gòu):


    resource.arsc文件結(jié)構(gòu)

4. aidl文件編譯

  • aidl工具解析接口定義文件,然后生成響應的Java代碼接口供程序調(diào)用。如果在項目沒有使用到aidl文件,則可以跳過這一步。
  • 輸入:aidl后綴的文件,位于工程src/main/aidl目錄
  • 輸出:可用于進程通信的C/S端java代碼,位于build/generated/source/aidl/

5. java源碼編譯

  • R.java和aidl生成的java文件,再加上工程的源代碼,使用javac編譯生成class文件
  • 輸入:java源碼文件夾(另外還包括了aapt生成的R.java,aidl生成的java文件,以及BuildConfig.java)
  • 輸出:對于gradle編譯,生成的class文件保存在build/intermediates/classes/

6. proguard代碼混淆

  • javac完成代碼編譯后,一般還會對源碼進行混淆,類似于加密,目的是增加反編譯的難度,同時也將代碼名稱進行縮短,減少代碼占用體積
  • 輸入:編譯后的.class文件,混淆規(guī)則配置文件proguard-rules.pro
  • 輸出:被混淆后的.class文件,混淆前后的映射文件

7. 轉(zhuǎn)換為DEX文件

  • dx工具生成可供Android系統(tǒng)虛擬機可以執(zhí)行的classes.dex文件。dx會將class轉(zhuǎn)換為Dalvik字節(jié)碼,生成常量池,消除冗余數(shù)據(jù)等
  • 輸入:所有的.class文件
  • 輸出:classes.dex文件


    dex輸入輸出圖示

8.打包apk文件

  • 打包生成apk文件。舊的apkbuilder腳本已經(jīng)廢棄,現(xiàn)在通過sdklib.jar的ApkBuilder類進行打包
  • 輸入:.ap_資源包文件,class.dex文件,未變異的資源文件(asset資源等),libs等文件
  • 輸出:apk文件

9.簽名apk文件

  • 對apk文件進行簽名,簽名后才能在設備上進行安裝
  • 輸入:上一步中生成的.apk文件、簽名文件(Debug or Release Keystore)
  • 輸出:簽名后的apk文件

10.zipalign優(yōu)化

  • zipalign對簽名后的apk文件進行對齊處理,使apk中所有資源文件距離文件起始偏移為4字節(jié)的整數(shù)倍,從而在通過內(nèi)存映射訪問apk文件時會更快,同事也減少了在設備上運行時的內(nèi)存消耗
  • 輸入:簽名后的apk文件
  • 輸出:對齊優(yōu)化的apk文件

APK典型文件包含

  • AndroidManifest.xml 程序全局配置文件
  • classes.dex Dalvik字節(jié)碼
  • resources.arsc 資源索引表
  • META-INF 該目錄下存放的是簽名信息
  • res 該目錄存放資源文件
  • assets 該目錄可以存放一些配置或資源文件
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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