如何阅读Android源码

推荐阅读的源码
AOSP 项目这么庞大,就算是 Framework 部分也有够看上一阵子的,所以推荐从常用的看起,由浅及深,同时向横向和纵向深入阅读。

开始

Handler-Message-Looper
Handler 被称为 “异步提交器”,是 Android 开发入门教程必定谈及的东西,这也是 Activity 等组件的工作机制需要用到的东西,是“数据驱动” 框架的重要组成,作为阅读源码的入门最适合不过。

Activity 和 Service
作为经常使用到的组件,阅读其源码的花费和带来的技术提高的性价比肯定是最高的,Service 可以不看,但是 Activity 总不能少吧。

Fragment
还在认为 Fragment 是一个视图吗,还在认为 FragmentActivity 的界面有多个 Fragment 组成吗,看看 Fragment 和 FragmentManager 吧,了解下生命周期的本质到底是什么。

View
想自定义高级的 View 类吗,那总得知道 onMeasure/onLayout/onDraw 这些方法是怎么被调用的,了解 LayoutParams 是怎么工作的,知道调用 requestLayout 和 Invalidate 的时候有什么区别。

MotionEvent
在懂的怎么自定义高级的 View 后,只能向用户显示界面,还得知道怎么与用户交互才能做出华丽的 UI。所以必须知道 TouchEvent 的分发和拦截的工作机制,起码也得知道其特点,才不会一直在困扰 “为什么无法监听用户的触摸事件”、“View 之间的触摸事件冲突了” 或者 “View 的滑动与点击事件冲突了” 之类的问题。

LayoutInflator
布局渲染器也是开发 Android UI 的时候经常用到的,不过 LayoutInflator 实例的创建方式有好几种,你至少得知道其之间的区别。还有,LayoutInflator 在渲染指定布局的时候,有 container 和 attachToRoot 等参数,阅读源码后很快能了解其区别。

SurfaceView 和 TextureView
阅读完 View 的工作机制后,就能理解为什么 View 在绘制复杂的 UI 效果时效率这么低,这时候就需要 SurfaceView 和 TextureView 了。理解双缓冲对 UI 更新效率的帮助,了解 SurfaceView 在视图叠加的时候的缺陷,了解 TextureView 在 Android Lollipop 之前的内容窜台 BUG,才能用正确姿势使用这俩。

AsyncTask
异步任务也是 Android 开发经常遇到的问题,相比自己从 Thread 和 Handler 写起,被称为 “异步任务大师” 的 AsyncTask 类自然更受到许多小伙伴的喜欢。不过 AsyncTask 在早期的 Android 版本中差别甚大,需要做大量的适配工作,而且特别容易引起异步任务引用着组件的实例导致内存泄露从而引发 OOM 问题,所以不推荐直接使用 AsyncTask 类,不过强烈推荐阅读 AsyncTask 的源码学习 Google 优秀的异步任务设计理念。此外,如果真的要使用 AsyncTask,不要直接使用系统提供的 AsyncTask 类,AsyncTask 本身就是一个单一的 Java 类,没有耦合其他系统类,推荐自己从最新的 Android 版本中复制一份 AsyncTask 类的代码,自己维护,在项目中当做 Support 包一样使用,以规避其兼容性问题。

Volley
这个强烈推荐,是 Google 官方的异步任务框架,没有随 Android 发布,需要自己在 Framework 里下载代码。Volley 的中文意思就是 “并发”,阅读其源码能让你见识到原来异步任务框架也能写得这么低耦合和高扩扩展,其用“生产者 - 消费者” 模式来处理异步请求的框架会让人拍案叫绝。此外,Volley 框架是用于处理 Http 任务和 Image 加载任务,但是其优秀的异步控制思想也能运用与 File、Sqlite 等耗时任务的处理,当你能够自己写出类似 Volley 框架的代码时,说明你的 Android 技术已经有所突破。

android.util.*
“android.util.*” 包名下有许多优秀的实用类,大多是作为 Java 自带类的补充,比如数据结构类的 SparseArray、ArrayMap、ArraySet,用于加密的 Base64,用于处理屏幕分辨率自适应的 DisplayMetrics 和 TypedValue,用于时间换算的 TimeUtils,以及用于内存缓存的 LruCache,熟悉这些类对 Android 开发非常有帮助,也会让代码显得成熟。

进阶

Context
阅读 Context 源码能帮助我们了解其工作机制,了解 Google 是怎么在 Java 代码上添加 Android 特性的,了解 Android 是怎么保存和获取 res 资源的,了解 ContextWrapper 和 Activity 这些 Context 有什么区别,了解 Context 设计的装饰者模式(Description Pattern)。

ClassLoader
类加载器 ClassLoader 是 Android 虚拟机工作的基础,了解其 “双亲代理模式” 能让你更好的了解系统的类和你写的类是怎么工作的。Multi-Dex 和 ART 模式也和 ClassLoader 的工作机制息息相关。

Binder
Binder 是 Android 上 RPC(Remote Procedure Call Protocol)的实现,Android 系统许多功能就是居于 Binder 实现的,平时应用层对 Binder 的使用大多是在于和 Service 通讯的时候,不过,当我们需要使用 AIDL 功能的时候,就需要接触到 Binder 了。(推荐阅读原理即可,反正 C++ 驱动层我是看不下去了)

WMS,AMS,PMS,NMS,IMS 等系统 Service
SystemServer 是 Android 的 Framework 层工作的核心,Android 系统启动过程包含从 Linux 内核加载到 Home 应用程序启动的整个过程。SystemServer 是 Zygnote 孵化的第一个进程,这个进程会启动许多 Framework 层功能需要用到的线程,比如用于管理窗口的 WindowManagerService,用于管理 Activity 的 ActivityManagerService,用于管理 APK 包信息的 PackageManagerService,用于管理网络的 NetworkManager,用于处理用户触摸的 InputManagerService 等,这些系统 Service 提供了 APP 运行时需要的大多系统功能,大多使用 “stub-server” 的模式进行交互,而且有大量的 JNI 的调用。这部分的源码比较适合从事 ROM 开发的人阅读,应用层的开发基本不会用到,但是这方面的只是能让我们对 Android Framework 层的工作机制有个大抵的认识。(非常惭愧,这部分我自己看了几次,还是没能产生融会贯通的感觉,整体的认识还是比较模糊,希望继续跟着老罗的博客,捡捡肉吃)

第三方开源项目

EventBus
Android 上的一个 “订阅者 - 发布者” 模式的实现框架,非常适合业务多而且经常变动的项目,能够有效预防“接口爆炸”,现在基本上中型以上的项目都会采用类似的框架。

OTTO
同上,只不过实现的具体方案不一样,而且 OTTO 相比 EventBus 来,比较小巧,代码也比较简练,非常适合处女座的开发者食用。

RxJava
相比起上面两个,RxJava 可以说是把异步的思想发挥到了极致,RxJava 的兴起代表了 Android 开发中响应式编程的崛起,同样非常适合业务多而且经常变动的项目,只不过相比传统的基于接口的开发方式,RxJava 框架的开发方式会有点难以适应,特别是团队开发的时候。

Guava
这个其实也是 Google 自己开源的,提供了许多优秀的 Java 工具类,比如 “one to one mapping” 的 Bimap,有时候一些工具类 Android 或 Java 自带的库没有提供,或许我们可以先参考 Guava 的。

你可能感兴趣的:(如何阅读Android源码)