跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Android Framework 框架层源码深度解析:启动流程与核心组件

深入解析 Android Framework 框架层源码,涵盖系统启动流程、IPC 通信机制、Handler 消息处理、AMS 活动管理、WMS 窗口管理、Surface 渲染、SurfaceFlinger 合成、PKMS 包管理、InputManager 输入处理及 DisplayManager 显示管理等核心模块。文章详细阐述了各组件的工作原理、源码逻辑及常见面试题,旨在帮助开发者理解 Android 系统架构,提升底层调试与优化能力。内容包含从 Init 进程到 Zygote 启动,Binder 通信细节,以及图形系统合成流程的全链路分析。

CryptoLab发布于 2025/2/7更新于 2026/9/762 浏览
Android Framework 框架层源码深度解析:启动流程与核心组件

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)

通过 可以获取全局服务对象的 IBinder 代理,这是访问 AMS、WMS 等系统服务的入口。

ServiceManager.getService()

第九节 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 启动

DMS 负责管理显示器配置,支持多屏输出。

第二节 DisplayAdapter 和 DisplayDevice 的创建

模拟物理显示设备的抽象层。

第三节 DMS 部分亮灭屏流程

电源管理模块与显示模块的联动。

第四节 亮度调节

自动亮度传感器数据的采集与应用。

第五节 Proximity Sensor 灭屏原理

距离感应器在通话时关闭屏幕以省电。

第六节 Logical Display 和 Physical Display 配置的更新

虚拟分辨率与实际屏幕的映射关系调整。

结语

由于 Framework 层代码量巨大,涉及到的逻辑线也非常多,经常容易看完后面的,忘记前面的。因此,要记得看完一部分及时总结。总结可以是一个流程图、一篇文章,或者任何你认为合适的方式,一来可以加深记忆,二来可以复习和回顾。建议结合具体调试工具(如 Systrace, Perfetto)观察实际运行时的行为,将理论与实践相结合。

目录

  1. Android Framework 框架层源码深度解析
  2. 前言
  3. 第一章 系统启动流程分析
  4. 第一节 Android 启动概览
  5. 第二节 init.rc 解析
  6. 第三节 Zygote
  7. 第四节 面试题
  8. 第二章 跨进程通信 IPC 解析
  9. 第一节 Service 还可以这么理解
  10. 第二节 Binder 基础
  11. 第三节 Binder 应用
  12. 第四节 AIDL 应用(上)
  13. 第五节 AIDL 应用(下)
  14. 第六节 Messenger 原理及应用
  15. 第七节 服务端回调
  16. 第八节 获取服务(IBinder)
  17. 第九节 Binder 面试题全解析
  18. 第三章 Handler 源码解析
  19. 第一节 源码分析
  20. 第二节 难点问题
  21. 第三节 Handler 常问面试题
  22. 第四章 AMS 源码解析
  23. 第一节 引言
  24. 第二节 Android 架构
  25. 第三节 通信方式
  26. 第四节 系统启动系列
  27. 第五节 AMS
  28. 第六节 AMS 面试题解析
  29. 第五章 WMS 源码解析
  30. 第一节 WMS 与 activity 启动流程
  31. 第二节 WMS 绘制原理
  32. 第三节 WMS 角色与实例化过程
  33. 第四节 WMS 工作原理
  34. 第六章 Surface 源码解析
  35. 第一节 创建流程及软硬件绘制
  36. 第二节 双缓冲及 SurfaceView 解析
  37. 第三节 Android 图形系统综述
  38. 第七章 基于 Android12.0 的 SurfaceFlinger 源码解析
  39. 第一节 应用建立和 SurfaceFlinger 的沟通桥梁
  40. 第二节 SurfaceFlinger 的启动和消息队列处理机制
  41. 第三节 SurfaceFlinger 之 VSync(上)
  42. 第四节 SurfaceFlinger 之 VSync(中)
  43. 第五节 SurfaceFlinger 之 VSync(下)
  44. 第八章 PKMS 源码解析
  45. 第一节 PKMS 调用方式
  46. 第二节 PKMS 启动过程分析
  47. 第三节 APK 的扫描
  48. 第四节 APK 的安装
  49. 第五节 PKMS 之权限扫描
  50. 第六节 静默安装
  51. 第七节 requestPermissons 源码流程解析
  52. 第八节 PKMS 面试题
  53. 第九章 InputManagerService 源码解析
  54. 第一节 Android Input 输入事件处理流程(1)
  55. 第二节 Android Input 输入事件处理流程(2)
  56. 第三节 Android Input 输入事件处理流程(3)
  57. 第十章 DisplayManagerService 源码解析
  58. 第一节 DisplayManagerService 启动
  59. 第二节 DisplayAdapter 和 DisplayDevice 的创建
  60. 第三节 DMS 部分亮灭屏流程
  61. 第四节 亮度调节
  62. 第五节 Proximity Sensor 灭屏原理
  63. 第六节 Logical Display 和 Physical Display 配置的更新
  64. 结语

更多推荐文章

查看全部
  • MC.JS WEBMC 在教育场景中的应用实践
  • 前端监控怎么落地:错误、性能和行为追踪
  • 小红书 AlignRec: 多模态推荐系统的对齐与训练框架
  • 复杂三维山地环境下多无人机动态避障路径规划及小龙虾优化算法
  • Meson 构建系统入门:Python C++ 扩展开发实战
  • SD 场景变换魔法:InstructP2P 控制类型实现一键换天气
  • 基于 YOLO 系列与 SpringBoot 的小麦叶片病害检测系统
  • 青少年机器人编程系统化学习路径:从机械启蒙到人工智能
  • 2024 大模型从业者的至暗时刻
  • Qwen3.5 系列开源大模型本地部署全流程(ModelScope)
  • 向量数据库基本概念、原理、算法与选型指南
  • OpenClaw 配合 cpolar 实现本地 AI 外网访问实战
  • C++ 核心概念、内存管理与多态机制详解
  • ChatDoctor 使用指南:基于 LLaMA 的医疗 AI 助手
  • 2026 年 AI 生成产品原型工具实测:墨刀、FigmaMake、Uizard 对比
  • FPGA 毕业设计:选题避坑、开发流程与 Verilog 实战指南
  • 基于微服务架构的智能家居物联网平台实现
  • 基于 ESP32 的开源无人机开发指南:硬件与软件实现
  • 无人机视角山区泥石流与滑坡图像识别数据集介绍
  • Python 使用 Ksycopg2 连接和操作 Kingbase 数据库

相关免费在线工具

  • 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