我的名字是马修,在使用ProGuard后,我在安卓系统的反射上遇到了一些困难。
我正在用libgdx编写游戏,我需要动态获取字符串,我有如下所示:
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中添加什么来处理这个问题?这不管用,我不知道该怎么做。
-keepclassmembers class com.PACKAGE.CLASS {
String fileName;
}类的样子如下:
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";
}更新:
多亏了塞尔文,答案是
-keepclassmembers class ANOTHER_PACKAGE.SOME_CLASS {
public static final <fields>;
}在project-proguard.txt中。现在它工作得很好:)
发布于 2014-11-18 12:54:57
在您的proguard.cnf文件中尝试以下操作
-keep public class * extends com.yoursite.android.yourappname.YourClassName
-keepclassmembers class * extends com.yoursite.android.yourappname.YourClassName{
public <init>(android.content.Context);
}https://stackoverflow.com/questions/26994708
复制相似问题