加入新项目,如何快速阅读App源码

做移动端开发,难免会因工作变动,加入一个新的项目组。而到了新项目组,首先要面临一个必备工作,阅读项目源码。如何有条理、快速的了解新项目的架构和业务,分享自己的一些心得。

应用代码可以分层来阅读,比如分成界面展示层逻辑控制层业务数据层,也就是Model-View-Controller/Presenter分层结构,在每层借助的工具和阅读的重点各有不同,下面分别介绍

界面展示层

借助工具:logcat和Layout Inspector

页面UI是最直观的视觉元素,是业务功能的具体表现,也是阅读项目源码很好的入口,Android中的UI主要是由Activity、Fragment、View等组件构成的,了解的顺序也是从Activity、Fragment再到具体的View。

动手操作业务主流程,了解页面之间的跳转(Activity层次)

业务主流程是指app主打功能,比如,如果是购物app,就是浏览->加购->下单->支付,如果是短视频app,就是浏览->发帖。在Android Studio(以下简称AS)中打开logcat,过滤”displayed “ 关键字,然后操作主流程,看下依次经历哪些Activity的切换,分别记录下来。

logcat-displayed

分析每个页面的布局组织层次(View层次)

在上一步中记录的各个Activity,还需要分析它们的页面布局,是一个RecycleView组成的滑动列表,还是一个ViewPager构成的tab切换,还是多个Fragment的嵌套,在AS中打开Layout Inspector来分析页面结构,查看各个View层次结构,对整个页面结构有个整体认识,同时找到对应的布局xml文件。找xml文件,可以在Activity和Fragment直接搜索R.layout.,或者根据前面Inspector,可以根据自定义view类名,或者view id来全局搜索。

layoutinspector

逻辑控制层

借助工具:Android Studio Debug

逻辑控制层介于界面层和数据层之间,主要负责业务流程的轮转,类名大多为XXController或者XXPresenter,XXManager等等。从Activity找到布局按钮,在它的onClick中断点来一步步调试、跟进。

断点有两种方式,一种是入口处,比如onClick,来跟踪后面的处理。一种是出口或者关卡处,比如bindData,但是不知道从哪里来触发,在出口处断点,往上去找。AS中断点堆栈可以复制下来,方便做流程时序图用。

调试

通常逻辑层中,会涉及到一些消息的传递,比如广播,event事件总线,Message,这些都是基于观察者模式,并且是异步的,无法顺序跟踪,不是很方便。可以多用shift+F全局搜索,比如搜索Action,找到广播接受者,通过event id,来找到订阅者、通过Message what,找到Handler处理者。

还有很多时候,会通过callback或者listener来回调到UI层,多注意下这些对象。

业务数据层

借助工具:抓包charles

数据的来源有网络、数据库、内存,文件。一般Java对象命名为XXDao,XXProvider,XXCache

对于网络数据,可以通过charles抓包工具,知道接口名,返回数据格式,并对数据进行以下分析,

  • 入参有哪些
  • 是增量数据还是全量数据
  • 有没有一些固定的协议,协议各个字段代码的含义
  • 哪些是业务数据,哪些是埋点、实验等数据

然后再来找数据的解析器,是怎样把原始数据一步步转换成ui对象的,有没有对数据做额外处理,各种数据对象表示的含义是什么,相互之间的关系

其他模块

除了上面列出的3个方面,其实app中还包含很多其他模块比如

  • 埋点:业务是怎样埋点的,页面埋点,点击埋点,曝光埋点,自定义埋点是怎样区分的

  • 图片库和视频:图片库怎样使用,怎样加载动图,视频组件是怎样使用的

  • 实验:怎样激活实验,验证实验效果

  • 开关:端上的开关怎样使用

反编译利器

现在都是组件化开发,有些三方aar接入,Android studio不容易搜索到源码,可以借助反编译工具jadx

借助工具:jadx

根据类名、字符串来进行全局搜索,

反编译搜索

右键通过查看声明,来找到定义的地方,查看用例,来找到使用的地方,顺着引用链路,来一层层找到调用地方。

反编译查找用例

带着问题去阅读

在阅读之前,先提出几个问题,列出list,然后逐个解决,顺着问题来阅读,不至于迷失方向,没有目标。