使用AAPT2.EXE打包 及 获取apk权限与资源信息

///////////////////////////////////////////////////////

概念
AAPT2(Android 资源打包工具)是一种构建工具,Android Studio 和 Android Gradle 插件使用它来编译和打包应用的资源。AAPT2 会解析资源、为资源编制索引,并将资源编译为针对 Android 平台进行过优化的二进制格式。
Android Gradle 插件 3.0.0 及更高版本在默认情况下会启用 AAPT2。您通常不需要自行调用 aapt2。不过,如果您更愿意使用自己的终端和构建系统而不是 Android Studio,则可以从命令行使用 AAPT2。您还可以从命令行调试与 AAPT2 相关的构建错误。为此,您可以在 Android SDK Build Tools 26.0.2 及更高版本中找到作为独立工具提供的 AAPT2。
如要从命令行下载 Android SDK Build Tools,请使用 sdkmanager 并运行以下命令:

sdkmanager "build-tools;build-tools-version"
一般来说,我们已经可以从Android studio中获取aapt2.exe,就不需要再进行下载了。

下载 SDK Build Tools 后,在 android_sdk/build-tools/version/ 下找到 AAPT2。
由于 Android SDK Build Tools 不常发布新版本,因此 SDK Build Tools 中包含的 AAPT2 可能不是最新版本。如需获取最新版 AAPT2,请参阅从 Google Maven 下载 AAPT2。
如需在 Linux 或 Mac 上从命令行使用 AAPT2,请运行 aapt2 命令。在 Windows 上,运行 aapt2.exe 命令。
AAPT2 支持通过启用增量编译实现更快的资源编译。为实现增量编译,资源处理被拆分为两个步骤:

编译:将资源文件编译为二进制格式。
链接:合并所有已编译的文件并将它们打包到一个软件包中。
这种拆分方式有助于提高增量编译的性能。例如,如果某个文件中有更改,您只需要重新编译该文件。

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

编译指令

 aapt2 compile --dir .\res\ -o .\aapt\ --no-crunch --legacy
编译后的.flat文件

如果传递整个目录,则即使只有一项资源发生了改变,AAPT2 也会重新编译目录中的所有文件。虽然您可以使用 --dir 标记将包含多个资源文件的资源目录传递给 AAPT2,但如果这样做,您将无法获得增量资源编译的优势。
输出文件的类型可能会因您为编译提供的输入而异,如下表所示:
表 1. 编译的输入和输出文件类型


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

编译语法
使用 compile 的一般语法如下:

aapt2 compile path-to-input-files [options] -o output-directory/
对于资源文件,输入文件的路径必须符合以下结构: path/resource-type[-config]/file

在以下示例中,AAPT2 分别编译了名为 values.xml 和 myImage.png 的资源文件:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/
如表 1 中所示,输出文件的名称取决于输入文件的名称及其父级目录的名称。
对于以 strings.xml 文件作为输入的上述示例,aapt2 会自动将输出文件命名为 values-en_strings.arsc.flat。不过,存储在 drawable 目录中的已编译可绘制对象文件的文件名将为 drawable_img.png.flat。

编译选项
您可以将多个选项与 compile 命令搭配使用,如表 2 中所示:
表 2. 编译命令选项


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

如果您不使用 Android Gradle 插件从命令行构建应用,则可以使用其他命令行工具,如使用 d8 将 Java 字节码编译为 DEX 字节码,以及使用 apksigner 为 APK 签名。

链接语法
使用 link 的一般语法如下:

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
在以下示例中,AAPT2 将两个中间文件(drawable_Image.flat 和 values_values.arsc.flat)与 AndroidManifest.xml 文件进行了合并。AAPT2 会根据 android.jar 文件链接结果,该文件中包含了 android 软件包中定义的资源:

 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
链接选项
您可以将以下选项与 link 命令搭配使用:
表 3. 链接命令选项

