前言
APK文件的組成部分及apk打包流程是Android開發(fā)中的基礎(chǔ)知識點(diǎn),做一個簡單的記錄。
一、APK組成部分
apk文件是Android應(yīng)用包文件格式,其本質(zhì)是一個壓縮文件。將apk文件拖動到Android Studio中即可查看里面的內(nèi)容,如下圖:
從上圖中可以看到apk包里的幾個重要組成部分:
lib:lib文件夾里面存放動態(tài)鏈接庫,這些內(nèi)容不需要在做apk打包時一系列壓縮處理。
META-INF:是簽名文件夾,用來保證apk包的完整性和系統(tǒng)的安全性。
res:資源文件夾,包括圖片,字符串等。
AndroidManifest.xml文件:AndroidManifest.xml文件是Android工程中的必備文件,是位于項(xiàng)目根目錄的全局配置文件,文件中聲明了應(yīng)用的名稱,權(quán)限,以及四大組件的聲明等等信息。
classes.dex文件:dex文件是Android平臺上的可執(zhí)行文件,是Android虛擬機(jī)Dalvik支持的字節(jié)碼文件。如果工程分包則會存在多個dex文件。
resources.arsc:編譯后的二進(jìn)制資源文件的索引(apk文件的資源表索引)。
二、打包流程概述
打包流程的經(jīng)典流程圖如下:
其中七個橢圓形內(nèi)容對應(yīng)了打包流程中的七個重要步驟,也對應(yīng)著打包中的七個重要工具,具體如下:
| 工具名稱 | 功能 |
|---|---|
| aapt | 資源打包工具,生成R文件 |
| AIDL | Android接口定義語言轉(zhuǎn)變?yōu)?java文件 |
| javaC | 轉(zhuǎn)變.java文件為class文件 |
| dex | 轉(zhuǎn)變class文件為.dex文件 |
| apkbuilder | 生成apk包 |
| JarSigner | .jar文件的簽名工具 |
| zipalign | 字節(jié)碼對齊工具 |
三、打包流程詳細(xì)介紹
對上面七個重要的打包流程進(jìn)一步說明。
1. aapt
aapt打包資源文件,生成R.java文件,resources.arsc等文件。
R.java文件和resources.arsc文件都是res資源的清單文件,但是兩者并不完全一樣。
- R.java文件中包含的是資源文件的id值,id值并不重復(fù)。主要用于代碼中引用資源ID。
- resources.arsc文件則會對res中的資源文件進(jìn)行處理,在apk運(yùn)行時獲取正確分辨率的資源。
aapt在打包資源文件之前會檢測AndroidManifest.xml文件的合法性,對res目錄下的資源目錄進(jìn)行掃描合法性,因此資源命名有問題時會在編譯階段就會直接報(bào)錯。
需要注意的是xml文件會被編譯為二進(jìn)制的,因此我們并不能直接打開apk包中的xml文件。
2.AIDL
AIDL是Android接口定義語言,是Android進(jìn)程間通訊的一種實(shí)現(xiàn)方式。
此步驟中會對aidl文件進(jìn)行處理,生成java文件。
3. javaC生成class文件
通過javaCompiler對java文件進(jìn)行編譯,生成class文件。
如果配置代碼混淆,此步驟中就會進(jìn)行混淆編譯。
4. dex
dx工具將class文件轉(zhuǎn)變?yōu)锳ndroid系統(tǒng)Dalvik虛擬機(jī)可執(zhí)行的Dex文件。
5. apkbuilder
將classes.dex,res文件夾等所有文件打包成apk文件。
6. apk簽名
生成APK包之后還需要進(jìn)行簽名處理,Release簽名需要我們自己去進(jìn)行配置。
常用的簽名方式有兩種:jarsigner和apksigner。
- 如果是使用apksigner,則需要在簽名前對apk包進(jìn)行Zipalign整理
- 使用jarsigner則需要在簽名后對apk包進(jìn)行Zipalign對齊整理。
7. APK文件對齊處理
Zipalign是Android平臺上APK文件對齊的整理工具,能夠?qū)PK中未壓縮的數(shù)據(jù)進(jìn)行4字節(jié)對齊。
需要注意的是根據(jù)采用簽名方式的不同,對齊處理的先后順序有所區(qū)別。
4字節(jié)對齊之后,就可以使用mmap函數(shù)(內(nèi)存映射)讀取文件,可以向讀取內(nèi)存一樣對文件進(jìn)行操作。
如果沒有4字節(jié)對齊,就必須顯式的讀取,這樣比較緩慢并且會耗費(fèi)額外的內(nèi)存。
總結(jié)
APK打包流程備忘。