Android APK文件(三、AAPT2工具使用)

6,336 阅读4分钟

官方介绍:developer.android.google.cn/studio/comm…

AAPT2(Android 资源打包工具)是一个构建工具,Android Studio 和 Android Gradle 插件使用它来编译和打包应用的资源。AAPT2 会解析资源、为资源编制索引,并将资源编译为针对 Android 平台进行过优化的二进制格式。

Android Gradle 插件 3.0.0 及更高版本默认情况下会启用 AAPT2,aapt2地址(/sdk_path/build-tools/version/aapt2)。

AAPT2 支持通过启用增量编译实现更快的资源编译。这是通过将资源处理拆分为两个步骤来实现的:

  • 编译:将资源文件编译为二进制格式。
  • 链接:合并所有已编译的文件并将它们打包到一个软件包中。

这种拆分方式有助于提高增量编译的性能。例如,如果一个文件发生了改变,则只需要重新编译这个文件。

编译

AAPT2 支持编译所有 Android 资源类型,如可绘制对象和 XML 文件。调用 AAPT2 进行编译时,每次调用都应传递一个资源文件作为输入。然后,AAPT2 会解析该文件并生成一个扩展名为 .flat 的中间二进制文件。

输入 输出
XML 资源文件(如 String 和 Style),它们位于 res/values/ 目录下。 以 *.arsc.flat 作为扩展名的资源表。
其他所有资源文件。 除 res/values/ 目录下的文件以外的其他所有文件都将转换为扩展名为 *.flat 的二进制 XML 文件。此外,默认情况下,所有 PNG 文件都会被压缩,并采用 *.png.flat 扩展名。如果选择不压缩 PNG,您可以在编译期间使用 --no-crunch 选项。

AAPT2 输出的文件不是可执行文件,稍后您必须在链接阶段添加这些二进制文件作为输入来生成 APK。但是,所生成的 APK 文件不是可以立即部署在 Android 设备上的可执行文件,因为它不包含 DEX 文件(已编译的字节码)且未签名。

编译语法:compile

aapt2 compile path-to-input-files [options] -o output-directory/

path-to-input-files必须符合path/resource-type[-config]/file.

  • 错误示例:G:\Decompile\aapt\colors.xml 运行会报错:error: invalid file path 'G:\Decompile\aapt\colors.xml'.
  • 正确示例:G:\Decompile\aapt\res\values\colors.xml
.\aapt2.exe compile G:\Decompile\aapt\res\values\colors.xml -o G:\Decompile\aapt\

会在目录文件夹下生成values_colors.arsc.flat文件。

编译选项

选项 说明
-o path 指定已编译资源的输出路径。这是一个必需的标志,因为您必须指定 AAPT2 可将已编译的资源输出并存储到其中的目录的路径。
--dir directory 指定要在其中搜索资源的目录。虽然您可以使用此标志通过一个命令编译多个资源文件,但这样就无法获得增量编译的优势,因此不建议对大型项目使用。
--pseudo-localize 生成默认字符串的伪本地化版本,如 en-XA 和 en-XB。
--no-crunch 停用 PNG 处理。
--legacy 将使用早期版本的 AAPT 时允许的错误视为警告。
-v 启用详细日志记录。

链接

在链接阶段,AAPT2 会合并在编译阶段生成的所有中间文件(如资源表、二进制 XML 文件和处理过的 PNG 文件),并将它们打包成一个 APK。此外,在此阶段还会生成其他辅助文件,如 R.java 和 ProGuard 规则文件。不过,生成的 APK 不包含 DEX 字节码且未签名。

链接语法:link

aapt2 link path-to-input-files [options] -o outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

示例

aapt2 link -o output.apk -I android_sdk/platforms/android_version/android.jar compiled/res/values_values.arsc.flat compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

链接选项

选项 说明
-o path 指定链接的资源 APK 的输出路径。必须指定。
--manifest file 指定要构建的 Android 清单文件的路径。必须指定。
-I 如果您要在资源文件中使用带有 android 命名空间(例如 android:id)的属性,则必须使用此标志。
--java directory 指定要在其中生成 R.java 的目录。
--min-sdk-version min-sdk-version 设置要用于 AndroidManifest.xml 的默认最低 SDK 版本。
--target-sdk-version target-sdk-version 设置要用于 AndroidManifest.xml 的默认目标 SDK 版本。
--version-code version-code 指定没有版本代码时要注入 AndroidManifest.xml 中的版本代码(整数)
--compile-sdk-version-name compile-sdk-version-name 指定没有版本名称时要注入 AndroidManifest.xml 中的版本名称。
-v 可提高输出的详细程度

转储

dump 用于输出有关从 link 命令生成的 APK 的资源和清单信息。使用 dump 将信息输出到控制台。

转储语法

aapt2 dump [subcommand] filename.apk [options]

subcommand

选项 说明
apc Print the contents of the AAPT2 Container (APC) generated fom compilation.
badging 输出从APK清单中提取的信息
configurations 输出APK使用的配置信息
packagename 输出包名
permissions 输出APK中使用到的权限信息
strings 输入资源表常量池的信息
styleparents Print the parents of a style in an APK.
resources 输出资源表的信息
xmlstrings 输出编译后的常量池
xmltree 输入编译后的xml树

转储选项

选项 说明
--no-values 禁止在显示资源时输出值。
--file file 将文件指定为要从 APK 转储的参数。
-v 提高输出的详细程度。

结尾

Android APK文件(一、编译打包过程)

Android APK文件(二、解压和反编译)

Android APK文件(三、AAPT2工具使用)

Android APK文件(四、Smali语法)