aapt2 工具介绍

aapt 是Android Asset Packaging Tool的缩写,是编译和打包资源的工具。而aapt2是在aapt上做了优化。Android Gradle Plugin 3.0.0或者更高版本默认开启aapt2。当然也可以在配置文件中手动关闭aapt2。

一般打包过程情况下,都是由gradle自动调用aapt2,将资源文件编译成二进制文件。当然,我们也可以使用命令行进行手动打包资源。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"

参考文档

推荐阅读更多精彩内容