如何在自己的Library中定义ProGuard规则

在Library的build.gradle中声明ProGuard规则文件,可以通过consumerProguardFiles选项声明ProGuard规则文件的路径:

  1. defaultConfig {
  2. minSdkVersion 16
  3. targetSdkVersion 25
  4. consumerProguardFiles 'proguard-rules.pro' // 也可以是一个数组,声明多个
  5. }

然后在打包Library的时候,Android plugin会把声明的ProGuard规则文件给合并到一个文件中去,最终合并的文件路径是到:build/intermediates/bundles/debug/proguard.txt,最终proguard.txt会被打包到aar中。

备注:可以解压aar根目录下的proguard.txt验证混淆规则是否是符合预期的。

最后在编译整包的时候,Android plugin会把aarproguard.txt文件给解压出来,在混淆的时候使用。

扩展

ProGuard规则文件不仅仅可以在defaultConfig中声明,也可以在BuildType中同时声明:

  1. buildTypes {
  2. debug {
  3. consumerProguardFiles 'proguard-debug-rules.pro'
  4. }
  5. release {
  6. consumerProguardFiles 'proguard-release-rules.pro'
  7. }
  8. }

也可以在Flavor中同时声明:

  1. productFlavors {
  2. demo {
  3. consumerProguardFiles 'proguard-demo-rules.pro'
  4. }
  5. full {
  6. consumerProguardFiles 'proguard-full-rules.pro'
  7. }
  8. }

最终在不同的BuildType中和Flavor中声明的ProGuard规则文件,会根据编译的命令,把ProGuard规则给合并到一个文件中去,也就是我们上面说的build/intermediates/bundles/debug/proguard.txt

比如你执行的是assembleDebug,那么最终:

  1. 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文件中进行配置才可以。