Android混淆的重要性不用多说,操作指南网络上也有很多,不再赘述。分享几个我在混淆过程中search蛮久的问题。
1. 报"....can't find referenced class..." warning 的解决方式:
当我们使用-keep 将相关文件声明为不混淆之外,当我们确信对相应的文件混淆没有问题时,还需要使用-dontwarn 声明相应的文件,Grade在检查的时候才不会报出Warning.
例子:
#Keep Okhttp3
-keep class okhttp3.** { *;}
-keep interface okhttp3.* { *;}
-dontwarn okhttp3.*
这样写了之后,"can't find referenced class okhttp3.XX.XXX" 的Warning 就不会报出来了。
2. 对于大量引用第三方库,jar, project时,如何处理混淆文件的编写呢?
(1). 第三方库,典型是通过Gradle引入的,比如Okhttp3, Picasso之类的库,这些库的原作者已经帮我们写好了相应的混淆文件,在项目中找找或者Google一下便可以找到,直接拷贝过来使用。
(2). .jar文件:我们经常会被一些第三方库打包成.jar文件,然后放到/libs/文件夹下使用,尤其是当项目从Eclipse迁移到AS之后,这样子的情况特别多。对于这种情况,我的解决方案时,在混淆文件中通过-keep和-dotwarn 来解除对这些第三方库的混淆和报警,
例子:
compile files('libs/ShareSDK-Core-2.6.2.jar')
compile files('libs/ShareSDK-Email-2.6.2.jar')
compile files('libs/ShareSDK-QQ-2.6.2.jar')
compile files('libs/ShareSDK-QZone-2.6.2.jar')
compile files('libs/ShareSDK-ShortMessage-2.6.2.jar')
compile files('libs/ShareSDK-SinaWeibo-2.6.2.jar')
compile files('libs/ShareSDK-Wechat-2.6.2.jar')
compile files('libs/ShareSDK-Wechat-Core-2.6.2.jar')
compile files('libs/ShareSDK-Wechat-Favorite-2.6.2.jar')
compile files('libs/ShareSDK-Wechat-Moments-2.6.2.jar')
我这个项目里使用了mob的ShareSDK, 其中需要引入大量的.jar文件,以下是我如何对此编写混淆文件的:
-keep class cb.sharesdk.** { *;}
-dontwarn cn.sharesdk.**
关键是找到ShareSDK-XXX 这些包所对应的类所在的包名, -keep and -dontwarn 之。
(3). 引入的工程文件,这类的第三方库在Build.Gradle中会以compile project('XXXX')这样的形式展现,比如:
compile project(':lib_afinal')
对于这种方式引入的第三方库,最好的作法是跑到这些第三方库的Build.Gradle文件中写如下列的句式:
consumerProguardFiles 'proguard-rules.txt'
我在lib_afinal中build.gradle的代码片段会是:
defaultConfig {
minSdkVersion 5
targetSdkVersion 17
consumerProguardFiles 'proguard-rules.txt'
}
为什么这样设置呢?因为Gradle会为我们自动完成这些工程文件的混淆,不需要我们再去手动设置。