最近在弄組件化,我們主要是對外提供SDK,但是出現(xiàn)個(gè)問題,就是組件通過混淆后,業(yè)務(wù)看到的代碼函數(shù)參數(shù),比如如下
public void onFail(int var1, int var2, String var3)
類似上面的方式,函數(shù)參數(shù)名被轉(zhuǎn)成無意義的var1,2,3
如果采用r8混淆,然后使用
-keepparameternames
是可以保留參數(shù)名,但是這個(gè)是對整個(gè)工程都會保留,無法對單個(gè)類進(jìn)行單獨(dú)處理,但是這個(gè)對interface無法處理
假設(shè)我現(xiàn)在有這樣的場景
A是我提供出去的SDK,B、C、D是子組件,A依賴BCD.然后其中BCD我是不混淆,但是A對外,我希望有部分混淆
如果我采用consumer-rules的方式,最后都會被工程App的一起混淆掉了,所以這種方式無法處理。
當(dāng)前我的處理是對SDK進(jìn)行獨(dú)立混淆處理,然后通過混淆配置去保留對外類文件
但是就出現(xiàn)了前面出現(xiàn)的問題,有些參數(shù)名被混淆,interface接口也被影響了。
怎么辦了,為了對外暴露的類保留原始性和注釋,我希望不要對外的類混淆,但是通過keep方式還是會對參數(shù)進(jìn)行混淆,另外還會去掉了注釋。對于外面的閱讀性就比較差。
最后我通過一種方式解決了這個(gè)問題
我把整個(gè)SDK拆成三部分
SDK、SDK_Internal、SDK_Public
其中SDK是主要是對外的使用的接口類
SDK_Public,定義一些對外需要用的數(shù)據(jù)結(jié)構(gòu),包括interface和其他不用混淆的文件,SDK和Internal都可以引用了
SDK_Internal主要就是需要混淆的主要內(nèi)容,也是整個(gè)SDK整個(gè)工程的實(shí)現(xiàn),
SDK、SDK_Public不混淆
SDK_Internal混淆
然后SDK引用了SDK_Internal、SDK_Public。采用implement,不要把其他打包進(jìn)去SDK
然后業(yè)務(wù)在使用的時(shí)候,可以比較清楚的看到PUblic和SDK的源代碼和注釋
只是在使用的時(shí)候需要
implement SDK_Internal、SDK_Public、SDK 三個(gè)
這樣,就可以比較清楚的看到SDK,但是又保留了重要的信息保留混淆。