Android开发Android开发程序员

阅读源码的方法论

2019-03-31  本文已影响12人  张可_

随着互联网行业的发展,优秀的开源框架越来越多,我们可以轻易地在 Github 上找到业界顶尖的大佬亲手写的代码,对于这种放在眼前的美食我们怎么能视而不见呢?
但实际上,源码一般比较复杂,一个框架动辄上万行、几百个类,互相之间又有着各种各样奇奇怪怪的联系。想要从这一堆复杂冗长的代码中理清楚头绪实在是非常困难。下面这篇文章就总结了我在阅读源码时的一些方法与技巧,希望可以帮到大家。
下面的框架我会按照 Android 中的图片加载框架 Glide 为案例来进行讲解。

此外如果大家有兴趣可以看看我专门针对 Glide 源码解读的文章:
https://www.jianshu.com/p/9bb50924d42a

自顶向下的分析

在拿到一份源码时(假设你已经学会如何使用这个框架),我们第一件要做的事情是思考如果让我们来设计这个框架,我们会怎样设计,应该分成哪几个模块,模块之间如何耦合,如何让用户使用起来很简单的同时又可以扩展自己的功能等等。
当我们仔细分析一波后,会逐渐明白这个框架的设计难点、关键节点、核心等等。例如要我们设计一个加载图片的框架,那第一个想到的肯定就是缓存(内存缓存、磁盘缓存等等)、加载源(HTTP、File、Resource 等等)、格式转换等等这些要点,然后我们带着这些问题去看框架,效率自然就高了很多。
用宏观角度去分析代码细节,自顶向下缕清关系。

模块划分

用模块化思维分析。
其实通过上面的思考,我们已经能大概的给这个框架分出几个模块了,例如:缓存模块、加载模块、图片处理模块等等。
然后我们开始看代码,一个优秀的框架都会有很清晰的模块划分,我们先根据模块来看,因为包是按照模块划分的,所以可以根据分包来了解框架中的模块,下面看一下 Glide 框架源码的包划分:

分包结构

第一个 load 包肯定是加载相关的东西,例如图片请求的执行、数据解码。
request 包应该是请求封装模块,我们发起一个请求时应该会通过这个包下面的类进行包装。
signature 叫签名,大概是关于请求标识、资源标识相关的?我们可以先这么理解。
util 是工具包,放一些全局共用的工具类。
其它的可以自己理解。到了这里我们已经能对这个框架有个粗浅的认识了。

另外,要相对模块划分有更深的了解,我们光看这个还是不行的,需要看一些代码才能更深入的了解,例如根据我们平时使用的方式,来看整个图片加载的流程是怎样的,每个流程负责什么任务,这样可以加深对模块的认识。

下面我们就可以按照模块来学习源码了,例如先学习 request 包下面的代码,明白请求是如何创建的等等,阅读源码时一定要时刻保持着清醒的头脑,千万不可迷失在层层的嵌套调用关系中。
有一点需要注意:千万不可急于求成,看不明白的就放在后面看,先看能看明白的。

流程分析

了解一套图片加载的请求流程比较重要,我们通过分析这些流程能明白每个模块之间的关系。
如果看过一些代码已经知道,模块之间都是使用接口耦合,每个接口又有很多实现类,具体的实现类要在代码运行时才能知道,所以想要找到一个方法具体的实现也是一件比较麻烦的事情。除了通过调试可以很方便的看到调用流程之外我这里再给一个技巧:关键点打印方法调用栈
打印方法调用栈的代码如下:

StringBuilder traceBuilder = new StringBuilder();
for(StackTraceElement e : Thread.currentThread().getStackTrace()){
    traceBuilder.append(e.toString());
    traceBuilder.append("\n");
}
Log.d(TAG, traceBuilder.toString());

搞懂流程之后可以画一个流程图出来,例如下面这样:

加载流程

当然了想要画出这样的流程图是需要时间的, 不是很轻易的就能完成,需要对源码有了一定的了解之后才行。

类分析

类分析是指我们在实际阅读源码时针对同一个家族的类的分析。
类与类之间肯定会有这很多复杂的联系,我们在阅读时想要理清楚可以借助一些工具,例如自动生成 UML 类图的插件。
效果如下:

UML 图

这里用的是 Android Studio 中的 simpleUML 插件来生成的,直接搜索安装即可。
有了这种工具我们的效率将会事半功倍。

其实阅读源码最重要的技巧就是:死磕。没有什么特别的方法可以让你在很快的时间内对一个框架了如指掌,想要学好必须多花点时间仔细阅读,看得多了,自然就一回生二回熟了。

如果觉得还不错的话,欢迎关注我的公众号,我会不定期发一些干货~

公众号

也可以加我微信:

个人微信
上一篇下一篇

猜你喜欢

热点阅读