2012-10-16 14 views
29

Ich versuche derzeit, eine Reihe von Bibliotheken zu verschleiern. Meine Basisbibliothek, die mehrere Klassen und Methoden enthält, die Typparameter verwenden, kann von anderem Code nicht verwendet werden, da die Typparameter durch Proguard-Verschleierung entfernt wurden. Die Beseitigung der Verschleierung beseitigt diese Probleme. Ich habe alle ProGuard-Nutzungsdokumente, Beispiele und Problemlösungen gelesen, konnte aber keine Dokumentation finden, wie mit Typparametern umzugehen ist oder welcher Aspekt von ProGuard die Typparameter streift.Wie verhindere du, dass Proguard Typparameter entfernt?

Constructor Typ Parameter Ausgabe:

Bibliothek 1 enthält die folgende Klasse:

public abstract class AbstractFactoryFactory<T> 

Library 2 mehrere Klassen enthält, die die obige Klasse erweitern, aber der Konstruktor wirft einen Compiler-Fehler, die besagt:

Rückgabetyp Parameter Ausgabe:

Bibliothek 1 hat eine Foo-Klasse mit der folgenden Methode:

public List<String> doSomething() 

Libary 2 versucht, die doSomething Methode zu verwenden, aber die Methode gibt eine nicht typisierte Liste nach der Verschleierung, die den folgenden Compiler-Fehler erzeugt, die besagt:

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(); 
} 

Antwort

55

Nach dem ProGuard:

Das „Signature“ Attribut ist erforderlich, um generische Typen zuzugreifen, wenn in JDK 5.0 und höher zu kompilieren.

die folgende Zeile hinzufügen fixiert meine Probleme mit fehlenden Typ Parameter:

-keepattributes Signature 
+0

Dank! Dies wird auch für Netty 4 Bibliotheksverschleierung benötigt. TypeParameterMatcher in Netty 4 ist fehlgeschlagen, da es benötigt wird, um HttpClientCodec, HttpRequestEncoder oder MessageToMessageEncoder und wahrscheinlich andere Klassen zu erstellen. Ich schreibe diesen Kommentar für andere Benutzer, die mit ähnlichen Netty Verschleierungsproblemen konfrontiert sind. –

+9

Wie behalten Sie die "Signatur" einer bestimmten Klasse/Methode? – Elist

+0

Nahm mich für immer, um die Wurzel des Problems zu finden, aber sobald ich es gefunden habe, ist die Antwort nur in Google aufgetaucht! – atoMerz

Verwandte Themen