如何開啟混淆
eclipse
只需要在工程中找到projiect.properties文件,在這個文件中修改下面一段代碼:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
Android Studio
在對應的module中,找到build.gradle,在該文件中找到buildTypes,將minifyEnabled置成true,這里簡單介紹一下buildTypes:
release {//release對應release編譯,debug對應debug編譯
// 是否進行混淆
minifyEnabled true
// 簽名文件
signingConfig signingConfigs.debug
//對應的混淆文件
proguardFiles 'proguard-rules.pro'
}
其中簽名文件如下:
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "xxxxx"
keyAlias "xxxx"
keyPassword "xxxx"
}
}
接著說混淆,下面介紹混淆的基本配置:
-dontusemixedcaseclassnames:不使用大小寫形式的混淆名
-dontskipnonpubliclibraryclasses:不跳過library的非public的類
-dontoptimize:不進行優化,優化可能會在某些手機上無法運行。
-dontpreverify:不凈行預校驗,該校驗是java平臺上的,對android沒啥用處
-keepattributes *Annotation*:對注解中的參數進行保留
-keep public class com.deep.test.MainActivity 對某個class不進行混淆
-dontshrink 不縮減代碼
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}//保持枚舉類中的屬性不被混淆
-keepclassmemberspublic class *extends android.view.View{
void set*(***);
*** get*();
}不混淆任何view子類的get和set方法。
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}//保持枚舉類中的屬性不被混淆
-keep public class com.ebt.app.common.bean.Customer
//保留某個類名不被混淆
-keep public class com.ebt.app.common.bean.Customer { *;}
//保留類及其所有成員不被混淆
-keep public class com.ebt.app.common.bean.Customer {
static final;
private void get*();
}//只保留類名及其部分成員不被混淆
-keep class com.ebt.app.sync.** { *;}
//保留包路徑下所有的類及其屬性和方法
-keepclassmembers class **.R$* {
public static ;
}//資源類變量需要保留
具體方法介紹:
-keep關鍵字
keep:包留類和類中的成員,防止他們被混淆
keepnames:保留類和類中的成員防止被混淆,但成員如果沒有被引用將被刪除
keepclassmembers:只保留類中的成員,防止被混淆和移除。
keepclassmembernames:只保留類中的成員,但如果成員沒有被引用將被刪除。
keepclasseswithmembers:如果當前類中包含指定的方法,則保留類和類成員,否則將被混淆。
keepclasseswithmembernames:如果當前類中包含指定的方法,則保留類和類成員,如果類成員沒有被引用,則會被移除。
-dontwarn:忽視警告。
-optimizationpasses 5:代碼混淆壓縮比,在0~7之間,默認為5,一般不做修改。
-keepattributes Signature:避免混淆泛型。
-keepattributes SourceFile,LineNumberTable:拋出異常時保留代碼行號
一些符號的解釋說明
<init>構造方法
<field>所有成員
<methods>所有方法
所以所有成員不被混淆可以這么寫
-keepclasseswithmembers class com.ebt.app.common.bean.Customer {
<init>;
<field>;
<methods>;
}
? ?匹配單一的字符
* ?匹配一段字符
% ?匹配基本類型
-libraryjars libs/aaa.jar 不混淆某個jar