Android的Apk打包流程

1.概況

  • Android APK是如何來(lái)的呢?
    懷著這個(gè)問(wèn)題去查資料,發(fā)現(xiàn)了下邊這張圖


    image.png
  • 由android的項(xiàng)目經(jīng)過(guò)編譯和打包,形成了:
    1..dex 文件
    2.resources.arsc
    3.uncompiled resources
    4.AndroidManifest.xml

解壓了一個(gè)普通的apk文件,解壓出來(lái)的文件如下:


image.png

classes.dex 是.dex文件。
resources.arsc是resources resources文件。
AndroidManifest.xml是AndroidManifest.xml文件。
res是uncompiled resources。
META-INF是簽名文件夾。

  • META-INF其中有三個(gè)文件:


    image.png

MANIFEST.MF文件
版本號(hào)以及每一個(gè)文件的哈希值(BASE64)。包括資源文件。這個(gè)是對(duì)每個(gè)文件的整體進(jìn)行SHA1(hash)。

Manifest-Version: 1.0
Built-By: Generated-by-ADT
Created-By: Android Gradle 2.2.0
Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png
SHA1-Digest: I9s6aQ5VyOLrNo4odqSij549Oyo=
Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY=
……

CERT.SF
這個(gè)是對(duì)每個(gè)文件的頭3行進(jìn)行SHA1 hash。


Signature-Version: 1.0
X-Android-APK-Signed: 2
SHA1-Digest-Manifest: QxOfCCAuQtZnHh0YRNnoxmiHT80=
Created-By: 1.0 (Android)
Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png
SHA1-Digest: I9s6aQ5VyOLrNo4odqSij549Oyo=
Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY=
……

CERT.RSA
這個(gè)文件保存了簽名和公鑰證書。

2. 具體打包過(guò)程

image.png

2.1 aapt階段

  • 使用aapt來(lái)打包res資源文件,生成R.java、resources.arsc和res文件(二進(jìn)制 & 非二進(jìn)制如res/raw和pic保持原樣)
  • res目錄有9種目錄
    --animator。這類資源以XML文件保存在res/animator目錄下,用來(lái)描述屬性動(dòng)畫。
    --anim。這類資源以XML文件保存在res/anim目錄下,用來(lái)描述補(bǔ)間動(dòng)畫。
    --color。這類資源以XML文件保存在res/color目錄下,用描述對(duì)象顏色狀態(tài)選擇子。
    --drawable。這類資源以XML或者Bitmap文件保存在res/drawable目錄下,用來(lái)描述可繪制對(duì)象。例如,我們可以在里面放置一些圖片(.png, .9.png, .jpg, .gif),來(lái)作為程序界面視圖的背景圖。注意,保存在這個(gè)目錄中的Bitmap文件在打包的過(guò)程中,可能會(huì)被優(yōu)化的。例如,一個(gè)不需要多于256色的真彩色PNG文件可能會(huì)被轉(zhuǎn)換成一個(gè)只有8位調(diào)色板的PNG面板,這樣就可以無(wú)損地壓縮圖片,以減少圖片所占用的內(nèi)存資源。
    --layout。這類資源以XML文件保存在res/layout目錄下,用來(lái)描述應(yīng)用程序界面布局。
    --menu。這類資源以XML文件保存在res/menu目錄下,用來(lái)描述應(yīng)用程序菜單。
    --raw。這類資源以任意格式的文件保存在res/raw目錄下,它們和assets類資源一樣,都是原裝不動(dòng)地打包在apk文件中的,不過(guò)它們會(huì)被賦予資源ID,這樣我們就可以在程序中通過(guò)ID來(lái)訪問(wèn)它們。例如,假設(shè)在res/raw目錄下有一個(gè)名稱為filename的文件,并且它在編譯的過(guò)程,被賦予的資源ID為R.raw.filename,那么就可以使用以下代碼來(lái)訪問(wèn)它:
Resources res = getResources();  
InputStream is = res .openRawResource(R.raw.filename);  

--values。這類資源以XML文件保存在res/values目錄下,用來(lái)描述一些簡(jiǎn)單值,例如,數(shù)組、顏色、尺寸、字符串和樣式值等,一般來(lái)說(shuō),這六種不同的值分別保存在名稱為arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。
--xml。這類資源以XML文件保存在res/xml目錄下,一般就是用來(lái)描述應(yīng)用程序的配置信息。

  • R.java文件


    image.png

這就是R.java的源代碼,里面擁有很多個(gè)靜態(tài)內(nèi)部類,比如layout,string等。
每當(dāng)有這種資源添加時(shí),就在R.java文件中添加一條靜態(tài)內(nèi)部類里的靜態(tài)常量類成員,且所有成員都是int類型。


image.png

里面的資源可以有兩種方法引用:
1.在java程序中引用資源按照java的語(yǔ)法來(lái)引用即:R.resource_type.resource_
name注意:resource_name不需要文件的后綴名
2.在XML文件中引用資源格式:@[package:]type/nam

  • resources.arsc文件

resources.arsc這個(gè)文件記錄了所有的應(yīng)用程序資源目錄的信息,包括每一個(gè)資源名稱、類型、值、ID以及所配置的維度信息。我們可以將這個(gè)resources.arsc文件想象成是一個(gè)資源索引表,這個(gè)資源索引表在給定資源ID和設(shè)備配置信息的情況下,能夠在應(yīng)用程序的資源目錄中快速地找到最匹配的資源。

2.2 aidl階段

  • AIDL (Android Interface Definition Language), Android接口定義語(yǔ)言,Android提供的IPC (Inter Process Communication,進(jìn)程間通信)的一種獨(dú)特實(shí)現(xiàn)。
    這個(gè)階段處理.aidl文件,生成對(duì)應(yīng)的Java接口文件。

2.3 Java Compiler階段

  • 通過(guò)Java Compiler編譯R.java、Java接口文件、Java源文件,生成.class文件。

2.4 dex階段

  • 通過(guò)dex命令,將.class文件和第三方庫(kù)中的.class文件處理生成classes.dex。

2.5 apkbuilder階段

  • 將classes.dex、resources.arsc、res文件夾(res/raw資源被原裝不動(dòng)地打包進(jìn)APK之外,其它的資源都會(huì)被編譯或者處理)、Other Resources(assets文件夾)、AndroidManifest.xml打包成apk文件。
    注意:
    res/raw和assets的相同點(diǎn):
    1.兩者目錄下的文件在打包后會(huì)原封不動(dòng)的保存在apk包中,不會(huì)被編譯成二進(jìn)制。
    res/raw和assets的不同點(diǎn):
    1.res/raw中的文件會(huì)被映射到R.java文件中,訪問(wèn)的時(shí)候直接使用資源ID即R.id.filename;assets文件夾下的文件不會(huì)被映射到R.java中,訪問(wèn)的時(shí)候需要AssetManager類。
    2.res/raw不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu),也就是assets目錄下可以再建立文件夾

2.6 Jarsigner階段

  • 對(duì)apk進(jìn)行簽名,可以進(jìn)行Debug和Release 簽名。

參考鏈接:
http://www.itdecent.cn/p/7c288a17cda8

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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