项目实践--混淆【详解】

本文分享了项目混淆的重要性及实践过程,强调了混淆对于项目安全性和减小APK体积的必要性。作者通过实际操作,从开启混淆、配置混淆文件两方面详细介绍了混淆步骤,包括如何处理资源移除、第三方库混淆规则以及定制化混淆规则,特别是针对bean、内部类和工具类的保护策略。混淆虽有难度,但早期介入能避免后期测试中的诸多问题。
摘要由CSDN通过智能技术生成

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.定制化区域。最后就是每个人项目情况不一样,写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值