我正在使用proguard优化jar,但在优化后崩溃了。 这是我的计划任务:
<proguard>
-injars ${dist}/${jarname}
-outjars ${dist}-proguard/${jarname}
-target 5
-libraryjars '${java.home}/lib/rt.jar'
-dontobfuscate
-optimizationpasses 4
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
-keep public class * {
public static void main(java.lang.String[]);
}
</proguard>
一旦我输入-dontoptimize选项,它就会起作用。
根据异常的堆栈,当使用nullpointer访问类的静态公共成员时,它会崩溃。这是代码:
public static Texture ring, dust, spikering, thinring, crystal, clouds;
public static void init() {
Field [] fields = TexturePool.class.getDeclaredFields();
for (Field field : fields) {
if(field.getType() == Texture.class) {
field.set( null, /*imagine new object here*/ );
}
}
}
谢谢!
答案 0 :(得分:2)
-keepclassmembers public class com.package.** {
public static * ;
}
即使是优化也能正常工作。
答案 1 :(得分:1)
根据Best Java Obfuscation Application For Size Reduction:
“我总是能够通过不使用Proguard参数解决问题”-overloadaggressively“。”
也许你应该尝试一样?
编辑:问题可能很容易就是分配优化了。源代码中发生的初始化(其中定义了一个字段)实际上是由编译器在静态代码blokc中完成的。看来优化对此进行了修补。优化次数减少会发生什么?
答案 2 :(得分:0)
我遇到了与ProGuard相同的问题,即优化了仅使用反射API修改的类字段。但是,建议的答案对我不起作用,因为在代码库中分散了太多类来指定类过滤器。
相反,禁用字段优化对我来说很有用:
-optimizations !field/*