#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>;
}