前言
从 17 年下半年至今学习 Android 系统架构已经有一段时间了, 学习的目的主要有如下几点
- 满足求知欲
- 提升源码阅读能力
- 了解 Android 系统运行方式, 更好的追踪和解决开发中的问题
- 学习 Android 系统中优秀的设计方案, 即时 Android 离开历史的舞台, 我们也能够将一些好的思想记录下来
在学习 Android 系统架构的过程中, 留下印象最深刻的便是, 很难将零散的 Android 知识组织成自己的知识体系
- 比如在学习系统服务进程时, 因为其涉及到了 Binder 驱动, 于是不得不去补 Binder 驱动的知识, Binder 驱动定义在 Linux 内核中, 不得不去补 Linux 内核的知识
这里笔者记录一下自己的 Android 系统源码的学习之路, 在归纳总结中补缺补差, 希望能够和大家一起进步, 其需要的基础知识如下
- 应用层开发基础
- C/C++ 基础
- Linux 内核机制
下面从广义上了解一下 Android 系统的组成
一. Android 系统架构
Android 是基于 Linux 内核的, 从广义的角度说, 它可以分为 Linux 内核层和用户空间层
一) Linux 内核层
Linux 内核层主要管理底层驱动程序, 用于和设备硬件直接交互, 除了 Linux 内核的进程、内存管理等, 还包含 Android 添加的特色驱动程序
- Binder: IPC 通信驱动
- Logger: 日志打印驱动
- Ashmem: 共享内存驱动
二) 用户空间层
用户空间层的结构如下
- 应用开发层(Application)
- 应用框架层(Android Framework)
- 即 Android 为应用层开发提供的 Java API
- 运行时库(AndroidRuntime)
- Binder
- Parcel
- Ashmem
- 智能指针
- ……
- 链接库(NativeLibrary)
- OpenGL
- SQLite
- SKIA
- ……
- 硬件抽象层(HAL)
- 是 Linux 内核与用户空间交互的纽带
二. 学习思路
笔者探索过很多 Android 源码的学习思路, 后来发现由底向上的学习是最适合自己的, 因为底层的知识比较基础而且底层的知识点与比较独立, 与其他模块的耦合度较低
一) 数据通信篇
1. Handler 线程间通信
2. Binder 驱动
- 应用层
- 运行时库层
- Linux 内核层
- Binder 上下文管理者的启动
- 见系统启动中的 ServiceManager 启动
- Binder 通信完整流程
3. Asheme 共享内存驱动
二) 系统启动
- Init 进程的启动
- ServiceManager 启动
- SurfaceFlinger 的启动
- Zygote 进程的启动
- SystemServer 进程的启动
- 应用进程
- Activity
- Service
三) 图形架构篇
- 图形渲染的准备
- View 的 Traversals 操作
四) 资源管理篇
三. 学习资料
- «Android 系统源代码情景分析(第三版)»
- «深入理解 Linux 内核»
- https://blog.csdn.net/Luoshengyang/article/details/8923485
- http://gityuan.com/android/
在个人学习的过程中, 以上的资料对我产生了极大的帮助, 尤其是罗老师 «Android 系统源码情景分析», 它几乎陪我度过了 2017 年到 2018 年上半年所有的闲暇时光, 在这里对作者表示衷心的感谢
结语
“慢几步, 深几度”, 关于上述的文章, 笔者会花时间花心思去完善, 虽然不是高深的知识, 但也是自己积累的点滴, 能够分享给大家还是还开心的, 也希望大家多多批评帮助笔者一起进步
下篇概览