Android R. raw.class.GetFields() не возвращает полей при выпуске

#java #android #reflection #android-resources

Вопрос:

У меня есть следующий код (находится в статическом методе в общедоступном классе, вызывается при запуске приложения 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());
}
 

(этот код является частью функциональности для проверки целостности ресурсов)

У меня был этот механизм в течение некоторого времени, но теперь (после обновления кода до нового 30-го уровня API) он перестал работать. Когда я запускаю приложение из Android Studio, поля находятся, и я могу их перечислить.

Но когда я создаю приложение и запускаю .apk его на том же устройстве, массив полей пуст. Приложение работает нормально, и все ресурсы доступны для нормального использования.

Я попытался распаковать .apk файл и нашел в нем ожидаемые ключи apk/res/values/public.xml . Я также проверил проект и исправил все ошибки.

Были ли какие-то изменения в конфиденциальности для этих полей (в API 29 или 30)? Почему я не могу получить доступ к этим данным?

Ответ №1:

Мне удалось локализовать и устранить проблему. Это было связано с изменениями, внесенными в процесс gradle. Одна из версий изменила обработку android.R класса по умолчанию в конфигурации pro-guard.

Чтобы вернуться к предыдущей конфигурации, вы можете добавить следующее в свой файл свойств pro-guard:

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