1. app module下build文件开启代码混淆和资源压缩
通过minifyEnabled=true开启混淆,shrinkResources=true开启资源压缩,混淆会增加编译时间,一般release才会开启 资源压缩之前应先开启混淆,不然会编译不通过 未混淆的debug包和已混淆的release包2.自定义混淆规则
1. -keep[,修饰符,...] class_specification,keep混淆命令的模板,修饰符可以暂时不管,因为[]表示可选的;class_specification是对类以及类成员的描述,看下图
- [] 标识可选。
- | 表示 ‘或’ 的意思只能取一个。
- ...表示可以有多个,简单举个例子 [[!]public|private|protected|static ... ] 可以包含 public * >static 这两个,从 Java 的角度理解也不难。
- {} 大括号是实实在在的大括号。
- () 就是实实在在的括号,没有什么其他意思。
- ! 表示 ’否‘ ,例如:!class 规则匹配表示不能是这个 class
- * 、 <fields> 、 <init> 、 <methods> 都是通配符,看下面的过滤器
- 写类名包名必须要写全,比如 String 要写 java.lang.String
-->类名过滤器
?-->可匹配任何除包名分隔符之外的一个字符
如com.example.proguarddemo.bean.U?er
可匹配com.example.proguarddemo.bean.User,com.example.proguarddemo.bean.U1er
不可匹配com.example.proguarddemo.bean.Usser,
com.example.proguarddemo.bean.Uer,com.exampl*-->匹配任意一部分除包名分隔符之外的连续字符
如com.example.proguarddemo.bean.*
可匹配 com.example.proguarddemo.bean.User,
com.example.proguarddemo.bean.Usser,
com.example.proguarddemo.bean.Uer
不可匹配com.example.proguarddemo.bean.U.er,
com.example.proguarddemo.bean.order.OrderDetail**-->匹配任意一部分连续的字符,包括了包名分隔符 ⚠️.A应该能唯一确定一个A类,否则无效
如com.example.proguarddemo.bean.
可匹配 com.example.proguarddemo.bean.User,
com.example.proguarddemo.bean.Usser,
com.example.proguarddemo.bean.Uer
om.example.proguarddemo.bean.U.er,
com.example.proguarddemo.bean.order.OrderDetail<n>-->匹配和第n个通配符一致的内容
如com.example.proguarddemo..To<2>
可匹配 com.example.proguarddemo.bean.UserToUser
-->字段和方法名过滤器
<init> -->匹配所有构造方法
<fields> -->匹配所有字段
<methods>-->匹配所有方法
* -->匹配所有方法和字段,包括构造方法
? -->匹配方法名称中的任何单个字符
<n> -->匹配和第n个通配符一致的内容-->类型过滤器(参数类型,返回值类型,属性类型)
% -->匹配所有基本类型
? -->匹配类名中的任何单个字符
* -->匹配不包含包分隔符的类名的任何部分
** -->匹配类名的任何部分,可能包含任意数量的包分隔符
***-->匹配所有任何类型,只有三个***才能表示void
...-->匹配任何类型任何数量的参数
<n>-->匹配和第n个通配符一致的内容注:?,* 和 ** 通配符不可以匹配原始类型,比如:int,float。
包装类和普通类是可以匹配的,比如:Integer,String
2. -keep命令基本用法: 指定某个包,类,方法,变量和属性不混淆
####################keep管理类及类的成员#####################
#不混淆类名,但类的方法,属性,变量会被混淆
-keep public class com.example.androidlibrary.utils.image.Image?tils{
% length;
}
#注意-->子包及子包下的类仍然会被压缩混淆
-keep public class com.example.androidlibrary.utils.*{
*;
}
-keep public class **.Demo{
* get*();
*** set*();
}
#这个貌似不起作用呀???
-keep public class com.example.androidlibrary.bean.*To<1>
#不混淆接口 class 可指代类和接口,枚举,interface 只指接口,emum指代枚举
-keep class com.example.androidlibrary.callback.Callback
-keep interface com.example.androidlibrary.callback.HttpCallBack
-keep class com.example.androidlibrary.Sex
-keep class com.example.androidlibrary.**.OrderDetail
#保留注解类
-keep class android.support.annotation.Keep
#保留有某个注解的类
-keep @android.support.annotation.Keep class * {*;}
#不混淆实现或继承了某个父类的子类,extends,implements是等效的
-keep class ** extends **.Callback
-keep class ** implements **.Parent
####################keep管理类及类的成员#####################
3.自定义混淆字典:替换默认的混淆字典,
#自定义混淆字典,自定义混淆字典虽然可以装逼, #但如果混淆字典是符号或者中文,无法通过mapping.txt恢复混淆的堆栈日志 #目前测试只有英文字母的Java关键字混淆字典是可以的 -obfuscationdictionary -packageobfuscationdictionary -classobfuscationdictionary
Java关键词:https://github.com/RockyQu/ProguardDictionary
神奇的字符 https://github.com/o2e/ProguardDictionaryGenerator
中文 https://github.com/WrBug/FrenziedProguard
4.保持源码的行号、源文件信息不被混淆 方便在崩溃日志中查看
#保持源码的行号、源文件信息不被混淆 方便在崩溃日志中查看 -keepattributes SourceFile,LineNumberTable
网友评论