Android 混淆压缩开启以及自定义混淆规则

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
  • * 、 都是通配符,看下面的过滤器
  • 写类名包名必须要写全,比如 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个通配符一致的内容
如com.example.proguarddemo..To<2>
可匹配 com.example.proguarddemo.bean.UserToUser


-->字段和方法名过滤器
-->匹配所有构造方法
-->匹配所有字段
-->匹配所有方法
* -->匹配所有方法和字段,包括构造方法
? -->匹配方法名称中的任何单个字符
-->匹配和第n个通配符一致的内容

-->类型过滤器(参数类型,返回值类型,属性类型)
% -->匹配所有基本类型
? -->匹配类名中的任何单个字符
* -->匹配不包含包分隔符的类名的任何部分
** -->匹配类名的任何部分,可能包含任意数量的包分隔符
***-->匹配所有任何类型,只有三个***才能表示void
...-->匹配任何类型任何数量的参数
-->匹配和第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

你可能感兴趣的:(Android 混淆压缩开启以及自定义混淆规则)