aapt 是Android Asset Packaging Tool的缩写,是编译和打包资源的工具。而aapt2是在aapt上做了优化。Android Gradle Plugin 3.0.0或者更高版本默认开启aapt2。当然也可以在配置文件中手动关闭aapt2。
一般打包过程情况下,都是由gradle自动调用aapt2,将资源文件编译成二进制文件。当然,我们也可以使用命令行进行手动打包资源。aapt2打包资源的流程如下图。
aapt2将原先的资源编译打包过程拆分成了两部分,即编译和链接。
- 编译:将资源文件编译为二进制格式文件
- 链接:将编译后的所有文件合并,打包成一个单独文件
这种方式可以很好的提升资源的编译性能,比如只有一个资源文件发送改变时,你只需要重新编译改变的文件,然后将其与其他未改变的资源进行链接即可。而之前的aapt是将所有资源进行merge,merge完后将所有资源进行编译,产生一个资源ap_文件,该文件是一个压缩包,这样带来的后果就是即使只改变了一个资源文件,也要进行全量编译。
编译
aapt2支持编译所有的资源文件,并产生.flat格式的文件。
Input | Output |
---|---|
res/values/ 目录下的xml文件 |
*.asrc.flat 格式的文件 |
其他资源文件 | 除 res/values/ 目录下的XML文件外,都是 *.flat 格式文件. 此外所有的 PNG 文件默认压缩为 *.png.flat 文件. 可以使用 --no-crunch 参数禁止压缩PNG图片 |
编译语法
aapt2 compile path-to-input-files [options] -o output-directory/
Compile 命令行参数
Option | Description |
---|---|
-o path |
指定输出文件路径 |
--dir directory |
指定扫描的资源目录 |
--no-crunch |
禁止PNG图片压缩处理 |
-v |
打开详细日志 |
举例
下面我们在Android项目目录下,使用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首先合并编译阶段生成的文件,像二进制XML文件,处理后的PNG文件等,然后,将其打包成一个apk文件。此外,在此阶段可以生成其他辅助文件,如R.java和ProGuard规则文件。当然,此时生成的apk文件并不包含dex文件,也没有签名。
连接语法
aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
常用link命令行参数
Option | Description |
---|---|
-o path | 指定输出文件路径 |
--manifest file | 指定AndroidManifest文件路径 |
-I | 指定android.jar路径 |
-- emit-ids path | 可以产生资源id文件,可以适用于--stable-ids |
--stable-ids | 使用--emit-ids生成的文件,包含资源类型名称列表及其分配的ID。 |
-v | 打开详细日志 |
更多命令行可以参见aapt2#link
举例
在上一节,我们编译后得到两个文件values_strings.arsc.flat和mipmap-xhdpi_ic_launcher.png.flat文件。现在,我们使用aapt2 link命令将这两个文件打包到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
执行上述命令,即可在当前目录生成output.apk。
Dump
dump用于打印通过link命令产生的APK文件的资源和配置文件。可以使用以下命令将其打印到终端。
aapt2 dump filename.apk [options]
dump 命令行参数
Option | Description |
---|---|
--no-values |
当显示资源时,禁止输出值 |
--file file |
将文件指定为要从APK转储的参数 |
-v |
打开详细日志 |
举例
使用aapt2 dump命令将链接后生成的output.apk打印出来。
aapt2 dump output.apk
输出结果如下
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"