2012-10-16 36 views
29

我目前正試圖混淆一系列圖書館。由於Proguard混淆處理刪除了類型參數,因此我的基本庫(包含多個使用類型參數的類和方法)無法被其他代碼使用。消除混淆可消除這些問題。我已閱讀了所有ProGuard使用說明文檔,示例和疑難解答,但一直未能找到有關如何處理類型參數或ProGuard的哪些方面去除類型參數的任何文檔。如何阻止Proguard刪除類型參數?

構造類型參數問題:

庫1包含以下類:

public abstract class AbstractFactoryFactory<T> 

庫2包含幾類擴展上述類,但構造拋出,指出一個編譯器錯誤:

error: type AbstractFactoryFactory does not take parameters 

返回類型參數問題:

庫1具有以下方法的Foo類:

public List<String> doSomething() 

Libary 2嘗試使用doSomething的方法,但模糊處理之後該方法返回,其產生指出以下編譯器錯誤無類型列表:

error: incompatible types Object 

Proguard.cfg

-dontoptimize 

-renamesourcefileattribute SourceFile 
-keepparameternames 
-keepattributes Exceptions,*Annotation*,InnerClasses,SourceFile,LineNumberTable,Deprecated 

-keep public class * { 
    public protected *; 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keepclassmembernames class * { 
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean); 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 

回答

55

根據ProGuard的Typical Library usage guide

「簽名」屬性是必需的JDK 5.0和更高的編譯時能夠訪問泛型類型。

添加以下行固定我的問題與缺失的類型參數:

-keepattributes Signature 
+0

謝謝! Netty 4庫混淆也需要這一點。 Netty 4中的TypeParameterMatcher失敗,因爲它需要用於構造HttpClientCodec,HttpRequestEncoder或MessageToMessageEncoder以及其他類。我爲面臨類似Netty混淆問題的其他用戶編寫此評論。 –

+9

如何保留特定類別/方法的「簽名」? – Elist

+0

帶我永遠找到問題的根源,但一旦我發現它的答案只是彈出在谷歌! – atoMerz

相關問題