前言: 人可以不聪明,但是必须掌握做事的方法,方法论就是经验者总结出来的做某件事的通用规律和策略。本篇讲解分析源码和框架方法论,有了合适的方法论做为指引,外加自己刻苦和努力,相信世上无难事,分析源码会事半功倍。
我所总结出来的源码分析方法其实很简单,总结而来就是:静态分析+动态分析 。其中,
静态分析就是对代码的未执行阶段进行分析。说白了,就是分析一个工程的源码期,不涉及代码在执行阶段的表现。
动态分析就是对代码的执行阶段进行分析。
本文主要对静态分析方法做阐述,先简单说下动态分析,然后后面说重点说下静态分析。
动态分析主要研究代码从装入内存到执行期间对象和数据在内存中的分布,线程和上下文切换等问题,分析此过程没有特别好的办法,有下面几点素质需要具备:
1 必须基本熟悉进程在内存中的地址空间分布,至少要对堆区 栈区 常量区等有个最基本的认识。
2 必须了解线程和线程切换,知道某一时刻某段代码执行在哪个线程上。
一般的应对方法:
1 把自己的大脑当成cpu来执行代码,知道何时在内存何处分配了哪些对象和数据,空间想象能力要强一些。
2 熟悉使用调试工具,辅助分析内存和线程。
下面说说重点静态分析
静态分析本质就是分析类----分析类内部提供的方法,分析类的继承关系。
这里我有一个比较不错的分析方法--类比分析,要点如下:
# 把公司比作要研究的框架整体源码, 把类比作公司的部门
# 一个公司通常会有许多部门协同工作,大部门由一到多个小部门组成,更大的部门由一到多个小一级的部门组成;
一个小部门就是一个独立的类,提供一系列该部门相关的独立的功能。
一个大部门除了部门本部提供一部分功能还需要旗下的小部门协助提供小部门所有的功能,从整体上看大部门本部的功能和旗下小部门的功能构成了大部门对外提供的所有功能。类比到源码就是类和类的(多)继承关系。
# 有些特殊的小部门为许多的大部门服务,逻辑上同时属于多个大部门,比如公司的财务部和人力资源部等。这类比于一个类被多个其他类当做父类。
有了上面的类比关系,分析源码的时候就可以有如下思路:
分析一个大子类的时候就是分析大部门,首先要看大部门本部提供了哪些工作职责(类方法),还要看大部门由哪些小部门组成,依次分析每个小部门又提供了哪些工作职责(类方法),对外来看,本部职责+子部门职责构成了大部门的职责。通过这种类比就可以比较容易的理解和分析出来类的继承关系和类方法了。
最后,通过静态分析过程后,然后再进入动态分析过程就很简单了,实在不行结合调试走一遍,基本能攻克一个框架的核心逻辑。