gradle中开启混淆
build.gradle
中配置以下内容
minifyEnabled true //混淆编译
//前一部分代表系统默认的android程序的混淆文件 , 该文件已经包含了基本的混淆声明
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
其中proguard-android.txt为Google为我们提供的一些默认混淆配置,目录是\SDK\tools\proguard\proguard-rules.pro是我们添加的一些自定义混淆配置项。
凡是需要在AndroidManifest.xml中去注册的所有类的类名以及从父类重写的方法名都自动不会被混淆。
关键字
关键字 | 描述 |
---|---|
-keep {Modifier} {class_specification} | 保留指定类和类中的成员,不会被混淆或移除 |
keepnames {Modifier} {class_specification} | 保留指定类和类中的成员,不会被混淆,当成员或类没有被引用时会被移除。 |
keepclassmembers {Modifier} {class_specification} | 保留指定类中的成员,不被混淆或移除,类没有被引用时会被移除。 |
keepclassmembernames {Modifier} {class_specification} | 保留类中的成员,不被混淆,类或成员没有被引用时会被移除。 |
keepclasseswithmembers {Modifier} {class_specification} | 保留指定类和类中指定的成员,不被混淆或移除,前提是指定的成员必须存在。 |
keepclasseswithmembernames {Modifier} {class_specification} | 保留指定类和类中指定的成员,不被混淆,前提是指定的成员必须存在且被引用 |
##保护com.alibaba下的所有类,不会被混淆和移除
-keep class com.alibaba.**
##保护com.alibaba下的所有类和成员,不会被混淆和移除
-keep class com.alibaba.**{*;}
##保护ModelC类,ModelC没有被引用时,还是会被移除
-keepnames class com.jeney.deeplinkdemo.ModelC
##保护ModelC类和所有成员,ModelC或成员没有被引用时,还是会被移除
-keepnames class com.jeney.deeplinkdemo.ModelC{*;}
##保护ModelA中的所有成员,ModelA没有被引用时,类还是会被移除
-keepclassmembers class com.jeney.deeplinkdemo.ModelA{*;}
##保护ModelA中的所有成员,ModelA没有被引用时,类还是会被移除,ModelA中没有被引用的成员也会被移除
-keepclassmembernames class com.jeney.deeplinkdemo.ModelA{*;}
##如果ModelA中有成员方法*** abc(***),保护ModelA和成员方法*** abc(***),不会被混淆和移除
-keepclasseswithmember class com.jeney.deeplinkdemo.ModelA{
*** abc(***);
}
##如果ModelA中有成员方法*** abc(***)且该成员方法被引用,保护ModelA和成员方法*** abc(***),不会被混淆和移除
-keepclasseswithmember class com.jeney.deeplinkdemo.ModelA{
*** abc(***);
}
通配符
通配符 | 描述 |
---|---|
<field> | 匹配类中的所有字段 |
<method> | 匹配类中的所有方法 |
<init> | 匹配类中的所有构造函数 |
* | 匹配任意长度字符,但不含包名分隔符(.)。比如说我们的完整类名是com.example.test.MyActivity,使用 com.* ,或者com.exmaple.* 都是无法匹配的,因为*无法匹配包名中的分隔符,正确的匹配方式是com.exmaple.*.*,或者com.exmaple.test.* ,这些都是可以的。但如果你不写任何其它内容,只有一个*,那就表示匹配所有的东西。 |
** | 匹配任意长度字符,并且包含包名分隔符(.)。比如proguard-android.txt中使用的-dontwarn android.support.**就可以匹配android.support包下的所有内容,包括任意长度的子包。 |
*** | 匹配任意参数类型。比如void set*(***) 就能匹配任意传入的参数类型,*** get*()就能匹配任意返回值的类型。 |
… | 匹配任意长度的任意类型参数。比如void test(…)就能匹配任意void test(String a)或者是void test(int a, String b)这些方法。 |
-keepclassmembers class com.jeney.model.** {
*** <fields>;
*** <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
consumerProguardFiles
当一个app包含多个module时,把所有的混淆规则都配置在主项目里不够灵活。
解决的办法是,在单个module的 build.gradle
中的 defaultConfig
下配置混淆规则文件 consumerProguardFiles 'proguard-a.pro', 'proguard-b.pro'
。