我正在优化使用ProGuard一个罐,但它的优化后崩溃。 这里是我的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*/ );
        }
    }
}

谢谢!

有帮助吗?

解决方案

OK,我只是发现了自己。我认为完全优化优化的classmembers了,因为它们不直接在这个类进行访问。如果我指定选项:

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

它的工作原理,即使优化。

其他提示

根据最佳Java应用混淆尺寸减小

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

也许你应该尝试一样吗?


编辑:问题可以很容易地,一个分配优化掉。在源代码,其中一个字段被定义发生的初始化,实际上是由编译器在静态代码blokc完成。看来,优化与修补。用较少的优化过程,会发生什么?

我不得不使用ProGuard优化掉其使用仅反射API修改的类字段中的相同的问题。然而,所建议的答案并没有为我因为有太多的类分散在整个代码库指定类过滤器工作。

相反,禁止现场优化的伎俩对我来说:

-optimizations !field/*
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top