这是你眼里中的混淆吗?ProGuard

blob.png

好久我这个小屌丝儿没有写博客了,今天又重新开了一个简书,开始重操旧业啦!了解Android的人都知道应用的代码是用java编写的,轻轻松松就可以反编译源码。开发者一般会不约而同的想到使用 ProGuard,对这就一般意义上的混淆,最近在研究混淆的问题,非常纳闷混淆的真正原因,(一看到这里有的小伙伴儿就要开喷了,键盘侠们别激动等我把话说完,再喷我^O^),Android做为前端,大部分地方是用来与用户进行数据互动。(何为数据互动就是把后台的数据用漂亮的界面显示在前端)这些代码不存在安全性可言,那混淆的真正作用是什么,

1.保护源码不被篡改

我先给大家讲一个例子。比如一个应用有个功能是付费的,恰好这个功能在没有付费之前已经写在本地只是一个判断的语法而已。那么我们最快的做法就反编译去掉这一行判断重新打包就可以了,那么大家应该明白了这个突出了混淆最重要的一个作用那就是保护源码不被篡改。(现在最新的做法是把代码放到后台只有真正付费才会下到本地,这种做法的实现方式有很多,什么动态加载,代理都可以实现这里就不一一去说了。等有时间我再写这方面的内容)。开发 Android 没有人不知道 Jake Wharton 大神吧,也没有人没用过 Square 的开源库吧?Jake 除了写开源软件(当然没必要混淆)以外,也写商业 app。他对于 ProGuard 的态度就很有意思 —— 完全不去用。原因很简单:他们的价值不在 client 而在 server 端,对滴这就是我今天费劲周折要说的重点,虽然现在Android机器的硬件已经非常厉害,比如本屌丝的机子4核3g已经算是低配了(呵呵哒,有点惭愧啊),但是真正的逻辑是要在后台实现,不管后台逻辑多么复杂,只要让前端多快一点都是需要这么做的,前端真正意义是在于如何以窗口的形式显示后台给的数据,并更好的与用户互动。(但是你也是知道的很多不太主流的公司,还是什么事情如果前台能处理那就前台处理,生怕浪费了我们的4核cpu,导致前台不能把更多精力放在显示界面上,而用来对数据的进行整理,失去了前端真正的意义)

2.真正需要考虑安全的代码,真的会用java编译吗?

答案可想而知,如果尝试的反编译微信,支付宝的代码的可以看到里面大量的.so文件,他们真正有价值的代码是用c写的,通过jni调用,这样不仅安全而且一套代码Android,iOS都可用。这个才是最安全的做法!

blob.png

blob.png

3.对包的大小和性能的影响

ProGuard的原理是把类和方法名变成a b c d 换成这样普通人看不太懂的名称,这样的目的可以想而知,让破解更有难度,但是对于Dalvik虚拟机来讲的话编译速度会更快,而且这样字节就会少很多,对应的apk就会小。

blob.png

随着公司的发展对功能的要求越来越多,而这一切就寄托在app上,代码量就会越来越大,而且很多开发者采用的是解耦比较好的MVP或MVVM的框架,看似让代码更加易于开发者阅读,实际上会多出很多回调方法(这就是任何一种框架好的地方必然会有他的规则限制)让代码的方法数大很多,所以混淆在包的大小和性能上提升的意义很大!

今天就到这里吧!以后周六周日有时间继续分享!

文/JunWeiUp(简书作者)
原文链接:http://www.jianshu.com/p/5b83ee38b96b