代碼混淆是每個java程式猿的必修課,但是為項目寫混淆配置檔案是一件痛苦的事情,關鍵字比較多不太好記憶,而且一旦配置好很長時間内都不需要修改,也許當時記得,過後慢慢就忘記了。那不配置混淆行不行呢?答案肯定是不行的,因為你要面對虎視眈眈的同行還有行業内的各種黑暗的利益鍊條,不混淆就釋出幾乎等于将自己的工作成果拱手讓人。那你可能會問那我混淆了就可以確定萬無一失了?我隻能殘酷的告訴你:NO!雖然說混淆不能保證你的代碼的100%安全但是這是通往代碼安全之路的第一步。下面來講解如何為我們的項目快速的配置混淆。Keep Options 保持不變的選項,簡單點說就是保持哪些類或者哪些元素不被混淆,“keep家族”就是幫我們做這件事情的。
-keep [,modifier,...] class_specification
保持class_specification規則;若有[,modifier,...],則先啟用它的規則
用法示例:
#不混淆實作android.os.Parcelable的類
-keep class * implements android.os.Parcelable
-keepclassmembers [,modifier,...]class_specification
保持類的成員:屬性(可以是成員屬性、類屬性)、方法(可以是成員方 法、類方法)
-keepclasseswithmembers [,modifier,...] class_specification
與-keep功能基本一緻(經測試)
-keepnames class_specification
可以說是 -keep,allowshrinking class_specification的簡化版
-keepclassmembernames class_specification
Short for -keepclassmembers,allowshrinking class_specification
-keepclasseswithmembernames class_specification
Short for -keepclasseswithmembers,allowshrinking class_specification1-printseeds [filename]`
列印比對的-keep家族處理的 類和類成員清單,到标準輸出。用Proguard 指令行,能看到輸出效果(未測試)@Keep
在使用@Keep注解之前我們需要先導入
compile 'com.android.support:support-annotations:25.1.1'類庫
使用方法非常簡單,可以注解在類,方法和變量,總結起來就是一句話哪裡不想被混淆就注解哪裡。
3.實戰
以上算是基礎知識,下面示範如何在實際生産環境中應用它們,下面我們建立一個測試工程,打開android studio建立一個android工程,目錄結構如下:
建立要被混淆的類:�
@Keep
public class Test {
}
public class TestA {
}
在混淆腳本中添加如下内容:
#列印混淆資訊
-verbose
#代碼優化選項,不加該行會将沒有用到的類删除,這裡為了驗證時間結果而使用,在實際生産環境中可根據實際需要選擇是否使用
-dontshrink
-dontwarn android.support.annotation.Keep
#保留注解,如果不添加改行會導緻我們的@Keep注解失效
-keepattributes *Annotation*
-keep @android.support.annotation.Keep class **
開始混淆打包,檢視混淆後的結果:

WX20170215-161319.png
我們發現TestA不見了而Test保留了下來,說明我們的配置起作用了,下面我們在Test 類中增加點内容看看混淆後會變成什麼樣子,修改後的類内容如下:
@Keep
public class Test {
int age = 20;
protected String sex = "m";
public String name = "CodingMaster";
}
檢視混淆後的結果:
WX20170215-162637.png
不幸的是雖然類名保留下來了,但是裡面的内容卻被混淆了,如果我們想把name變量不被混淆怎麼辦呢?不急,我們修改我們的混淆腳本内容如下:
#列印混淆資訊
-verbose
#代碼優化選項,不加該行會将沒有用到的類删除,這裡為了驗證時間結果而使用,在實際生産環境中可根據實際需要選擇是否使用
-dontshrink
-dontwarn android.support.annotation.Keep
#保留注解,如果不添加改行會導緻我們的@Keep注解失效
-keepattributes *Annotation*
-keep @android.support.annotation.Keep class **{
@android.support.annotation.Keep ;
}
我們繼續修改Test類,這次我們多加了點東西,會在後面用到,内容如下:
@Keep
public class Test {
int age = 20;
@Keep
protected String sex = "m";
@Keep
public String name = "CodingMaster";
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private void cry(){
}
}
重新混淆檢視結果:
WX20170215-172247.png
哈哈我們的name變量被成功的保留了,同理如何保留被sex變量呢?這裡就不買關子了,直接給出答案,為sex添加@Keep注解就可以了,持懷疑态度的同學👨🎓可以自己去驗證。
細心的同學可能已經發現,Test類裡面的方法都被混淆了,怎樣指定某個方法不被混淆呢?
繼續修改混淆檔案:
#列印混淆資訊
-verbose
#代碼優化選項,不加該行會将沒有用到的類删除,這裡為了驗證時間結果而使用,在實際生産環境中可根據實際需要選擇是否使用
-dontshrink
-dontwarn android.support.annotation.Keep
#保留注解,如果不添加改行會導緻我們的@Keep注解失效
-keepattributes *Annotation*
-keep @android.support.annotation.Keep class **{
@android.support.annotation.Keep ;
@android.support.annotation.Keep ;
}
然後為cry()方法添加@Keep注解,重新混淆檢視結果: