APK構建流程

APK構建流程

在這裏插入圖片描述

  1. aapt 編譯資源文件生成 R.java 並打包資源文件
  2. Java compiler Java編譯器 編譯Java代碼與aidl 成.class文件
  3. dex工具把.class文件編譯成.dex文件
  4. apkbuilder 把上面的文件打包成.apk包
  5. jarsigner給apk包簽名
  6. zipalign 字節碼優化

aapt/aapt2:Android資源打包工具(Android sdk 下build-tools/27.0.2/下)全稱:Android Asses Packaging Tool
aidl:Android接口描述語言轉化爲跨進程通信.java文件的工具
javac:Java編譯期
proguard:代碼混淆工具
dx/d8:轉化.class文件爲Davik VM能識別的.dex文件
apkbuilder:打包生成apk包
jarsigner:簽名工具
zipalign:字節碼對齊優化工具

aapt

Android資源打包工具(Android sdk 下build-tools/27.0.2/下)全稱:Android Asses Packaging Tool

資源合併

在這裏插入圖片描述

資源文件編譯

在這裏插入圖片描述

res資源
  • 生成R.java文件。賦予每一個非assets資源一個ID值,以牀涼的形式定義於R.java 文件中。
  • 生成resources.arsc文件,用來描述那些具有ID資源的配置信息,它的內容就相當於是一個資源索引表。包含了所有的ID值的數據集合。在該文件中,如果某個ID對應的是String,那麼該文件會直接包含該值,如果ID對應的資源是某個layout或者drawable資源,那麼該文件會存入對應資源的路徑

R.java 結構圖如下:
在這裏插入圖片描述

R.String.appname =0x7f0f0000;
0x7f代表的是正在編譯的資源包
0f代表的是string類型,這個0f不是一成不變的
0000代表的是該字符串序號 0000是第一個字符串

resource.arsc文件(通過Android Studio Analyze apk功能查看resource.arsc 文件結構如下,從圖中我們可以得出結論,resource.arsc就是一個資源索引表)
在這裏插入圖片描述

AndroidManifest文件

AndroidManifest文件是Android應用的全局配置文件,包名,權限,各種組件,版本號等等,編輯爲一個二進制的xml文件

assets資源

是直接打包進apk的 如下圖

aidl文件編譯

aidl:Android Interface Definition Language

  • aidl工具解析接口定義文件,然後生成相應的Java代碼接口提供程序調用。如果在項目沒有使用到aidl文件,則可以跳過這一步。
  • 輸入:aidl後綴的文件,位於工程src/main/aidl目錄。
  • 輸出:可用於進程通信的C/S端Java代碼,位於build/generated/source/aidl
Java源碼編譯
  • R.java和aidl生成的Java文件,再加上工程的源代碼,使用javac編譯生成class文件。
  • 輸入:java源碼文件夾(另外還包括了aapt生成的R.java,aidl生成的Java 文件,已經BuildConfig.java)
  • 輸出:對於gradle編譯,生成的class文件保存在build/intermediates/classes。
proguard 代碼混淆
  • javac完成代碼編譯後,一般還會對源碼進行混淆,類似於加密,目的是爲了增加反編譯的難度,同時也將代碼名稱進行縮短,減少代碼佔用體積。
  • 輸入:編譯後的.class文件,混淆規則配置嗯就proguard-rules.pro
  • 輸出:被混淆後的.class文件,混淆前後的映射文件。
轉換爲DEX文件
  • dx工具生成可供Android系統虛擬機可以執行的classes.dex文件,dx會將class轉換爲Dalvik字節碼,生成常量池,消除冗餘數據等。
  • 輸入:所有的.class文件。
  • 輸出:classes.dex文件。
打包apk文件
  • 打包生成apk文件,舊的apkbuilder腳本已經廢棄,現在通過sdklib.jar的ApkBuilder類進行打包。
  • 輸入:.ap_資源包文件,classes.dex文件,未編譯的資源文件(assets資源等),libs等文件。
  • 輸出:apk文件
簽名apk文件
  • 對apk文件進行簽名,簽名後才能在設備上進行安裝。
  • 輸入:上一步中生成.apk文件,簽名文件(debug or Release Keystore)。
  • 輸出:簽名後apk文件。
zipalign優化
  • zipalign對簽名後的apk文件進行類對齊處理,使apk中所有資源文件巨雷文件起始偏移爲4字節的整數倍,從而在通過內存映射訪問apk文件時更快。同時也減少類在設備上運行時的內存消耗。
  • 輸入:簽名後的apk文件
  • 輸出:對齊優化的apk文件

APK典型文件

  • AndroidManifest.xml 程序全局配置文件
  • classes.dex Dalvik字節碼
  • resources.arsc 資源索引表
  • META-INF 該目錄下存放的是簽名信息
  • res 該目錄下存放資源文件
  • assets 該目錄可以存放一些配置或資源文件