本文对混淆器所生效的四个规则来源进行了介绍。
《赠幼骐伯约》
文能提笔安天下,武能上马定乾坤。
心存谋略何人胜,古今英雄唯是君!
-三国,诸葛亮
原文链接:Feeding ProGuard’s inputs: where are all of these rules coming from?
当android应用开启混淆后,混淆使用的规则不仅仅是你指定添加的,还有来自其它资源的规则。下面介绍的四个规则来源需要注意。
开发者显式添加的规则
这个是你在build.gradle文件中使用proguardFile
指定在一个文件中添加的规则。如果你使用混淆,你可能习惯在这添加配置规则。
默认混淆文件
一个以广泛适用的规则集合通过getDefaultProguardFile
添加,你可以在build.gradle模板文件中看到。它保护了一些像Parcelables,View的getters 和 setters(用于开启View属性动画)和所有添加了@Keep
注解的东西。你可以看下这个文件默认添加的混淆规则。当你尝试写混淆规则时这也是很好的示例规则源码。
AAPT生成的规则
当AAPT处理应用的资源,它生成规则用于保护例如:从布局文件引用的View类和清单文件中引用的Activity。每个规则都有一条或多条注释用于说明类在哪被引用,如果需要的话你可以追踪到对应的资源。你可以在这儿找到这些规则:1
build/intermediates/proguard-rules/{buildType}/aapt_rules.txt.
注意这个资源不是显式添加在build.gradle文件,Android gradle插件会负责引入这些规则。
类库的规则
如果应用依赖的类库有混淆配置并且包含在类库中,应用会使用这些混淆配置,类库可以在build.gradle文件中声明这些规则使用consumerProguardFile
。例如,这是Butterknife的build.gradle片段。
合并
不用去追踪添加到应用的混淆规则的每个来源,你可以查看所有的配置。你可以在你的规则文件指定1
-printconfiguration proguard-config.txt
混淆器会输出所有配置规则到指定的文件。注意它不会按照原有指定的顺序,因此可能比较难理解特定的规则来自哪。