#android #reflection #proguard
#Android #отражение #proguard
Вопрос:
У меня есть большой класс Constants, и мне нужно использовать отражение, чтобы получить из него статические массивы строк.
public class Constants {
public static String OneAIntro = "Guten Morgen – Auf dich warten einige Fragen";
public static String[] OneAStepOne = {"Wie würdest du deinen Schlaf beurteilen?", "Sehr schlecht","Sehr gut", "Konntest du in der letzten Nacht gut einschlafen, durchschlafen und bist zur gewünschten Zeit aufgewacht?"};
public static String[] OneAStepTwo = {"Im Moment fühle ich mich ...", "zufrieden", "unzufrieden "};
...
Несмотря на соблюдение всех правил, предложенных онлайн, я не могу предотвратить
java.lang.NoSuchFieldException: OneAStepOne
Одна из вещей, которая меня смущает, — это правильное место для размещения правил. В Android Studio есть файл с именем proguard-rules.pro
Также есть файлы в промежуточном каталоге сборки / proguard-files/ proguard-android.txt-4.01, proguard-android-optiize.txt-4.01 и proguard-defaults.txt-4.01.
В папке Android SDK также есть файлы, отдельные для рассматриваемого проекта. Я пытался:
-keep class package.name.Constants
а также:
-keepclassmembers class package.name.Constants {
public static final <fields>;
}
и:
-keepclassmembers class package.name.Constants
но, похоже, ничего не работает. Каков правильный способ получить доступ к общедоступным статическим строкам [], используя отражение, с включенным proguard / R8, и какой именно файл я должен на самом деле изменить? :
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
(Я полагаю, что вышеупомянутые файлы ProGuard больше ничего не делают и являются просто устаревшим кодом, который игнорируется в более старых версиях Android / Gradle?)
Я также пробовал @Keep в файле констант:
@Keep
public class Constants{
Ответ №1:
Для всех, у кого может возникнуть эта проблема в будущем, оказывается, мне нужно было очистить, перестроить, затем аннулировать кэш и перезапустить.