跳到主要内容Android Framework 框架层源码深度解析:启动流程与核心组件 | 极客日志Javajava
Android Framework 框架层源码深度解析:启动流程与核心组件
本文深入解析 Android Framework 框架层源码,涵盖系统启动流程、IPC 通信机制、Handler 消息处理、AMS 活动管理、WMS 窗口管理、Surface 渲染、SurfaceFlinger 合成、PKMS 包管理、InputManager 输入处理及 DisplayManager 显示管理等核心模块。文章详细阐述了各组件的工作原理、源码逻辑及常见面试题,旨在帮助开发者理解 Android 系统架构,提升底层调试与优化能力。内容包含从 Init 进程到 Zygote 启动,Binder 通信细节,以及图形系统合成流程的全链路分析。
CryptoLab0 浏览 Android Framework 框架层源码深度解析
前言
随着谷歌对 Android 框架的越加深度的封装,包括各种 JetPack 框架的推出等都是为了让应用开发更加精简。这样带来的直接影响就是 Android 门槛被拉低了,应用开发只需要一个 Activity 就能制作一个 App,貌似也不需要什么高深的技能。
然而 Android 是一个庞大的系统性工程,各个版本都有一定兼容性问题。为了能快速定位问题,也为了学习 Android 框架中一些优秀的思想,时常需要查看 Android 系统源码层面的知识。
Framework 是 Android 开发最常接触的框架,也是最优秀的框架之一。Framework 的源码质量也是开源框架中的佼佼者。一个程序员想要让自己的开发水平得到提升,阅读源码是必不可少的。但是大部分人日常工作中能够接触到的代码有限,如果你只是在日常的工作中阅读同事的代码,那能学到的东西是非常有限的。
一来,工作中能接触到的同事的能力上限,跟全世界顶尖程序员的能力上限相比,差距是非常大的;再者,工作中的场景,经常被工期等非技术因素影响,并不能完全把开发者的技术水平体现出来。
因此,众多的优秀开源项目,就是一座巨大的知识宝库。通过深入研读 Android Framework 源码,可以从项目的整体架构中学会组织代码的方法,掌握一些核心的架构思维。
第一章 系统启动流程分析
第一节 Android 启动概览
Android 系统的启动过程是一个复杂的序列,涉及内核、初始化进程、Zygote 进程以及 SystemServer 进程等多个阶段。理解这一流程对于排查开机慢、服务未启动等问题至关重要。
第二节 init.rc 解析
init 进程是 Linux 内核启动后运行的第一个用户态进程(PID 为 1)。它负责挂载文件系统、创建其他进程、设置权限等。init.rc 是 init 进程的配置文件,定义了服务的启动脚本。例如,service zygote /system/bin/app_process... 这样的配置决定了 Zygote 的启动参数。
第三节 Zygote
Zygote 是 Android 所有应用程序的起点。它通过 fork 机制来创建新的进程,从而避免了重复加载类库和资源的开销。Zygote 进程在启动时会预加载常用的类库,并开启 Socket 监听,等待 SystemServer 或应用请求启动新进程。
第四节 面试题
常见面试题包括:Zygote 是如何启动的?fork 和 vfork 的区别是什么?SystemServer 在 Zygote 之后启动吗?
第二章 跨进程通信 IPC 解析
第一节 Service 还可以这么理解
在 Android 中,Service 不仅指 Application 层的 Service,更底层指的是 Binder 服务端。理解 Service 的本质是理解 IPC 的关键。
第二节 Binder 基础
Binder 是 Android 特有的 IPC 机制。它支持双向通信,且具备权限验证功能。Binder 驱动位于内核空间,负责管理引用计数和传输数据。客户端通过 IBinder 接口与服务端交互。
第三节 Binder 应用
在实际开发中,我们很少直接操作 Binder 驱动,而是通过 AIDL 或 Messenger 进行封装。但了解底层原理有助于优化性能和处理死锁问题。
第四节 AIDL 应用(上)
AIDL (Android Interface Definition Language) 允许定义接口供不同进程调用。编译后会生成 Stub 和 Proxy 类,Stub 实现服务端逻辑,Proxy 处理客户端请求转发。
第五节 AIDL 应用(下)
需要注意线程模型,默认情况下 AIDL 调用是异步的,可以通过传入 oneway 关键字进一步优化。
第六节 Messenger 原理及应用
Messenger 基于 Handler 机制实现,适合轻量级通信。它内部使用 Binder 传递 Message 对象,支持回调机制。
第七节 服务端回调
当客户端需要接收服务端通知时,需将自身的 IBinder 传递给服务端,服务端通过该 IBinder 发起回调。
第八节 获取服务(IBinder)
通过 ServiceManager.getService() 可以获取全局服务对象的 IBinder 代理,这是访问 AMS、WMS 等系统服务的入口。
第九节 Binder 面试题全解析
重点考察 Binder 内存映射机制、引用计数、一次传输多个对象的处理方式等。
第三章 Handler 源码解析
第一节 源码分析
Handler 是 Android 消息处理的核心。它与 Looper 配合工作。Looper 负责从 MessageQueue 中取出消息,Handler 负责分发处理。
第二节 难点问题
常见问题包括:Handler 内存泄漏(静态持有)、主线程阻塞、消息堆积。解决思路包括使用弱引用、检查队列状态等。
第三节 Handler 常问面试题
如:MessageQueue 如何保证单线程顺序执行?Looper.loop() 为什么是死循环?
第四章 AMS 源码解析
第一节 引言
ActivityManagerService (AMS) 是 Android 系统中最重要的服务之一,负责管理所有应用程序的生命周期。
第二节 Android 架构
AMS 处于 Framework 层核心,通过 Binder 与其他模块通信。它维护了 ActivityStack、ProcessRecord 等关键数据结构。
第三节 通信方式
AMS 主要通过 Binder 接收来自 ActivityThread 的请求,如启动 Activity、停止服务等。
第四节 系统启动系列
在系统启动过程中,AMS 负责启动 Launcher 进程,并接管后续的应用生命周期管理。
第五节 AMS
核心方法包括 startActivity()、stopService() 等。这些方法最终都会转化为 Binder 调用。
第六节 AMS 面试题解析
考察 Activity 启动模式、任务栈管理、进程保活策略等。
第五章 WMS 源码解析
第一节 WMS 与 activity 启动流程
WindowManagerService (WMS) 负责管理窗口。当 Activity 启动时,AMS 通知 WMS 添加窗口,WMS 协调 SurfaceFlinger 进行绘制。
第二节 WMS 绘制原理
WMS 不直接绘制像素,而是管理 WindowToken 和 SurfaceControl,最终由 SurfaceFlinger 合成显示。
第三节 WMS 角色与实例化过程
WMS 在 SystemServer 中启动,通过 Binder 暴露给 AMS 和其他模块。
第四节 WMS 工作原理
第六章 Surface 源码解析
第一节 创建流程及软硬件绘制
Surface 是连接应用层和图形系统的桥梁。创建 Surface 涉及 BufferQueue 的分配。
第二节 双缓冲及 SurfaceView 解析
SurfaceView 采用独立窗口机制,避免 View 层级绘制导致的性能损耗,适合视频播放和游戏。
第三节 Android 图形系统综述
包括 OpenGL ES、Vulkan 以及硬件加速路径。
第七章 基于 Android12.0 的 SurfaceFlinger 源码解析
第一节 应用建立和 SurfaceFlinger 的沟通桥梁
SurfaceFlinger 是合成器,负责将各应用的 Surface 合成到屏幕缓冲区。
第二节 SurfaceFlinger 的启动和消息队列处理机制
SurfaceFlinger 启动后进入主循环,监听 VSync 信号触发重绘。
第三节 SurfaceFlinger 之 VSync(上)
VSync 信号由硬件产生,用于同步刷新率,减少撕裂。
第四节 SurfaceFlinger 之 VSync(中)
通过 Choreographer 协调应用层和合成层的帧提交时机。
第五节 SurfaceFlinger 之 VSync(下)
第八章 PKMS 源码解析
第一节 PKMS 调用方式
PackageManagerService (PKMS) 负责管理已安装的应用包信息。
第二节 PKMS 启动过程分析
PKMS 在 SystemServer 早期启动,扫描 /data/app 目录获取安装包列表。
第三节 APK 的扫描
解析 AndroidManifest.xml,提取权限、组件、签名等信息。
第四节 APK 的安装
第五节 PKMS 之权限扫描
第六节 静默安装
利用 Root 权限或系统签名绕过用户确认的安装流程。
第七节 requestPermissons 源码流程解析
从应用层请求到 AMS 再到 PKMS 的权限授权链路。
第八节 PKMS 面试题
第九章 InputManagerService 源码解析
第一节 Android Input 输入事件处理流程(1)
输入事件从 InputReader 读取,经过 InputDispatcher 分发到目标窗口。
第二节 Android Input 输入事件处理流程(2)
第三节 Android Input 输入事件处理流程(3)
第十章 DisplayManagerService 源码解析
第一节 DisplayManagerService 启动
第二节 DisplayAdapter 和 DisplayDevice 的创建
第三节 DMS 部分亮灭屏流程
第四节 亮度调节
第五节 Proximity Sensor 灭屏原理
第六节 Logical Display 和 Physical Display 配置的更新
结语
由于 Framework 层代码量巨大,涉及到的逻辑线也非常多,经常容易看完后面的,忘记前面的。因此,要记得看完一部分及时总结。总结可以是一个流程图、一篇文章,或者任何你认为合适的方式,一来可以加深记忆,二来可以复习和回顾。建议结合具体调试工具(如 Systrace, Perfetto)观察实际运行时的行为,将理论与实践相结合。
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online