在 Delphi 项目中,需要为每个包含的库手动生成 R.java 文件。通常,我们会将所有资源放在一个 .res
目录中,并使用 aapt.exe
为每个包生成 R.java 文件。然而,生成的 R.java 文件包含了整个应用的所有资源 ID,导致文件过大且冗余。以下是解决这一问题的核心方法。
问题描述
使用 aapt.exe
为每个包生成 R.java 文件时,生成的 R.java 文件包含了整个应用的所有资源 ID,而不是仅包含该包所需的资源 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;
...
解决方案
1. 使用代码压缩工具 R8
R8 是 Android 官方推荐的代码压缩工具,用于替代 ProGuard。它不仅可以压缩代码,还可以优化和混淆资源。以下是使用 R8 的步骤:
-
启用资源压缩:在
build.gradle
中启用资源压缩功能。 -
配置 R8:通过配置文件指定需要保留的资源。
android { buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
2. 使用 Lint 工具
Lint 是 Android 的代码检查工具,可以帮助发现未使用的资源。通过移除未使用的资源,可以减少 R.java 文件的大小。
-
运行 Lint:在项目根目录下运行以下命令:
./gradlew lint
-
移除未使用的资源:根据 Lint 的报告,手动移除未使用的资源。
3. 避免手动编辑 R.java
R.java 文件是由 Android 构建系统自动生成的,手动编辑可能会导致应用崩溃。以下是避免手动编辑 R.java 的原因:
-
自动生成:R.java 文件由构建系统自动生成和维护,手动编辑后会被系统覆盖。
-
资源引用:R.java 文件中的资源 ID 是动态生成的,手动修改可能导致资源引用错误。
4. 使用正确的资源管理方式
-
模块化资源:将资源按模块划分,确保每个模块只包含其所需的资源。
-
资源分包:通过
aapt
的--custom-package
参数为每个模块生成独立的 R.java 文件。aapt 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" \ --custom-package androidx.core \ --auto-add-overlay \ --output-text-symbols .\tmp\
通过使用 R8 和 Lint 工具,可以有效减少 R.java 文件的大小,并避免手动编辑 R.java 文件。正确的资源管理方式和模块化设计是解决这一问题的关键。
-
-