增强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'
...
}
}