首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ProGuard on Android + reflection = NoSuchFieldException

ProGuard on Android + reflection = NoSuchFieldException
EN

Stack Overflow用户
提问于 2014-11-18 12:46:21
回答 1查看 4.3K关注 0票数 3

我的名字是马修,在使用ProGuard后,我在安卓系统的反射上遇到了一些困难。

我正在用libgdx编写游戏,我需要动态获取字符串,我有如下所示:

代码语言:javascript
复制
package com.PACKAGE;

    public class CLASS extends ANOTHER_CLASS{

        (...)

    private static void load(String fieldName) {
        Field field;
        String fileName;
        try {
            field = SOME_CLASS.class.getField(fieldName);
            fileName = (String) field.get(null);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }

         SOME_CLASS.SOME_METHOD.load(fileName);

    }

(...)

    private STH get(String fieldName) {
        Field field;
        String fileName;
        try {
            field = SOME_CLASS.class.getField(fieldName);
            fileName = (String) field.get(null);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }

         return SOME_CLASS.SOME_METHOD.get(fileName);

    }

(...)

}

导出发行版apk (编译好)并运行游戏之后,我得到了NoSuchFieldException:

java.lang.RuntimeException: java.lang.NoSuchFieldException: FIELD_NAME

我需要在proguard-project.txt中添加什么来处理这个问题?这不管用,我不知道该怎么做。

代码语言:javascript
复制
-keepclassmembers class com.PACKAGE.CLASS { 
    String fileName;
}

类的样子如下:

代码语言:javascript
复制
package com.ANOTHER_PACKAGE;
public class SOME_CLASS {
    public static final String fieldName1 = "string I want";
    public static final String fieldName2 = "string I want";
    public static final String fieldName3 = "string I want";
}

更新:

多亏了塞尔文,答案是

代码语言:javascript
复制
-keepclassmembers class ANOTHER_PACKAGE.SOME_CLASS { 
    public static final <fields>; 
}

project-proguard.txt中。现在它工作得很好:)

EN

回答 1

Stack Overflow用户

发布于 2014-11-18 12:54:57

在您的proguard.cnf文件中尝试以下操作

代码语言:javascript
复制
-keep public class * extends com.yoursite.android.yourappname.YourClassName

-keepclassmembers class * extends com.yoursite.android.yourappname.YourClassName{
 public <init>(android.content.Context);
}

参考文献:Proguard and reflection in Android

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26994708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档