选项    说明
-o path    指定链接的资源 APK 的输出路径。这是一个必需的标记,因为您必须指定可以存放链接资源的输出 APK 的路径。
–manifest file    指定要构建的 Android 清单文件的路径。这是一个必需的标记,因为清单文件中包含有关您应用的基本信息(如软件包名称和应用 ID)。
-I    提供平台的 android.jar 或其他 APK(如 framework-res.apk)的路径,这在构建功能时可能很有用。如果您要在资源文件中使用带有 android 命名空间的属性,则必须使用此标记。
-A directory    指定要包含在 APK 中的资源目录。您可以使用此目录存储未处理的原始文件。如需了解详情,请参阅访问原始文件。
-R file    将单个 .flat 文件传递到 link,使用 overlay 语义,而不使用 标记。如果您提供与现有文件叠加的资源文件,系统会使用最后提供的冲突资源。
–package-id package-id    指定要用于应用的软件包 ID。除非与 --allow-reserved-package-id 结合使用,否则您指定的软件包 ID 必须大于或等于 0x7f。
–allow-reserved-package-id    允许使用保留的软件包 ID。保留的软件包 ID 是指通常分配给共享库的 ID,范围从 0x02 到 0x7e(包含端点值)。通过使用 --allow-reserved-package-id,您可以分配属于保留的软件包 ID 范围内的 ID。此选项只能用于 min-sdk 版本为 26 或更低版本的软件包。
–java directory    指定要在其中生成 R.java 的目录。
–proguard proguard_options    为 ProGuard 规则生成输出文件。
–proguard-conditional-keep-rules    为主 DEX 的 ProGuard 规则生成输出文件。
–no-auto-version    停用自动样式和布局 SDK 版本控制。
–preferred-density density    允许 AAPT2 选择最相符的密度并移除其他所有密度。您可以在应用中使用多种像素密度限定符,如 ldpi、hdpi 和 xhdpi。在您指定首选密度后,AAPT2 会选择最相符的密度并将其存储在资源表中,然后移除其他所有密度。
–output-to-dir    将 APK 内容输出到 -o 指定的目录中。如果您在使用此标记时遇到任何错误,可以通过升级到 Android SDK Build Tools 28.0.0 或更高版本来解决这些问题。
–min-sdk-version min-sdk-version    设置要用于 AndroidManifest.xml 的默认最低 SDK 版本。
–target-sdk-version target-sdk-version    设置要用于 AndroidManifest.xml 的默认目标 SDK 版本。
–version-code version-code    指定没有版本代码时要注入 AndroidManifest.xml 中的版本代码。
–version-name version-name    指定没有版本名称时要注入 AndroidManifest.xml 中的版本名称。
–revision-code revision-code    指定没有修订代码时要注入 AndroidManifest.xml 文件中的修订代码。
–custom-package    指定要在其下生成 R.java 的自定义 Java 软件包
–extra-packages package_name    生成相同的 R.java 文件,但软件包名称不同。
–add-javadoc-annotation annotation    向已生成的所有 Java 类添加 JavaDoc 注释。
–output-text-symbols path    生成包含指定文件中 R 类的资源符号的文本文件。您必须指定输出文件的路径。
–rename-manifest-package manifest-package    重命名 AndroidManifest.xml 文件中的软件包。
–rename-instrumentation-target-package instrumentation- target-package    更改 instrumentation 的目标软件包的名称。此选项应与 --rename-manifest-package 结合使用。
-0 extension    指定您不想压缩的文件的扩展名。
–no-static-lib-packages    合并应用软件包下的所有库资源。
–no-proguard-location-reference    阻止 ProGuard 规则文件引用源文件。
–private-symbols package-name    package-name 指定在为私有符号生成 R.java 时要使用的软件包名称。如果未指定,则公共和私有符号都将使用应用的软件包名称。
–override-styles-instead-of-overlaying    使 -R 资源中定义的样式取代之前的定义,而非合并这些定义。
–rename-resources-package package-name    将资源表中的软件包重命名为 package-name。
–no-compress    不压缩任何资源。
–keep-raw-values    保留 XML 文件中的原始属性值。
–no-compress-regex regular-expression    不压缩与 regular-expression 匹配的扩展程序。 使用 $ 符号表示行尾。使用区分大小写的 ECMAScript 正则表达式语法。
–warn-manifest-validation    将清单验证错误视为警告。
–exclude-configs qualifier[,qualifier[…]]    排除配置包含指定限定符的资源的值。
–debug-mode    将 android:debuggable=“true” 插入清单的应用节点,使应用即使在正式版设备上也可调试。
–strict-visibility    不允许显示可见性级别不同的叠加层。
–exclude-sources    以 Protobuf 格式生成资源时,不会将源文件信息序列化。
–trace-folder folder    生成 systrace JSON 跟踪记录 fragment,其保存在指定的folder中。
–merge-only    仅在不验证资源引用的情况下合并资源。此标志应仅与 --static-lib 标志一起使用。
-h    显示帮助菜单。
-v    可提高输出的详细程度。
aapt指令实践
输入 res
编译之前,我们先准备好资源文件如下图所示


aapt2指令使用流程
步骤分为两步,编译和链接

编译
输入res文件夹,指令具体含义可见编译章节

aapt2 compile --dir .\res\ -o .\aapt2\ --no-crunch --legacy

输出:


由于后续链接时,输入的对象为文件而非文件夹,因此,编译时可以将编译的文件输出为zip格式。
优化指令如下:

C:\Users\liyd\Desktop\kuaishou> aapt2 compile --dir .\project-release\res\ -o .\project-release\compile.zip --no-crunch --legacy

aapt2 compile --dir .\project-release\res\ -o .\project-release\compile.zip --no-crunch --legacy
输出文件如下:


链接
可以生成APK、R.java、resources.arsc等。

注意此指令的输入为文件形式。
此指令的输入为 编译步骤中的文件。
aapt2 link .\project-release\compile.zip -I .\android.jar --manifest .\AndroidManifest_R.xml -o .\link.apk -v --package-id 0x50 --allow-reserved-package-id --java .\project-release\R\
1
输出:
此指令下,输出的R文件的包名与指定的Manifest的包名相同。

优化指令
1、aapt2指令是有顺序要求的,想要让自定义的包名**–custom-package cn.jj.log生效,需要将其放在–java .\project-release\R**之前。
2、 如果希望aapt2生成的apk中包括asset资源,可以使用-A指令。

aapt2 link .\project-release\compile.zip -I .\android.jar --manifest .\project-release\AndroidManifest.xml -o .\link.apk -v --package-id 0x50 --allow-reserved-package-id --custom-package cn.jj.log --java .\project-release\R\ -A .\project-release\assets\

///////////////////////////////////////////////////////

获取 资源与 权限信息

用途一:获取res/values/strings.xml指定字段的值

aapt2.exe dump resources heartyservice_mfv.apk | findstr string/privacy_url

注意:res/values/strings.xml编译后会消失,同时生成resources.arsc。所以,aapt2.exe dump xmlstrings或xmltree会提示找不到该文件。

用途二:获取该应用所有权限

aapt2.exe dump permissions SogouInput.apk

//////////////////////////////////////////////////////////

/////////////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值