aapt 是Android Asset Packaging Tool的縮寫,是編譯和打包資源的工具。而aapt2是在aapt上做了優(yōu)化。Android Gradle Plugin 3.0.0或者更高版本默認(rèn)開啟aapt2。當(dāng)然也可以在配置文件中手動(dòng)關(guān)閉aapt2。
一般打包過(guò)程情況下,都是由gradle自動(dòng)調(diào)用aapt2,將資源文件編譯成二進(jìn)制文件。當(dāng)然,我們也可以使用命令行進(jìn)行手動(dòng)打包資源。aapt2打包資源的流程如下圖。

aapt2將原先的資源編譯打包過(guò)程拆分成了兩部分,即編譯和鏈接。
- 編譯:將資源文件編譯為二進(jìn)制格式文件
- 鏈接:將編譯后的所有文件合并,打包成一個(gè)單獨(dú)文件
這種方式可以很好的提升資源的編譯性能,比如只有一個(gè)資源文件發(fā)送改變時(shí),你只需要重新編譯改變的文件,然后將其與其他未改變的資源進(jìn)行鏈接即可。而之前的aapt是將所有資源進(jìn)行merge,merge完后將所有資源進(jìn)行編譯,產(chǎn)生一個(gè)資源ap_文件,該文件是一個(gè)壓縮包,這樣帶來(lái)的后果就是即使只改變了一個(gè)資源文件,也要進(jìn)行全量編譯。
編譯
aapt2支持編譯所有的資源文件,并產(chǎn)生.flat格式的文件。
| Input | Output |
|---|---|
res/values/目錄下的xml文件 |
*.asrc.flat 格式的文件 |
| 其他資源文件 | 除 res/values/ 目錄下的XML文件外,都是 *.flat格式文件. 此外所有的 PNG 文件默認(rèn)壓縮為 *.png.flat文件. 可以使用 --no-crunch 參數(shù)禁止壓縮PNG圖片 |
編譯語(yǔ)法
aapt2 compile path-to-input-files [options] -o output-directory/
Compile 命令行參數(shù)
| Option | Description |
|---|---|
-o path |
指定輸出文件路徑 |
--dir directory |
指定掃描的資源目錄 |
--no-crunch |
禁止PNG圖片壓縮處理 |
-v |
打開詳細(xì)日志 |
舉例
下面我們?cè)贏ndroid項(xiàng)目目錄下,使用aapt2 命令行編譯資源文件
- 編譯res/values/下的XML文件
aapt2 compile -o myBuild/ app/src/main/res/values/strings.xml
可以在myBuild/目錄下,找到values_strings.arsc.flat文件
- 編譯png文件
aapt2 compile -o myBuild/ app/src/main/res/mipmap-xhdpi/ic_launcher.png
可以在myBuild/目錄下,找到mipmap-xhdpi_ic_launcher.png.flat文件
鏈接
在鏈接階段,aapt2首先合并編譯階段生成的文件,像二進(jìn)制XML文件,處理后的PNG文件等,然后,將其打包成一個(gè)apk文件。此外,在此階段可以生成其他輔助文件,如R.java和ProGuard規(guī)則文件。當(dāng)然,此時(shí)生成的apk文件并不包含dex文件,也沒(méi)有簽名。
連接語(yǔ)法
aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
常用link命令行參數(shù)
| Option | Description |
|---|---|
| -o path | 指定輸出文件路徑 |
| --manifest file | 指定AndroidManifest文件路徑 |
| -I | 指定android.jar路徑 |
| -- emit-ids path | 可以產(chǎn)生資源id文件,可以適用于--stable-ids |
| --stable-ids | 使用--emit-ids生成的文件,包含資源類型名稱列表及其分配的ID。 |
| -v | 打開詳細(xì)日志 |
更多命令行可以參見aapt2#link
舉例
在上一節(jié),我們編譯后得到兩個(gè)文件values_strings.arsc.flat和mipmap-xhdpi_ic_launcher.png.flat文件?,F(xiàn)在,我們使用aapt2 link命令將這兩個(gè)文件打包到output.apk 中。
aapt2 link -o output.apk -I /Users/nxiangbo/Library/Android/sdk/platforms/android-28/android.jar myBuild/values_strings.arsc.flat myBuild/mipmap-xhdpi_ic_launcher.png.flat --manifest app/src/main/AndroidManifest.xml -v
執(zhí)行上述命令,即可在當(dāng)前目錄生成output.apk。
Dump
dump用于打印通過(guò)link命令產(chǎn)生的APK文件的資源和配置文件??梢允褂靡韵旅顚⑵浯蛴〉浇K端。
aapt2 dump filename.apk [options]
dump 命令行參數(shù)
| Option | Description |
|---|---|
--no-values |
當(dāng)顯示資源時(shí),禁止輸出值 |
--file file |
將文件指定為要從APK轉(zhuǎn)儲(chǔ)的參數(shù) |
-v |
打開詳細(xì)日志 |
舉例
使用aapt2 dump命令將鏈接后生成的output.apk打印出來(lái)。
aapt2 dump output.apk
輸出結(jié)果如下
Binary APK
Package name=com.example.nxiangbo.shapeimage id=7f
type mipmap id=01 entryCount=1
resource 0x7f010000 mipmap/ic_launcher
(xhdpi-v4) (file) res/mipmap-xhdpi-v4/ic_launcher.png type=PNG
type string id=02 entryCount=1
resource 0x7f020000 string/app_name
() "shapeImage"