Android Studio混淆
使用Android Gradle
插件3.4.0
或更高版本构建项目时,不再使用ProGuard
执行编译时代码优化,而是与R8编译器
协同工作
开启混淆
在gradle
文件中启用混淆,在混淆配置文件中,getDefaultProguardFile('proguard-android-optimize.txt')
代表sdk目录tools\proguard
路径下的默认混淆配置文件,proguard-rules.txt
代表项目根目录下的开发者自定义混淆配置文件
1 | android { |
混淆命令
命令 | 作用 |
---|---|
-keep | 防止类和成员被移除和被重命名 |
-keepnames | 防止类和成员被重命名 |
-keepclassmembers | 防止成员被移除和被重命名 |
-keepclassmembernames | 防止成员被重命名 |
-keepclasseswithmembers | 防止拥有该成员的类和成员被移除或重命名 |
-keepclasseswithmembernames | 防止拥有该成员的类和成员被重命名 |
-keep
类和类成员均不压缩和混淆。类和类成员在未使用的情况下不被删除,并保留原始名称
1 | -keep class com.test.packagename.Bean { |
-keepnames
允许类和类成员压缩,不允许混淆。类和成员未使用时将会被删除,使用时保留原始名称
1 | -keepnames class com.test.packagename.Bean { |
-keepclassmembers
允许类压缩和混淆,不允许类成员压缩和混淆。类未使用时将被删除,类使用时不保留原始名称,但类成员不会被删除且保留原始名称
1 | -keepclassmembers class com.test.packagename.Bean { |
-keepclassmembernames
允许类压缩和混淆,类成员仅允许压缩不允许混淆。类未使用时将会被删除,类使用时不保留原始名称,类成员未使用是将被删除,类成员使用时保留原始名称
1 | -keepclassmembernames class com.test.packagename.Bean { |
-keepclasseswithmembers
指定的类和类成员不压缩和混淆。被指定的类和类成员在未使用的情况下不被删除,并保留原始名称
1 | # 指定类及所有类成员不被压缩和混淆 |
-keepclasseswithmembernames
指定类和类成员仅允许压缩,不允许混淆。被指定的类和成员在未使用时将会被删除,使用时保留原始名称
1 | # 指定类及所有类成员允许压缩不允许混淆 |
混淆规则
1 | [命令] [修饰符] [类|接口|枚举] [类名|接口名|枚举名] { |
命令规则
仅支持填入保持命令
- -keep
- -keepnames
- -keepclassmembers
- -keepclassmembernames
- -keepclasseswithmembers
- -keepclasseswithmembernames
类规则
类
保持类(接口、枚举也属于类的一种)com.test.packagename.Bean
和类成员不压缩、不混淆
1 | -keep class com.test.packagename.Bean { |
接口
保持接口com.test.packagename.CallBack
和成员不压缩、不混淆
1 | -keep interface com.test.packagename.CallBack { |
枚举
保持枚举com.test.packagename.Param
和成员不压缩、不混淆
1 | -keep enum com.test.packagename.Param { |
支持逻辑非!
不保持com.test.packagename
包下的接口,保持其余所有类、接口、枚举及其成员不压缩、不混淆
1 | -keep !interface com.test.packagename.* { |
修饰符规则
修饰符可以留空,留空则代表同时选中public
和!public
public
仅保持com.test.packagename
下的public
类和类成员不压缩、不混淆
1 | -keep public class com.test.packagename.* { |
!public
仅保持com.test.packagename
包下的非public
类和类成员不压缩、不混淆
1 | -keep !public class com.test.packagename.* { |
类名规则
直接写入
保持类com.test.packagename.Bean
和类成员不压缩、不混淆
1 | -keep class com.test.packagename.Bean{ |
通配符
保持com.test.packagename
包下所有类和类成员不压缩、不混淆
1 | -keep class com.test.packagename.* { |
保持com.test.packagename
包及其子包下所有类和类成员不压缩、不混淆
1 | -keep class com.test.packagename.** { |
继承类、实现接口
保持所有继承了android.app.Activity
的类和类成员不压缩、不混淆
1 | -keep class com.test.packagename.** extends android.app.Activity { |
保持所有实现了java.io.Serializable
的类和类成员不压缩、不混淆
1 | -keep class com.test.packagename.** implements java.io.Serializable { |
内部类
保持类com.test.packagename.Bean
中的所有子类和子类成员不压缩、不混淆
1 | -keep class com.test.packagename.Bean$* { |
成员规则
构造器规则
空参构造器
保持com.test.packagename
包下所有类和类的空参构造器不压缩、不混淆
1 | -keep class com.test.packagename.** { |
任意构造器
保持com.test.packagename
包下所有类和类中构造器不压缩、不混淆
1 | -keep class com.test.packagename.** { |
指定参数构造器
保持com.test.packagename
包下所有类和类中接收String
参数的构造器不压缩、不混淆
1 | -keep class com.test.packagename.** { |
任意参数构造器
保持com.test.packagename
包下所有类和类中接收任意参数的构造器不压缩、不混淆
1 | -keep class com.test.packagename.** { |
方法规则
所有方法
保持com.test.packagename
包下所有类和成员方法不压缩、不混淆
1 | -keep class com.test.packagename.** { |
指定方法
保持com.test.packagename
包下所有类和类中main
方法不压缩、不混淆
1 | -keep class com.test.packagename.** { |
还有访问修饰符、通配符、返回值、接收参数,他妈的不写了
常用规则
关闭压缩
1 | -dontshrink |
关闭代码优化,默认Proguard规则文件已包含
1 | -dontoptimize |
关闭混淆
1 | -dontobfuscate |
指定代码优化级别,值在0-7之间,默认为5
1 | -optimizationpasses 5 |
混淆时不使用大小写混合类名,默认Proguard规则文件已包含
1 | -dontusemixedcaseclassnames |
不忽略库中的非public的类,默认Proguard规则文件已包含
1 | -dontskipnonpubliclibraryclasses |
不忽略库中的非public的类成员
1 | -dontskipnonpubliclibraryclassmembers |
输出详细信息,默认Proguard规则文件已包含
1 | -verbose |
不做预校验,预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度,默认Proguard规则文件已包含
1 | -dontpreverify |
保持指定包下的类名,不包括子包下的类名
1 | -keep class com.test.packagename* |
保持指定包下的类名,包括子包下的类名
1 | -keep class com.test.packagename** |
保持指定包下的类名及其所有成员、方法和字段的命名
1 | -keep class com.test.packagename.* {*;} |
保持所有继承于指定类的类,如下保持所有继承Activity的类
1 | -keep public class * extends android.app.Activity |
简书文章:https://www.jianshu.com/p/c19444e5d3aa
简书文章:https://www.jianshu.com/p/fdadca8e2094
Android 开发者文档:http://developer.android.google.cn/guide/developing/tools/proguard.html
ProGuard 官方文档:https://www.guardsquare.com/manual/home