如何在自己的Library中定义ProGuard规则
在Library的build.gradle
中声明ProGuard规则文件,可以通过consumerProguardFiles选项声明ProGuard规则文件的路径:
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
consumerProguardFiles 'proguard-rules.pro' // 也可以是一个数组,声明多个
}
然后在打包Library的时候,Android plugin会把声明的ProGuard规则文件给合并到一个文件中去,最终合并的文件路径是到:build/intermediates/bundles/debug/proguard.txt
,最终proguard.txt
会被打包到aar
中。
备注:可以解压aar
根目录下的proguard.txt
验证混淆规则是否是符合预期的。
最后在编译整包的时候,Android plugin会把aar
的proguard.txt
文件给解压出来,在混淆的时候使用。
扩展
ProGuard规则文件不仅仅可以在defaultConfig中声明,也可以在BuildType
中同时声明:
buildTypes {
debug {
consumerProguardFiles 'proguard-debug-rules.pro'
}
release {
consumerProguardFiles 'proguard-release-rules.pro'
}
}
也可以在Flavor
中同时声明:
productFlavors {
demo {
consumerProguardFiles 'proguard-demo-rules.pro'
}
full {
consumerProguardFiles 'proguard-full-rules.pro'
}
}
最终在不同的BuildType
中和Flavor
中声明的ProGuard规则文件,会根据编译的命令,把ProGuard规则给合并到一个文件中去,也就是我们上面说的build/intermediates/bundles/debug/proguard.txt
。
比如你执行的是assembleDebug
,那么最终:
proguard.txt = proguard-rules.pro(defaultConfig) + proguard-debug-rules.pro(buildTypes[debug])
实现原理
可以通过查看com.android.build.gradle.internal.tasks.MergeProguardFilesConfigAction
这个类来看他的实现原理。
安全混淆用户请注意
由于consumerProguardFiles
是对Android plugin的Proguard起作用,但是接入了安全混淆以后,我们在Android plugin的Proguard阶段已经不做类名混淆了,只做无用方法的裁剪,所以consumerProguardFiles
定义的规则已经不起作用了,需要在main_builder下的mtlplugin/blackmap.dat
文件中进行配置才可以。