0

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 を持つクラスの static public メンバーにアクセスするとクラッシュします。コードは次のとおりです。

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

サイズ削減のための最高のJava難読化アプリケーションによると:

「Proguard 引数 "-overloadaggressively" を使用しないことで、常に問題を解決できました。」

おそらく、あなたは同じことを試してみるべきですか?


編集:問題は、割り当てが最適化されていないことです。フィールドが定義されているソースコードで発生する初期化は、実際にはコンパイラによって静的コードブロックで行われます。最適化がそれをいじっているようです。最適化パスが少ないとどうなりますか?

于 2009-11-08T23:19:32.713 に答える
0

リフレクション API のみを使用して変更されたクラス フィールドを最適化する ProGuard と同じ問題がありました。ただし、コードベース全体にクラスフィルターを指定するにはあまりにも多くのクラスが散らばっていたため、提案された答えはうまくいきませんでした。

代わりに、フィールドの最適化を無効にするとうまくいきました。

-optimizations !field/*
于 2014-11-21T20:27:21.157 に答える