2009-11-08 36 views
0

我正在使用proguard優化jar,但優化後崩潰。 這裏是我的proguard的任務:java 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*/); 
     } 
    } 
} 

的感謝!

+0

我真的不能相信訪問(檢索,或者你的意思是別的東西)的成員將拋出一個NullPointerException。你的意思是說成員可以被訪問,但它本身是空的,所以當試圖使用成員時拋出NullPointerException?如果是這樣,預期值從哪裏來? – jarnbjo 2009-11-08 19:28:43

+0

謝謝,以及該成員初始化我訪問它之前調用的函數。 – clamp 2009-11-08 20:17:53

+0

我問過這個問題,但你爲什麼不介意告訴我們_exactly_出錯了? NullPointerException的原因是什麼?訪問成員時發生一些VM內部錯誤(因爲您的帖子似乎暗示)或者僅僅是成員爲空,所以當您嘗試訪問成員實例時會引發NullPointerException? – jarnbjo 2009-11-08 21:48:41

回答

2

好吧,我剛剛發現了我自己。我認爲優化完全優化了班級成員,因爲他們不是直接訪問這個班級。如果我指定選項:

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

它甚至可以優化。

1

根據Best Java Obfuscation Application For Size Reduction

「我總是能夠通過不使用Proguard的參數來解決這個問題‘-overloadaggressively’。」

也許你應該嘗試一樣?


編輯:問題可能很容易就是一個任務被優化了。在定義字段的源代碼中發生的初始化實際上是由編譯器在靜態代碼blokc中完成的。看起來,優化與此鼓搗。減少優化通行證會發生什麼?

+0

謝謝,但即使我不放過度衝突選項,我得到同樣的崩潰。 – clamp 2009-11-09 11:23:55

+0

可愛的。有時間調整選項。你_必須混淆? – 2009-11-09 11:44:00

+0

謝謝!嗯,只有當我指定0優化通行證,它的工作原理: - 優化通過0 – clamp 2009-11-09 12:58:30

0

我與ProGuard優化掉了僅使用反射API修改的類字段相同的問題。但是,建議的答案對我來說不起作用,因爲散佈在整個代碼庫中的類太多,無法指定類過濾器。

相反,禁止現場優化爲我做的伎倆:

-optimizations !field/*