我的项目(在 Delphi 中制作)需要为每个包手动生成它手动包含 R.java 文件。实际上,我将每个库的所有资源都放在一个 .res 目录中,然后在这个目录上为每个包运行 aapt.exe,就像这样 for android.support.compat:
"aapt.exe" package -v -f -m
-M "\libraries\android.support.compat\AndroidManifest.xml"
-I "C:\SDKs\android\platforms\android-32\android.jar"
-S ".\res"
-J ".\tmp\src"
--auto-add-overlay
--output-text-symbols .\tmp\
这是针对 android.support.coreui 的每个包 ex
"aapt.exe" package -v -f -m
-M "\libraries\android.support.coreui\AndroidManifest.xml"
-I "C:\SDKs\android\platforms\android-32\android.jar"
-S ".\res"
-J ".\tmp\src"
--auto-add-overlay
--output-text-symbols .\tmp\
问题是,最后我对每个包都有相同的R.java,它非常大因为它包括整个应用程序的所有资源ID。例如:
package androidx.core;
public final class R {
public static final class styleable {
public static final int[] ActionBar = new int[]{2130771969, 2130771971, 2130771972, 2130771973, 2130771974, 2130771975, 2130771976, 2130771977, 2130771978, 2130771979, 2130771980, 2130771981, 2130771982, 2130771983, 2130771984, 2130771985, 2130771986, 2130771987, 2130771988, 2130771989, 2130771990, 2130771991, 2130771992, 2130771993, 2130771994, 2130771995, 2130771996, 2130771997, 2130772082};
public static final int ActionBar_background = 10;
public static final int ActionBar_backgroundSplit = 12;
....
和
package android.support.coreui;
public final class R {
public static final class styleable {
public static final int[] ActionBar = new int[]{2130771969, 2130771971, 2130771972, 2130771973, 2130771974, 2130771975, 2130771976, 2130771977, 2130771978, 2130771979, 2130771980, 2130771981, 2130771982, 2130771983, 2130771984, 2130771985, 2130771986, 2130771987, 2130771988, 2130771989, 2130771990, 2130771991, 2130771992, 2130771993, 2130771994, 2130771995, 2130771996, 2130771997, 2130772082};
public static final int ActionBar_background = 10;
public static final int ActionBar_backgroundSplit = 12;
有没有办法为每个包生成一个只包含包所需资源 ID 的 R.java?
首先 -- 非常不推荐手动操作
R.java
。正如 B.Burd 和 J.P.Mueller 所写,Android 应用程序开发全合一傻瓜版,第 3 版,2020 年,Wiley,第 87 页(一本严肃的书,尽管名字如此)关于R.java
和 Android Studio:
每个Android项目都有一个R.java文件。 Android Studio 生成此文件并对其进行保护,就好像该文件是用金制成的一样。您,开发人员,永远不要创建或修改 R.java 文件的文本。
以及
Android 的文档告诉您不要理会 R.java 及其十六进制值,这可能是个好建议。
最后
你不能编辑 R.java。在项目创建很久之后,您的 IDE 会继续监视(并在必要时更新)R.java 文件的内容。如果您删除 R.java,Android Studio 会重新创建该文件。如果您编辑 R.java,Android Studio 会撤消您的编辑。
严格来说,您可以在不使用 Android Studio 时编辑
R.java
。但你不应该。正如我曾经说过的某处:
虽然人类可读,但绝不能手动编辑此文件,因为错误引用很可能导致应用程序崩溃。无论如何都没有理由想编辑 R.java。
最后一句话对你的情况也有效。
相反您可以而且应该至少使用其中之一:
代码收缩器 r8,已被引入 以取代 ProGuard(与取代 dx 的 d8 一起)。首先,请查看相应的 Android 开发文档,了解如何收缩、混淆和优化您的应用程序以及本指南。特别是文档中关于 resource shrinking 的部分可能会让您感兴趣。
代码检查器 lint 将帮助您发现代码的各种问题,尤其是未使用的资源,这些资源也会不必要地膨胀您的
R.java
文件。