1、为什么要在AAR中独立配置混淆文件
我们的工程中有很多的aar,我们希望别人在使用我们的aar的时候不用像使用jar包一样还要再进行相应的混淆配置。同时为了使每个aar库自己维护自己的混淆配置,不再主工程中统一配置,方便代码的维护和修改。
2、在AAR中独立配置混淆文件的方法
2.1、Android 对aar独立配置自己混淆文件的支持
Android 在构建apk的时候,会把每一个aar中的混淆配置文件读取出来,作为总的混淆配置文件,然后以这个总的混淆配置表对全部的Java代码进行混淆。因此只要我们的aar中包含了混淆配置文件,那么这个aar在打包到apk的时候,其自带的混淆配置就会对全部的Java代码生效。因此Android是支持aar独立配置自己混淆文件的,只要aar中包含混淆配置文件即可。
2.2、gradle 中的将混淆文件打包到aar中的方法
默认情况下,我们使用Android studio 的gradle 打包方式生成的aar文件中是不包含混淆配置的,因此我们需要使用gradle的consumerProguardFiles方法将混淆文件打包到aar中。这个方法一般在defaultConfig中进行配置:
consumerProguardFiles方法接收打参数是一个文件(混淆文件)的数组,因此我们在使用consumerProguardFiles方法的时候,可以有如下几种写法:
a、单一的混淆配置文件:
consumerProguardFiles 'proguard.pro'
b、多个混淆配置文件:
consumerProguardFiles 'proguard-a.pro','proguard-b.pro'
或
consumerProguardFiles fileTree(dir: projectDir, include: 'proguard*')
2.3、consumerProguardFiles方法原理
默认我们打的aar中是没有混淆配置文件的,但是使用consumerProguardFiles方法后我们解压我们的aar会发现其中多了一个proguard.txt文件:
打开这个proguard.txt你会发现里面的内容和我们写的混淆配置是一样的。
如果consumerProguardFiles 后面传入了多个混淆配置文件,最终生成的aar中也仅仅只有一个proguard.txt文件,多个proguard*文件是内容merge到这个proguard.txt文件中的。比如
我导入了两个.pro文件,分别是(两个文件中的配置内容相同,都是“-keep class **.model.** { *; }”):
consumerProguardFiles'proguard-rules.pro','proguard-new-rules.txt'
那么最终的proguard.txt文件内容如下:
3、混淆文件拆分后注意点
3.1、我们aar中的混淆配置在打包到apk中是对全部apk中的Java代码的混淆配置生效的,如果某个aar的混淆配置中包含dontobfuscate配置指令,那么我们的apk将不会混淆。
3.2、如果我们某个aar A中包含对其引用jar包的混淆配置,当jar包移位到其他aar B中时,最好把混淆配置也一并移位。如果jar对应的混淆配置不移位的话,我们一旦配置一个功能分支不引入此aar A,那么我们最终打包的apk中关于此jar是进行了混淆的,运行时可能会出错。
3.3、我们的aar可能是不稳定的,随着版本的迭代可能需要把aar A中的一些代码移到aar B中,此时也需要进行相应的混淆配置移动。否则也会出现3.2中的问题。