Android 混淆冲突问题

1,490 阅读1分钟

在公司的SDK项目中,需要接入不同的三方SDK。我的实现方式是为每个SDK建立一个单独的module,主项目可以按需接入module。

最近新接入了一个SDK,在测试的时候发现了一个问题。由于每个module都会做混淆,基础的混淆规则都是用abc来替换包名、类名、方法名,因此出现了冲突,如下图:

1650080874(1).jpg

1650080784(1).jpg

这个问题其实可以通过混淆配置中的混淆字典来解决,字典有如下三种:

  • obfuscationdictionary(混淆字典)
  • classobfuscationdictionary(类混淆字典)
  • packageobfuscationdictionary(包混淆字典)

初步尝试

在module的app目录下新建default_dictionary.txt文件,并且在proguard-rules.pro中配置。

-obfuscationdictionary default_dictionary.txt
-classobfuscationdictionary default_dictionary.txt
-packageobfuscationdictionary default_dictionary.txt

发布后在项目中引入依赖包后可以看到已经生效了:

1650080980.png

然而,在安装调试时,又发生了异常:

1650081103.png

根据异常提示,是缺少了刚刚创建的default_dictionary.txt的问题。也确实没有在aar中看见该文件,因此只要将该文件一起打包进aar即可。

进一步尝试

打包aar时,assets文件夹中的文件也会一起打包。基于此进行了进一步尝试。

首先在项目的根目录创建assets文件夹并将default_dictionary.txt放在该文件夹下,如图:

1650086296(1).png

然后在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

发布后在项目中引入依赖包后,安装调试已经可以编译通过。

1650086652(1).png