增強APP的安全性(二) –通過混淆
ProGuard的常用語法
# 指定代碼的壓縮級別
-optimizationpasses 5
# 是否使用大小寫混合 混淆時不會產生形形色色的類名
-dontusemixedcaseclassnames
# 是否混淆第三方jar
-dontskipnonpubliclibraryclasses
# 混淆時是否做預校驗
-dontpreverify
# 混淆時是否記錄日誌
-verbose
# 不優化輸入的類文件
-dontoptimize
#不提示警告
-dontwarn [class_filter]
#應用的依賴包,如android-support-v4
-libraryjars class <path>
#不混淆某些類
-keep [,modifier,...] class <specification>
#不混淆類的成員
-keepclassmembers [,modifier,...] class <specification>
#不混淆類及其成員
-keepclasseswithmembers [,modifier,...] class <specification>
#不混淆類及其成員名
-keepnames class <specification>
#不混淆類的成員名
-keepclassmembernames class <specification>
#不混淆類及其成員名
-keepclasseswithmembernames class <specification>
#假設調用不產生任何影響,在proguard代碼優化時會將該調用remove掉。如system.out.println和Log.v等等
-assumenosideeffects class <specification>
通配符
類名、成員函數名、和成員變量名可以試用一下通配符:
1) % :匹配任何原始類型,如 boolean 、 int 等,但不包括 void ;
2) ? :匹配一個任意字符,不包括句號;
3) * :匹配任意個任意字符,不包括句號;
4) ** :匹配任意個任意字符,包括句號;
5) * :匹配任意類型,包括原始類型和非原始類型,數組類型和非數組類型;
6) … :匹配任何數目個任何類型的參數。
關鍵字
在類名前、類中成員變量和成員函數名前,可以加上訪問限定符(如 public 、 private 、 protected 等,修飾類、成員變量和成員函數的訪問限定符各不相同)。如果加上了訪問限定符後,就表示要匹配的類、成員變量或成員函數的定義中必須包含這些限定符。如果在限定符前面加上感嘆號“ ! ”,則剛好相反,定義中必須不包含這些限定符
extends 和 implements 表示限定類一定要擴展自一個指定類或者實現了一個指定接口類,這時候通常類名部分是一個星號。
示例
1.不混淆某個實體類或者某個包名下所有的類
#不混淆class com.test.Person這個類
-keep class com.test.Person {*;}
#不混淆class com.test這個包名下的所有類
-keep class com.test.** { *; }
2.不混淆類的成員
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
3不混淆類名及其成員
-keepclasseswithmembernames com.test.Person{
public boolean *(java.lang.String,android.view.View);
}
# 保持該類名和native 方法不被混淆
-keepclasseswithmembernames class * {
native ;
}
在Android Studio中配置混淆文件
buildTypes {
release {
...
// 移除無用的resource文件
shrinkResources true
zipAlignEnabled true
//混淆
minifyEnabled true
#proguard-rules.pro就是你項目裏的混淆配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
...
}
}