快弃用陈年老旧的aapt,appt2功能更加好用

首先,当然是先看看官方文档对aapt2的介绍:aapt2官方说明

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

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,只是传了单个文件的path(path的需要严格按照这个格式path/resource-type[-config]/file存放,否则编译时会提示“bad resource path”),那么-o 后面的path设置为目录,若是设置--dir,则不必要再传入单个文件的path,同时-o后面的path应设置为文件名,比如:res.zip之类
--dir directory 指定扫描的资源目录
--no-crunch 禁止PNG图片压缩处理
-v 打开详细日志

举例
1)编译单个xml文件

aapt2 compile -v res/values/strings.xml -o out/

2)编译整个资源目录res

aapt2 compile -v --dir res -o res.zip

链接

在链接阶段,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 path 指定android.jar路径
-- emit-ids path 产生资源id映射文件名,可以适用于–stable-ids
--stable-ids 使用–emit-ids生成的文件,包含资源类型名称列表及其分配的ID。
--package-id package-id 指定生成资源索引表的packageID ,设置的packageID 必须大于或者等于0x7f。要是与 --allow-reserved-package-id联合使用就可以不受这个限制
--allow-reserved-package-id 允许设置packageId为 0x020x7e ,这个只适用最小版本是26及以下(注意:这个在buildToolVersion:28.0.3之后才有的)
--java directory 指定生成R.java的目录
-A directory 指定需要打包进apk的assets目录
-v 打开详细日志

举例
1)生成R.java放到build目录,生成资源id映射文件输出到当前目录ids.txt,同时设置packageID为0x50,res.zip为上一步编译得到的.flat压缩包

aapt2 link -I D:/Android/Sdk/platforms/android-27/android.jar  --allow-reserved-package-id  --package-id 0x50 --java build --emit-ids ids.txt -o res.apk --manifest AndroidManifest.xml res.zip

注意事项
要在AS 3.0 gradle中更好使用aapt2支持,请设置项目build.gradle的classpath为:

 classpath 'com.android.tools.build:gradle:3.2.1'

同时,gradle/gradle-wrapper.properties文件的distributionUrl设置为:

https\://services.gradle.org/distributions/gradle-4.8-all.zip

那么,也就可以在app的build.gradle设置aaptOptions:

aaptOptions {
    additionalParameters  "--allow-reserved-package-id", "--package-id"," 0x50"
}
发布了36 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43278826/article/details/86543932