atlas-docs/guide-for-use/guide_for_progurad.md
在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文件中进行配置才可以。