0

我正在用proguard优化一个jar,但优化后它崩溃了。这是我的proguard任务:

    <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*/ );
        }
    }
}

谢谢!

4

3 回答 3

2

好的,我刚刚发现自己。我认为优化完全优化了类成员,因为它们不是在这个类中直接访问的。如果我指定选项:

        -keepclassmembers public class com.package.** {
            public static * ;
        }

它甚至可以优化。

于 2009-11-09T15:32:52.163 回答
1

根据Best Java Obfuscation Application For Size Reduction

“我总是能够通过不使用 Proguard 参数“-overloadaggressively”来解决问题。”

也许你应该尝试同样的方法?


编辑:问题很可能是优化了分配。在定义字段的源代码中发生的初始化实际上是由编译器在静态代码块中完成的。似乎优化对此进行了修补。优化次数越少会发生什么?

于 2009-11-08T23:19:32.713 回答
0

我在使用 ProGuard 优化仅使用反射 API 修改的类字段时遇到了同样的问题。但是,建议的答案对我不起作用,因为在整个代码库中分散了太多的类来指定类过滤器。

相反,禁用字段优化对我有用:

-optimizations !field/*
于 2014-11-21T20:27:21.157 回答