1 个不稳定版本
0.1.0 | 2024年6月2日 |
---|
#325 in 开发工具
98KB
2K SLoC
R55
这是什么?
R55是aapt生成的R.txt文件的解析器和编译器。它可以从R.txt文件生成R.java文件,更好,通过直接生成R.class文件(字节码)来完全跳过Java编译器。
如何使用它?
R55分为几个子命令。
help
提供帮助和命令用法
java
这个命令从R.txt文件生成R.java类。r55 java build/gen/R.txt --package com.example.r55
compile
这个命令从R.txt文件生成Java字节码。R55嵌入了一个小型Java编译器,能够编写输入R.txt文件的Java字节码。
find
从R.txt文件中查找资源值。
--split
这是一个可以在java和compile子命令中找到的标志。它用于告诉R55您希望为各种库/依赖项生成R类。
示例用法
您是labt,并且您已经解决了依赖项并下载了所有相关aar文件,很酷。现在您有一个艰巨的任务是将所有依赖项编译成一个Android应用程序。Appt2忠实地编译了您的资源库,但没有方法生成特定于库的R.java文件。您可以使用aapt2的--extra-packages arg Generate the same R.java but with different package names.
,这行得通,但您最终得到了所有依赖项的(1.5Mb R.java)*16个文件。所以您决定创建只包含每个库需要的资源ID的R.java文件,但没有方法做到。所以您决定编写一个工具来完成这个任务,并将其命名为R55...
无论如何,Android aar文件包含R.txt文件,列出了库公开的资源ID。这些R.txt文件与aapt2生成的文件之间的区别是,这些文件包含错误的资源ID值。例如,来自recyclerview-1.1.0库的,
int attr alpha 0x0
int attr fastScrollEnabled 0x0
int attr fastScrollHorizontalThumbDrawable 0x0
int attr fastScrollHorizontalTrackDrawable 0x0
每个条目的值是 0x0
,这是在 android 资源文件 resources.arsc 中的一个无效引用。这是故意的,因为 aapt2 会根据资源条目的变化计算并生成新的值,因此库无法提前知道其 id。我们的 --split
标志的作用是使用这些文件和 aapt2 生成的新 R.txt 文件来生成有效的库特定 R.class。从上面的示例中,它会找到 fastScrollEnabled 的值,并将其值替换为正确值,例如从 0x0 替换为 0x7fadbeef。
r55 compile ../build/gen/txt/R.txt \
--package com.edu \
--split \
--files lib-res/core-1.5.0/R.txt:lib-res/appcompat-resources-1.1.0/R.txt:lib-res/appcompat-1.2.0/R.txt:lib-res/cardview-1.0.0/R.txt \
--packages androidx.core:androidx.appcompat:androidx.appcompat:androidx.cardview \
--output .
因此,您需要提供库中 R.txt 文件的路径及其对应的库包名,R55 将会忠实地生成所需的 java 文件。
待办事项
- 添加一个 dex 中间写入器(d8 或 r8 可用于增量编译的文件。)
- 适当的错误报告,同时保持一致性
依赖项
约 1MB
约 15K SLoC