java proguard:优化后库不起作用

时间:2009-11-08 16:21:17

标签: java optimization obfuscation proguard

我正在使用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*/ );
        }
    }
}

谢谢!

3 个答案:

答案 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/*