Android Framework 是 Android 操作系统的核心层,位于应用层与 Linux 内核之间。对于移动开发者而言,深入理解 Framework 的底层原理不仅是解决复杂问题的关键,也是从初级工程师迈向高级架构师的必经之路。许多开发者在遇到系统级问题时,往往只能依赖猜测或临时修补,缺乏系统性的方法论和工具支持。掌握 Framework 原理,能够帮助开发者由点及面地逆向分析瓶颈,设计出更优的系统方案。
一、系统启动流程分析
Android 系统的启动是一个复杂的过程,涉及多个进程的协同工作。
1. Init 进程与 init.rc
Init 进程是 Android 用户空间的第一个进程,PID 为 1。它负责初始化硬件设备、挂载文件系统以及启动其他服务。init.rc 是 Init 进程使用的配置文件,定义了服务的启动脚本、权限设置和环境变量。
2. Zygote 进程
Zygote(胚胎)进程是 Android 中所有应用进程的父进程。它预加载了常用的类库和资源,通过 fork 机制快速创建新的应用进程,从而节省启动时间。Zygote 在 SystemServer 启动之前运行,负责监听 Socket 连接以接收启动指令。
3. SystemServer 进程
SystemServer 进程负责启动 Android 的核心系统服务,如 ActivityManagerService (AMS)、WindowManagerService (WMS) 等。它通过调用 Java 代码来实例化这些服务,并将它们注册到 ServiceManager 中供其他进程使用。
二、Binder 通信机制深度解析
Binder 是 Android 特有的 IPC(进程间通信)机制,具有高效、安全的特点。
1. Binder 驱动与数据结构
Binder 驱动位于内核层,负责处理跨进程的数据传输。其核心数据结构包括 binder_node、binder_ref 和 binder_transaction。驱动通过内存映射(mmap)技术实现零拷贝传输,提高了性能。
2. ServiceManager 管理
ServiceManager 是 Binder 机制中的中央注册表。addService 流程用于将服务注册到 ServiceManager,而 getService 流程则用于获取服务的代理对象。启动 service_manager 后,各系统服务通过 Binder 接口暴露给客户端。
3. JNI 方法注册
在 Native 层,Binder 通过 JNI 方法与 Java 层交互。Binder 的 JNI 方法注册确保了 C++ 代码能够正确调用 Java 层的接口,反之亦然。这是 Framework 层与 Native 层通信的桥梁。
三、Handler 消息机制源码分析
Handler 机制是 Android 多线程通信的核心,主要用于线程间传递消息和处理任务。
1. Message 与 MessageQueue
Message 代表一个待处理的任务,包含目标 Handler、数据载荷和执行时间。MessageQueue 是一个链表结构,存储按时间排序的消息队列。Looper 负责循环取出消息并分发给对应的 Handler。
2. Looper 与 Loop
每个线程可以关联一个 Looper。Looper.loop() 方法进入死循环,不断从 MessageQueue 中取出消息。如果队列为空,线程会阻塞等待。这种机制保证了 UI 线程能持续响应事件而不被阻塞。
3. 常见面试题解析
- 为什么 Handler 不能跨线程? 因为每个线程只有一个 Looper,Handler 默认绑定当前线程的 Looper。
- Handler 内存泄漏问题? 内部类持有外部类引用且未移除回调时可能导致泄漏,需使用静态内部类或 WeakReference。
四、AMS 与 WMS 核心服务解析
1. AMS (ActivityManagerService)
AMS 负责管理应用程序的生命周期、任务栈和进程调度。系统启动系列中,AMS 是最晚启动的服务之一,依赖于 Zygote 和 SystemServer。通信方式主要基于 Binder。面试中常问 AMS 如何启动 Activity,涉及 startActivity 流程、Intent 解析、ProcessStart 等步骤。


