2016-07-25 9 views
5

Ich habe eine Reihe von Klassen (mehr als 50), die einige statische Methoden namens parse() enthalten, die eine Instanz dieser Klasse zurückgibt. Dies ist ein Beispiel für eine dieser Klassen:Wie konfiguriere ich Proguard, um statische Methoden mit unterschiedlichen Rückgabezeiten zu halten?

class SomeType { 

    // Parse methods 
    public static SomeType parse(String text) { ... } 
    public static SomeType parse(Object obj) { ... } 
    ... 

    // Other methods 
    public void static somethingStatic(...) { ... } 
    public void somethingNotStatic(...) { ... } 
    ... 
} 

Ich versuche ProGuard zu konfigurieren, dass diese Klassen zu verschleiern und alle ihre Methoden und Felder außer die parse(...) Methoden. Grundsätzlich möchte ich den Klassennamen, alle statischen und nicht statischen Methoden sowie die Klassenfelder verschleiern.

Ich habe zu verwenden versucht:

-keepclassmembers class SomeType { 
    public static SomeType parse(***); 
} 

und arbeitete für SomeType in Ordnung, aber ich will nicht diese Regel ... für jeden meiner 50 Klassen so zu schreiben haben, wie kann ich verallgemeinern?

Ich habe versucht:

-keepclassmembers class ** { 
    public static * parse(***); 
} 

aber ProGuard beschwert sich über die Syntax der Rückgabetyp ...

Antwort

8

Die Regel war fast richtig, verwenden Sie einfach *** als Rückgabetyp, der passt auf jeden Typ:

-keepclassmembers class ** { 
    public static *** parse(***); 
} 

Auch -keepclassmembers wird gegenüber -keepclasseswithmembers bevorzugt, da es nur die von Ihnen angegebenen Methoden enthält und nicht die Klasse selbst (was in Ihrem Fall wahrscheinlich nicht benötigt wird, wie Sie beschreiben).

Wenn Sie mehr als ein Argument für die Parse-Methoden haben, sollten Sie verwenden:

-keepclassmembers class ** { 
    public static *** parse(...); 
} 

Die ... übereinstimmen jede Anzahl der Argumente von jeder Typ.

2
-keepclasseswithmembers class * { 
    public static *** parse(***); 
}