现在的位置: 首页 > 综合 > 正文

混淆的艺术-(苍井空变凤姐)Proguard源码分析(一)前言和计划

2017年12月06日 ⁄ 综合 ⁄ 共 1935字 ⁄ 字号 评论关闭

你的软件架构设计的再优雅,也并不希望除了你之外的人接触到你的源码。如果说把你的代码比作苍老师的话,那么你如果你并不希望除你之外的人看到代码,那么你一定希望有一款工具能让你的代码由苍老师变成凤姐,让人望而却步。Proguard无疑是你一个非常好的选择。Progurad是一款非常常用的java混淆程序。除了本身提供的功能外,它也作为开源软件被大家津津乐道。但是网络上并没有针对Proguard源码分析的博客或者文章。今天我就将带大家开启我们的Proguard源码分析之旅。刚开始不得不吐槽一下,Proguard的源码写的比较难以阅读,或者这是我第一次读这么大的一个项目,很多时候不免有点力不从心。但是就像老罗-@罗升阳说的那样"读这些操蛋的代码".这样你才能变的一样的操蛋。

我们导入Proguard的源码,我们发现其实分包还是分的挺明确的,很明显是以功能点为划包依据:

proguard   用户调用接口

proguard.ant ant逻辑相关

proguard.classfile  class处理

proguard.evaluation 执行相关

proguard.guigui界面,不作为重点

proguard.io  IO流,处理类似jar和zip,classpath文件流

proguard.obfuscate  混淆相关

proguard.optimize 优化

proguard.preverify 预编译相关

proguard.retrace 不知道何用

proguard.shrink压缩相关

proguard.util常用的一些工具

       这里我会选择一些比较重要的功能点来做分析,在Proguard项目中,用到了大量设计模式相关的知识,如果你对设计模式并不太熟,不妨事先脑一下。我个人觉得设计模式是非常重要的一个知识点。直接体现了你对OO的理解程度。模式这种东西,不同人的理解可能并不相同,一种代码可能有多种的模式展现。因此你看到的未必和我看到的一样。所以不用纠结于我对还是你对。因为不同的角度分析本身就有不同的观点。当然你如果我确实侧重错误,可以在我的文章底下评论,或者加我的Q一块讨论。在Proguard里面,比较常见的模式就是访问者模式,你可能会在代码中大量看到这种Vistor代码。访问者存在的初衷是对不同的访问对象做不同的处理。其实这种代码的接口扩展性并不高,因为你一旦多增加一种被访问者,那么你所有的访问者都需要定义这种被访问者接口。不过如果你对自己定义的数据模型充分自信,充分认为这种模型迭代几个版本都不会有太大的变化,不妨可以考虑一下这种模式。另外,为了扩展各种访问者的功能,用到了大量的装饰器模式我觉得装饰器模式的使用绝对是Proguard源码的一大亮点。装饰器模式我觉得是设计模式里面取名比较合理的模式之一。它就像是往外加壳,然后再脱壳。比如你可以定义一个对象妹,你可以装饰成一个漂亮的,然后你可能觉得还装饰的不够,于是你又加上一个性感的漂亮的。这就是装饰模式的一个例子。组合聚合自然也是不可缺少的模式之一。有一些人总把对象里面定义对象属性作为组合聚合模式的重点,其实Android里面的UI系统,或者说大部分UI系统都应该是使用组合或者聚合模式的一种他们有典型的Uml图形。

      我分析源码的时候还是愿意通过透过现象来看本质。也就是说,我会给出一个demo程序,然后分析源码。写这篇文章我是很随性的,所以我也没法估计自己能坚持几章节,或者能写几章。也无法估计自己每一个章节的标题。如果你对这部文章感兴趣,可以关注一下我的动态。当然我非常希望能有志同道合的人能跟我交流,非常非常希望。如果你是个源码爱好者,不论语言,都可以跟我交流。当然前提是你不介意我在CSDN社区里面的小鸟身份。

     到这里我先说明下一篇文章要说的东西是Proguard的参数解析。这个东西也是Proguard的第一步。我前面说过会给出demo程序然后分析,这个刚上来就讲源码不是往自己的脸上泼粪咩?其实不是这样的,就算我告诉你Proguard脚本怎么写,你可能过两天就忘记了它的语法,与其这样我不如先告诉你Proguard是如何解析参数的,至少可以让你有个印象,然后在第三章的时候就会切入正题。

                                                                                                                                                                                  
--非子墨


 

抱歉!评论已关闭.