2016-07-25 36 views
5

我有一組類(超過50個),其中包含幾個稱爲parse()的靜態方法,該方法返回該類的一個實例。這是這些類的一個示例:如何配置Proguard以保持不同返回時間的靜態方法

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(...) { ... } 
    ... 
} 

我想配置ProGuard的混淆這些類及其所有的方法和字段除了parse(...)方法。基本上,我想混淆類名稱,所有靜態和非靜態方法,再加上類字段。

我試着使用:

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

並且對於SomeType工作得很好,但我不希望有寫這個規則對每一個我50班...所以我怎麼能一般化它?

我想:

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

但ProGuard的抱怨返回類型的語法...

回答

8

您的規則幾乎是正確的,只是用***作爲返回類型,這將匹配任何類型:

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

另外-keepclassmembers-keepclasseswithmembers更受歡迎,因爲它只會保留您指定的方法,而不是類本身(在您描述的情況下可能不需要您的情況)。

如果您有解析方法不止一個說法,你應該使用:

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

...將匹配任何任何類型的參數個數。

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