JavaのProGuardの:最適化後の図書館doesntの仕事
-
18-09-2019 - |
質問
私は、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オプションに入れて、それが動作します。
に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*/ );
}
}
}
ありがとう!
解決
[OK]を、私はちょうど自分自身を見つけました。私は、彼らが直接このクラスにはアクセスされないため、最適化は完全に、classmembersその離れて最適化されたと思います。私はオプションを指定した場合:
-keepclassmembers public class com.package.** {
public static * ;
}
それがさらに最適化で動作します。
他のヒント
-overloadaggressively「私はいつもProGuardの引数を使用しないことで問題を解決することができました 『』。」
おそらく、あなたが同じことを試してみてください!
<時間>編集:問題は簡単に割り当てが離れて最適化されている可能性があります。フィールドが定義されているソースコードで起こっ初期化は、実際に静的コードblokcにコンパイラによって行われます。最適化がそれに手を加えることが表示されます。何が少ない最適化パスとどうなりますか?
私は、ProGuardのと同じ問題が唯一のリフレクションAPIを使用して変更されたクラスのフィールドを離れて最適化しました。クラスフィルタを指定するには、コードベース全体に散らばっあまりにも多くのクラスがあったとしてしかし、提案の答えは私のために動作しませんでした。
その代わり、フィールドの最適化を無効にすると私のためのトリックを行いました
-optimizations !field/*
所属していません StackOverflow