1.写在前面
我花了两三天时间来弄当前我公司开发的这个项目,其实我一直在想为什么要混淆这个项目。不混淆的原因有很多:
1.反正小项目,就算被反编译了又怎样,无所谓,再说混淆了,别人想反编译花点时间照样轻松破解。
2.混淆后测试是个大问题,我们给测试或者上线的项目一定是经过混淆的项目,但是平时开发开启混淆调试代价太大了,太浪费时间了,所以有时候我们在debug版本下测试完成没问题,结果在release情况下一堆的问题。
3.现在一堆的第三方加固,阿里聚安全(用的比较多),360,应用宝等等,所以感觉也够了。阿里聚安全我用的比较多,今天5月份时,加固后我用工具(dex2jar)反编译后很多代码是乱码的,差不多达到混淆的效果,最关键的可以减少1M多的APK大小,感觉太神奇了。这次我试了下APK大小减少了几百K,但是反编译出来的代码并没有乱码,真心不知道什么情况,其余两个没试过。但是用他们的在上线时有一堆的问题,比如我用阿里的加固,然后去应用宝上线,结果把apk提交上去时会提示你安装包有问题,推荐你使用它的工具加固,不然审核可能过不了,我用应用宝的工具加固完后去360上线,提交安装包又会提示安装包有问题,提示使用它的工具加固….
所以比较奇葩,我觉得第三方加固只是锦上添花,根本我们还是需要混淆项目。
2.必须混淆
我的项目混淆成功后,从4.4M变成3.3M,我就知道搞了这两天的混淆是值得的。混淆总结起来主要有两个难点:
1.开启混淆打包签名出来,能不能build successful。因为如果混淆文件没有配置好,经常这一步就堵死了很多人……
2.可以build successful,拿到混淆后的apk,但是运行起来可能会出现崩溃或者不正确的地方。
3. 我现在这个项目才迭代两个版本,这次混淆已经有点累,很多地方可以build successful出来,但是总是测试有bug,所以混淆最好越早越好。
一般只要完成这两步,混淆基本没问题了。对于第一步,我觉得要学习混淆100% 要学习郭神的这篇博客,写的太好了。
一定要看
A 开启混淆
这里比较简单,主要我们竟然开启混淆了,那一定也要配置全,不然浪费了。 shrinkResources true 行代码也可以上去,因为我们实际项目中坑定不止一个app module,还有其他很多lib module,比如看我的
虽然开启混淆后,gradle编译时会自动将其他库没有用到的方法 属性移除(所以apk安装包才瘦身),但是对于资源可不会进行这一步,一般项目中算资源的有.png,.xml,所以对于这些module中的无用资源我们可以通过这行代码来移除。
但是需要特别注意的是,这行代码必须在开启混淆后,也就是说minifyEnabled true时才起作用,不然我们单独写上哪一行代码也是没用的
release {
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
//apk命名 ksolar-1-1.0.0-20171010.apk
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//这里修改apk文件名
def fileName = "ksolar-${defaultConfig.versionCode}-${defaultConfig.versionName}-${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
B 配置混淆文件
如果有多个module,不用每个module都去build.gradle中开启混淆,只要在主app module配置就可以了,其他如果是依赖关系,也会被混淆的,我反编译看过。
如果看过郭神的那篇博客,我们知道sdk里面有个混淆文件,但是不够,我们也需要配置自己的混淆文件,但是估计最后混淆的效果是两个文件共同的作用的。
很多博客把混淆文件的内容分为几部分,我这里代码也一样分为三部分。1.基本不动区域(基本指令、默认保留),可以直接复制。
2.第三方库区域。虽然每个人使用的第三库都不一样,但是其实这里不难,很多第三方lib都提供了混淆规则,使用直接复制就可以了,不行的话,build的时候也会通不过提示,把提示的内容复制谷歌或者stackoverflow很容易就知道,我这里说的是依赖的形式,对于一些jar包,因为我这项目没用到,所以没写。
3.定制化区域。最后就是每个人项目情况不一样,写