在公司的SDK项目中,需要接入不同的三方SDK。我的实现方式是为每个SDK建立一个单独的module,主项目可以按需接入module。
最近新接入了一个SDK,在测试的时候发现了一个问题。由于每个module都会做混淆,基础的混淆规则都是用abc来替换包名、类名、方法名,因此出现了冲突,如下图:
这个问题其实可以通过混淆配置中的混淆字典来解决,字典有如下三种:
- obfuscationdictionary(混淆字典)
- classobfuscationdictionary(类混淆字典)
- packageobfuscationdictionary(包混淆字典)
初步尝试
在module的app目录下新建default_dictionary.txt文件,并且在proguard-rules.pro中配置。
-obfuscationdictionary default_dictionary.txt
-classobfuscationdictionary default_dictionary.txt
-packageobfuscationdictionary default_dictionary.txt
发布后在项目中引入依赖包后可以看到已经生效了:
然而,在安装调试时,又发生了异常:
根据异常提示,是缺少了刚刚创建的default_dictionary.txt的问题。也确实没有在aar中看见该文件,因此只要将该文件一起打包进aar即可。
进一步尝试
打包aar时,assets文件夹中的文件也会一起打包。基于此进行了进一步尝试。
首先在项目的根目录创建assets文件夹并将default_dictionary.txt放在该文件夹下,如图:
然后在build.gradle中配置assets,代码如下:
android {
sourceSets {
main {
assets.srcDirs = [ "assets" ]
}
}
}
proguard-rules.pro文件中也需要调整一下
-obfuscationdictionary assets/default_dictionary.txt
-classobfuscationdictionary assets/default_dictionary.txt
-packageobfuscationdictionary assets/default_dictionary.txt
发布后在项目中引入依赖包后,安装调试已经可以编译通过。