最近在弄组件化,我们主要是对外提供SDK,但是出现个问题,就是组件通过混淆后,业务看到的代码函数参数,比如如下
public void onFail(int var1, int var2, String var3)
类似上面的方式,函数参数名被转成无意义的var1,2,3
如果采用r8混淆,然后使用
-keepparameternames
是可以保留参数名,但是这个是对整个工程都会保留,无法对单个类进行单独处理,但是这个对interface无法处理
假设我现在有这样的场景
A是我提供出去的SDK,B、C、D是子组件,A依赖BCD.然后其中BCD我是不混淆,但是A对外,我希望有部分混淆
如果我采用consumer-rules的方式,最后都会被工程App的一起混淆掉了,所以这种方式无法处理。
当前我的处理是对SDK进行独立混淆处理,然后通过混淆配置去保留对外类文件
但是就出现了前面出现的问题,有些参数名被混淆,interface接口也被影响了。
怎么办了,为了对外暴露的类保留原始性和注释,我希望不要对外的类混淆,但是通过keep方式还是会对参数进行混淆,另外还会去掉了注释。对于外面的阅读性就比较差。
最后我通过一种方式解决了这个问题
我把整个SDK拆成三部分
SDK、SDK_Internal、SDK_Public
其中SDK是主要是对外的使用的接口类
SDK_Public,定义一些对外需要用的数据结构,包括interface和其他不用混淆的文件,SDK和Internal都可以引用了
SDK_Internal主要就是需要混淆的主要内容,也是整个SDK整个工程的实现,
SDK、SDK_Public不混淆
SDK_Internal混淆
然后SDK引用了SDK_Internal、SDK_Public。采用implement,不要把其他打包进去SDK
然后业务在使用的时候,可以比较清楚的看到PUblic和SDK的源代码和注释
只是在使用的时候需要
implement SDK_Internal、SDK_Public、SDK 三个
这样,就可以比较清楚的看到SDK,但是又保留了重要的信息保留混淆。