阅读 217

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

官方介绍: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语法)

关注下面的标签,发现更多相似文章
评论