主模块的配置
buildTypes {
release {
minifyEnabled true //是否开启混淆
shrinkResources true //去除无用资源
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
debuggable false //关闭debug
jniDebuggable false //关闭debug
zipAlignEnabled true //zipalign优化
}
子模块的配置
在说子模块之前,我们先要了解一个事情:
主模块的混淆开关配置会直接影响到子模块,也就是说如果你的主模块开启的混淆,就算你的子模块关闭混淆开关,最终子模块还是会被混淆的。
也就是说项目的混淆主要还是取决与主模块是否开启。
子模块配置混淆规则要使用consumerProguardFiles
才能生效
buildTypes {
release {
//minifyEnabled true //是否开启混淆,其实子模块中这个已经没有作用了,由主模块控制
consumerProguardFiles 'proguard-rules.pro' //子模块要用这个命令才能生效
}
混淆的配置技巧
一般来说大致二种方法配置:
1.全部由app模块统一管理,但是这样可能会造成一份很庞大的配置文件
2.各个模块管理自己的混淆配置,由app模块或者base模块配置通用混淆规则。因为系统在打包时会把混淆规则合并。
混淆的通用配置
下面给出一份我在使用的通用混淆配置
#混淆规则参考 https://www.jianshu.com/p/f3455ecaa56e
#keep 保留类和类中的成员,防止被混淆或移除
#keepnames 保留类和类中的成员,防止被混淆,成员没有被引用会被移除
#keepclassmembers 只保留类中的成员,防止被混淆或移除
#keepclassmembernames 只保留类中的成员,防止被混淆,成员没有引用会被移除
#keepclasseswithmembers 保留类和类中的成员,防止被混淆或移除,保留指明的成员
#keepclasseswithmembernames 保留类和类中的成员,防止被混淆,保留指明的成员,成员没有引用会被移除
# >>>>>>>>>>>>>>>----------基本不用动区域---------->>>>>>>>>>>>>>>
#----------------------基本指令区-----------------
# 设置混淆的压缩比率 0 ~ 7
-optimizationpasses 5
# 混淆后类名都为小写 Aa aA
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
#不做预校验的操作
-dontpreverify
# 混淆时不记录日志
-verbose