我正在用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选项,它就能正常工作。
根据异常的堆栈,当使用空指针访问类的静态公共成员时,它会崩溃。代码如下:
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*/ );
}
}
}谢谢!
发布于 2009-11-09 23:32:52
好吧,我自己也发现了。我认为优化完全优化了类成员,因为它们不是在这个类中直接访问的。如果我指定选项:
-keepclassmembers public class com.package.** {
public static * ;
}即使在优化的情况下,它也能正常工作。
发布于 2009-11-09 07:19:33
根据Best Java Obfuscation Application For Size Reduction的说法
“我总是能够通过不使用Proguard参数”-overloadaggressively“来解决这个问题。”
也许你也应该试一试?
编辑:问题很容易就是分配被优化掉了。在定义字段的源代码中发生的初始化实际上是由编译器在静态代码块中完成的。似乎优化对此进行了修补。使用更少的优化通道会发生什么?
发布于 2014-11-22 04:27:21
我在ProGuard优化只使用反射API修改的类字段时也遇到了同样的问题。然而,建议的答案对我不起作用,因为代码库中有太多分散在代码中的类,无法指定类过滤器。
取而代之的是,禁用字段优化为我带来了好处:
-optimizations !field/*https://stackoverflow.com/questions/1697025
复制相似问题