Android Framework 核心原理与面试高频考点解析
引言
在 Android 开发中,Framework 层是连接应用层与系统底层的关键桥梁。深入理解 Framework 的原理,不仅能帮助开发者解决复杂的业务问题,也是应对高级技术面试的必备技能。本文针对常见的 Framework 面试题及核心源码流程进行系统性梳理。
一、系统启动流程分析
Android 系统的启动是一个复杂的多阶段过程,涉及硬件初始化到用户界面呈现。
1. 启动概览
从开机到桌面显示,主要经历 Bootloader -> Kernel -> Init -> Zygote -> SystemServer -> Launcher 的过程。
2. init.rc 解析
init 进程是 Linux 内核启动后运行的第一个用户态进程(PID 为 1)。它读取 /system/etc/init/*.rc 文件,负责启动其他守护进程和服务。
3. Zygote 进程
Zygote 是 Android 所有应用程序进程的孵化器。它预加载了常用资源(如类库、字体),通过 fork 机制创建新进程,从而节省启动时间。
4. 为什么 Zygote 不采用 Binder 进行 IPC?
Zygote 启动时,Binder 驱动尚未完全就绪,且 Binder 需要 ServiceManager 支持。此时使用 Socket 或 Fork 机制更为直接和高效。
5. AMS 如何启动?
SystemServer 进程中会实例化 ActivityManagerService (AMS),并将其注册到 ServiceManager 中,供其他组件调用。
二、跨进程通信 (IPC) 解析
Android 多进程通信方式多样,但 Binder 是核心机制。
1. 多进程通信方式
- Intent: 用于启动组件,数据量小。
- Bundle/Parcel: 基础数据传输。
- File: 共享文件。
- Socket: 网络通信,跨设备。
- SharedMemory: 高性能共享内存。
- AIDL: 定义接口,支持复杂对象传递。
- Messenger: 基于 Handler 的轻量级 RPC。
- ContentProvider: 用于数据共享。
2. Binder 机制原理
Binder 是一种 Client/Server 模型,包含 Client, Server, ServiceManager 和 Driver 层。Client 通过 ServiceManager 获取 Server 的代理对象,发起调用。
3. Binder 线程池工作过程
Binder 驱动维护一个线程池,当收到请求时,从池中取出空闲线程处理,避免频繁创建销毁线程带来的开销。
4. AIDL 与 Messenger 应用
AIDL 适用于高并发、大数据量场景;Messenger 适用于简单同步通信,内部封装了 Handler 机制。
5. 服务端回调实现
通过 IBinder 接口传递回调对象,客户端实现回调接口,服务端接收并调用。
三、Handler 消息机制详解
Handler 是 Android 多线程通信的核心,解决了子线程更新 UI 的问题。
1. 线程通信原理
Handler 绑定 Looper,Looper 绑定 MessageQueue。消息发送后进入队列,Looper 循环取出消息分发给 Handler。
2. 阻塞与非阻塞
sendMessage 和 post 是非阻塞的,立即返回。但 Looper.loop() 是阻塞的,会一直等待消息。
3. Runnable 执行流程
handler.post(Runnable) 会将 Runnable 包装成 Message 放入队列,由 Looper 取出后执行。
4. Callback 与 handleMessage
如果设置了 Callback,handleMessage 之前会先调用 callback.handleMessage。若 callback 返回 true,则不再执行 handleMessage;否则继续执行。
5. sendMessage vs postDelay
sendMessage 立即入队;postDelay 计算延迟时间后入队,实际执行时间取决于队列状态。
四、AMS (ActivityManagerService) 源码解析
AMS 管理所有应用程序的生命周期和资源调度。
1. startActivity 流程
Launcher 发起请求 -> AMS 检查权限 -> 查找目标 Activity -> 启动 Process -> 创建 Activity 实例。
2. 死锁问题
常见于 Binder 调用链路过深,或者在同步调用中持有锁等待对方释放资源。
3. 手写简化版 AMS
需模拟 ServiceManager 注册服务、Binder 驱动交互、消息循环处理等核心逻辑。
五、WMS (WindowManagerService) 源码解析
WMS 负责窗口管理和绘制调度。
1. WMS 与 Activity 启动
Activity 启动时,WMS 负责创建 WindowToken,验证权限,并将 View 添加到根布局。
2. 绘制原理
ViewRootImpl 触发 draw -> SurfaceFlinger 合成图层 -> GPU 渲染。
3. 角色与实例化
WMS 作为单例存在,负责协调 Application, WindowManager, SurfaceFlinger 之间的关系。
六、Surface 与图形系统
1. 双缓冲机制
通过 Front Buffer 和 Back Buffer 切换,避免画面撕裂。
2. SurfaceView 解析
SurfaceView 拥有独立的 Surface,直接在底层绘制,性能优于普通 View。
3. SurfaceFlinger 源码
负责图层合成,处理 VSync 信号,决定何时刷新屏幕。
七、PKMS (Package Manager Service)
1. APK 安装流程
下载 -> 扫描签名 -> 解析 Manifest -> 拷贝文件 -> 更新数据库。
2. 权限扫描
解析 AndroidManifest.xml 中的 permission 标签,写入权限表。
3. requestPermissions 流程
向 AMS 申请权限 -> 弹出对话框 -> 用户授权 -> 回调结果。
八、InputManagerService
1. 输入事件处理流程
InputReader 读取原始事件 -> InputDispatcher 分发到目标窗口 -> View 消费事件。
九、DisplayManagerService
1. 启动与创建
DMS 管理 DisplayAdapter 和 DisplayDevice,负责屏幕配置更新。
2. 灭屏原理
Proximity Sensor 检测距离,关闭屏幕以省电。
3. 亮度调节
通过 PowerManager 控制背光强度。
总结
掌握 Android Framework 的核心原理,包括系统启动、IPC 通信、Handler 机制、AMS/WMS 管理等,对于提升技术深度至关重要。建议结合源码阅读与实战调试,深入理解各模块间的协作关系。