Android R.raw.class.getFields() 在发布时不返回任何字段

问题描述

我有以下代码(位于公共类的静态方法中,在应用程序从 MainActivity.onPostCreate 开始时调用):

Field[] fields = R.raw.class.getFields();
StringBuilder allFields = new StringBuilder();

for (int i = 0; i < fields.length; i++) {
    Field field = fields[i];
    allFields.append(field.getName() + " - " + field.getModifiers());
}

(此代码是检查资源是否完整的功能的一部分)

我使用这种机制已有一段时间了,但现在(在将代码更新到新的 API 级别 30 之后)它停止工作了。当我从 Android Studio 运行应用程序时,会找到字段,我可以列出它们。

但是当我构建应用程序并在 同一设备 上运行 .apk 时,fields 数组为空。应用程序正常运行,所有资源均可正常使用。

我尝试解压 .apk 文件并在 apk/res/values/public.xml 中找到了预期的键。我还检查了项目并修复了所有错误

此字段的隐私是否有一些变化(在 API 29 或 30 中)?为什么我无法访问这些数据?

解决方法

我设法本地化并解决了问题。它与 gradle 过程中所做的更改有关。其中一个版本更改了 pro-guard 配置中 android.R 类的默认处理。

要返回到之前的配置,您可以将以下内容添加到亲卫属性文件中:

-keepclassmembers class **.R$* {
    public static <fields>;
}