零、为什么要做源码分析
0.1 深入理解原理
源码分析可以对技术的实现原理、实现思路有更清晰的理解。这使得在解决问题时,可以快速定位问题,缩小调查范围,提高解决问题的效率。
0.2 学习最佳工程实践
一些受欢迎或是流行的框架或工具,经历了大量实际项目的检验。一般来说它们的源码的质量高、稳定性强、运行速度快。分析这样的源码,对于整体架构设计思路、算法、数据结构等,都会有更深的理解,可能会在以后的项目上运用或得到借鉴。
0.3 增强代码质量
可以学习到如何编写高质量的代码。包括如何使用变量、函数、类等元素来组织代码,如何编写清晰的注释和文档,如何遵循代码规范和最佳实践等。
一、源码分析的整体思路
我总结了下 自己的思路,以供参考:
1. 确定分析目的、分析边界
2. 收集权威信息与解读
3. 开始源码分析
1.1 确定分析目的及分析边界
这一步,其实是重中之重,以前我没太注意,后来渐渐觉得这对后面的工作起了一个指导性的作用。它可以避免你走入一些分支,或是浪费不必要的精力在一些细枝末节上。
心理建设:你一定要清楚,一次源码分析解决不了所有问题,也不能100%了解一个框架,不要过分提高对一次源码分析的期望,不要陷入“完美”这个陷阱。一次源码分析,如果可以成功解决一个问题就算是成功了。
确定分析目的,让你更专注。例如,我想知道 RecyclerView 的视图回收机制,确定了这个分析目的。就会让你专注在 Recycler,RecycledViewPool 等等这些与回收相关的逻辑上,缩小了分析边界。
确定分析目的,可以在阅读源码时,有意地跳过一些和主题无关的代码。
有了分析边界,可以避免陷入源码分析大而全的陷阱 。实际操作中,最怕的就是无意义地逐行阅读,不停地跳进函数,一层层地深入。很容易把人转晕,你根本不记得,当前在哪儿,要做什么。使得源码分析难以为继,产生挫败感。让你觉得自己能力不够,看不懂,这是最差的情况。
1.2 收集权威信息与解读
这里的权威信息,主要是指官网信息。
以Android开发为例,这两个是我常逛的网站:
Android开发者网站:https://developer.android.google.cn/?hl=zh-cn
Android开源项目:https://source.android.google.cn/?hl=zh-cn
如果你要分析的主题或问题,官网有介绍或是讲解,请一定先把官网的信息解读完全。之后再去看源码。
好处是:
以极少的成本,获取第一手权威资料,而且由于是官网的信息,面向的是普罗大众,所以都是语言精炼的易于理解的,做的好的会有精致的逻辑图、或流程图。
对于核心概念的集中度高,相关联系也讲得清晰。且不会有错误,以产生误导。
其次,如果官网没有相关的信息,请去各大博客平台,先扫荡一圈,利用好搜索/AI工具。
总之,这一节的核心目的,就是在极短的时间内,建立起对目标的整体认知。
上面两步做好了,最后一步,才是开始分析源码。
二、怎样高效分析源码
这里以自己的经验,给几点建议吧
2.1 以目标为核心,寻找关键类、关键方法
通过1.1、1.2的准备工作后,在纸上罗列出与目标相关的关键类,最好画出他们之间的关系。
整体思路,还是从整体到局部。以防跑偏,心中常念目标,你要解决什么问题。
2.2 速读注释,通读,跳读,画图
速读注释:类的注释、方法的注释,请速读(前几句或第一段)核心介绍,不要把注释一个字一个字地读。
通读:有些核心方法,方法体特别长,调用链也很深。请尝试从头到尾读一遍,结合注释,先不要跳进某一个方法中。
跳读:一个方法体中,和目标相关的可能只有几个关键的调用,其他不相关的逻辑请跳过。保持思路的连惯性。
画图:将关键点、关键流程 用笔画下来,建议用传统的笔、本,而不用电脑的画图软件。目的是快速好用,不打断思路。
2.3 总结出文章
如果能输出出来,且讲得通俗易懂,就说明输入的不错。输出过程中,遇到的问题反哺输入。