如何手动生成 R.java 文件

欢迎加入全网最大Delphi 技术交流群 682628230

在 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 文件。正确的资源管理方式和模块化设计是解决这一问题的关键。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享