天天看點

android keep class,Android混淆快速配置之@Keep

代碼混淆是每個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 **

開始混淆打包,檢視混淆後的結果:

android keep class,Android混淆快速配置之@Keep

WX20170215-161319.png

我們發現TestA不見了而Test保留了下來,說明我們的配置起作用了,下面我們在Test 類中增加點内容看看混淆後會變成什麼樣子,修改後的類内容如下:

@Keep

public class Test {

int age = 20;

protected String sex = "m";

public String name = "CodingMaster";

}

檢視混淆後的結果:

android keep class,Android混淆快速配置之@Keep

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

}

}

重新混淆檢視結果:

android keep class,Android混淆快速配置之@Keep

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注解,重新混淆檢視結果:

android keep class,Android混淆快速配置之@Keep