文章轉自:http://blog.csdn.net/guolin_blog/article/details/50451259
proguard中一共有三組六個keep關鍵字,很多人搞不清楚它們的區別,這裏我們通過一個表格來直觀地看下:
關鍵字 | 描述 |
---|---|
keep | 保留類和類中的成員,防止它們被混淆或移除。 |
keepnames | 保留類和類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除。 |
keepclassmembers | 只保留類中的成員,防止它們被混淆或移除。 |
keepclassmembernames | 只保留類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除。 |
keepclasseswithmembers | 保留類和類中的成員,防止它們被混淆或移除,前提是指名的類中的成員必須存在,如果不存在則還是會混淆。 |
keepclasseswithmembernames | 保留類和類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除,前提是指名的類中的成員必須存在,如果不存在則還是會混淆。 |
除此之外,proguard中的通配符也比較讓人難懂,proguard-android.txt中就使用到了很多通配符,我們來看一下它們之間的區別:
通配符 | 描述 |
---|---|
<field> | 匹配類中的所有字段 |
<method> | 匹配類中的所有方法 |
<init> | 匹配類中的所有構造函數 |
* | 匹配任意長度字符,但不含包名分隔符(.)。比如說我們的完整類名是com.example.test.MyActivity,使用com.*,或者com.exmaple.*都是無法匹配的,因爲*無法匹配包名中的分隔符,正確的匹配方式是com.exmaple.*.*,或者com.exmaple.test.*,這些都是可以的。但如果你不寫任何其它內容,只有一個*,那就表示匹配所有的東西。 |
** | 匹配任意長度字符,並且包含包名分隔符(.)。比如proguard-android.txt中使用的-dontwarn android.support.**就可以匹配android.support包下的所有內容,包括任意長度的子包。 |
*** | 匹配任意參數類型。比如void set*(***)就能匹配任意傳入的參數類型,*** get*()就能匹配任意返回值的類型。 |
… | 匹配任意長度的任意類型參數。比如void test(…)就能匹配任意void test(String a)或者是void test(int a, String b)這些方法。 |