Ошибка отражения Android Proguard / R8: исключение NoSuchFieldException

#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:

Для всех, у кого может возникнуть эта проблема в будущем, оказывается, мне нужно было очистить, перестроить, затем аннулировать кэш и перезапустить.