微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android Proguard / R8反射错误:NoSuchFieldException

如何解决Android Proguard / R8反射错误:NoSuchFieldException

我有一个很大的Constants类,我需要使用反射来从中获取静态String数组。

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的情况下,使用反射访问公用静态String []的正确方法是什么,我实际上应该确切地修改哪个文件? :

            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'

(我相信上面的proguardFiles不再执行任何操作,而只是旧版本的Android / Gradle中忽略的旧代码?)

我也在常量文件中尝试过@Keep:

@Keep
public class Constants{

解决方法

对于将来可能遇到此问题的其他任何人,原来我需要清理,重建,然后使缓存无效并重新启动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。