Android-代碼混淆

文章轉自: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)這些方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章