Android APK文件(1、編譯打包過程)

很是經典的一張圖,比較容易理解。 java

1. aapt

使用aapt來打包res資源文件,生成R.java、resources.arsc和res文件。 Android Gradle插件3.0.0及更高版本默認狀況下會啓用 AAPT2,其目錄在 sdk/platform-tools/aapt2.android

詳情能夠查看aapt工具的使用:developer.android.google.cn/studio/comm…數組

R.java

全部的資源項以及其id,都會在R.java文件裏。 R.java裏每個資源類別對應一個內部類。bash

res文件

res文件有9種目錄,因爲版本、語言、屏幕等的適配,不少目錄都有相適配的文件。 好比:工具

  • 版本layout-v22
  • 尺寸layout-sw600dp
  • 語言values-zh

目錄以下:佈局

  • animatorpost

    這類資源以XML文件保存在res/animator目錄下,用來描述屬性動畫。gradle

  • anim動畫

    這類資源以XML文件保存在res/anim目錄下,用來描述補間動畫。ui

  • color

    這類資源以XML文件保存在res/color目錄下,用描述對象顏色狀態選擇。

  • drawable

    這類資源以XML或者Bitmap文件保存在res/drawable目錄下,用來描述可繪製對象。例如,咱們能夠在裏面放置一些圖片(.png, .9.png, .jpg, .gif),來做爲程序界面視圖的背景圖。

  • layout

    這類資源以XML文件保存在res/layout目錄下,用來描述應用程序界面佈局。

  • menu

    這類資源以XML文件保存在res/menu目錄下,用來描述應用程序菜單。

  • raw

    這類資源以任意格式的文件保存在res/raw目錄下,它們和assets類資源同樣,都是原裝不動地打包在apk文件中的,不過它們會被賦予資源ID,這樣咱們就能夠在程序中經過ID來訪問它們。

    Resources res = getResources();  
    InputStream is = res.openRawResource(R.raw.xxx)
    複製代碼
  • values

    這類資源以XML文件保存在res/values目錄下,用來描述一些簡單值,例如,數組、顏色、尺寸、字符串和樣式等,通常來講,這六種不一樣的值分別保存在名稱爲arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。 -xml

    這類資源以XML文件保存在res/xml目錄下,通常就是用來描述應用程序的配置信息。

resources.arsc

資源索引表, 記錄資源文件和資源ID之間的映射關係。

Android的開發是分模塊的,res目錄專門用來存放資源文件,當在代碼中須要調用資源文件時,只須要調用findviewbyId()就能夠獲得資源文件,每當在res文件夾下放一個文件,aapt就會自動生成對應的ID保存在.R文件,咱們調用這個ID就能夠,可是隻有這個ID還不夠,.R文件只是保證編譯程序不報錯,實際上在程序運行時,系統要根據ID去尋找對應的資源路徑,而resources.arsc文件就是用來記錄這些ID和資源文件位置對應關係的文件。

2. aidl生成Java文件

AIDL是Android Interface Definition Language 的簡稱,是Android跨進程通信的一種方式。

檢索工程裏全部的aidl文件,並轉換爲對應的Java文件。

3. javaCompiler階段

將全部.java文件(包括R文件和AIDL生成的.java文件),經過 javac 工具生成class文件。

4. dex階段

將生成的.class文件和第三方庫的.class文件經過dx工具生成classes.dex文件(若是有分包,那麼可能有多個)。

目前的gradle multi-dex編譯方式會生成classes2.dex ... classesN.dex。

5. apkBuilder階段

aapt階段中的資源文件、dex文件和第三方的非java資源包(.so),經過 apkbuilder 工具生成未簽名的apk包。

沒有編譯的資源(如 res/raw、images等)、Other Resources(assets文件)、編譯過的資源 、.dex文件 、resources.arsc 和 AndroidManifest.xml 都會被apkbuilder工具打包到最終的.apk文件中。

須要注意的是:

  • res/raw和assets的相同點:

    • 二者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。
  • res/raw和assets的不一樣點:

    • res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候須要AssetManager類。
    • res/raw不能夠有自定義的目錄結構,而assets則能夠有目錄結構,也就是assets目錄下能夠再創建文件夾。

6. jarSigner階段

簽名,經過jarsigner工具,若是是debug模式用默認簽名,release模式用開發者的簽名。

7. zipAligin階段

若是你發佈的apk是正式版的話,就必須對APK進行對齊處理,用到的工具是zipalign,也是位於android-sdk/tools目錄下。

經過zipalign工具對apk中的未壓縮資源(圖片、視頻)進行「對齊操做」,讓資源按4字節的邊界進行對齊,使得資源訪問速度更快。

結尾

Android APK文件(1、編譯打包過程)

Android APK文件(2、解壓和反編譯)

Android APK文件(3、AAPT2工具使用)

Android APK文件(4、Smali語法)

相關文章
相關標籤/搜索