第一板块:Android 系统基石与运行原理 | 第一篇:Android 系统架构分层与 AOSP 规范
所属板块:第一板块 --- Android 系统基石与运行原理
前置知识:基础的 Linux 操作系统概念(进程/内核/系统调用)、Java 语言语法基础
本篇定位:从操作系统层面认识 Android 是什么、由哪些层次构成、每一层承担什么职责、层与层之间通过什么边界契约通信。
1. 核心结论先行
Android 不是一个"跑在虚拟机里的语言运行时",而是一个基于 Linux 内核构建的分层操作系统。它的本质是:
Linux Kernel(硬件管理) → HAL(硬件接口标准化) → Native Libraries + ART(原生能力 + 字节码执行) → Java API Framework(系统服务暴露给应用的接口) → Application Layer(应用进程)
每一层只向上层提供约定好的接口,层间边界清晰,替换某一层的实现不会波及不相关的层------这就是整座大厦稳定的根源。
2. 全景架构图
2.1 五层纵向架构(官方经典模型)
#mermaid-svg-OfpzrNoqLBHRDhmC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OfpzrNoqLBHRDhmC .error-icon{fill:#552222;}#mermaid-svg-OfpzrNoqLBHRDhmC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OfpzrNoqLBHRDhmC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OfpzrNoqLBHRDhmC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OfpzrNoqLBHRDhmC .marker.cross{stroke:#333333;}#mermaid-svg-OfpzrNoqLBHRDhmC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OfpzrNoqLBHRDhmC p{margin:0;}#mermaid-svg-OfpzrNoqLBHRDhmC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OfpzrNoqLBHRDhmC .cluster-label text{fill:#333;}#mermaid-svg-OfpzrNoqLBHRDhmC .cluster-label span{color:#333;}#mermaid-svg-OfpzrNoqLBHRDhmC .cluster-label span p{background-color:transparent;}#mermaid-svg-OfpzrNoqLBHRDhmC .label text,#mermaid-svg-OfpzrNoqLBHRDhmC span{fill:#333;color:#333;}#mermaid-svg-OfpzrNoqLBHRDhmC .node rect,#mermaid-svg-OfpzrNoqLBHRDhmC .node circle,#mermaid-svg-OfpzrNoqLBHRDhmC .node ellipse,#mermaid-svg-OfpzrNoqLBHRDhmC .node polygon,#mermaid-svg-OfpzrNoqLBHRDhmC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OfpzrNoqLBHRDhmC .rough-node .label text,#mermaid-svg-OfpzrNoqLBHRDhmC .node .label text,#mermaid-svg-OfpzrNoqLBHRDhmC .image-shape .label,#mermaid-svg-OfpzrNoqLBHRDhmC .icon-shape .label{text-anchor:middle;}#mermaid-svg-OfpzrNoqLBHRDhmC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OfpzrNoqLBHRDhmC .rough-node .label,#mermaid-svg-OfpzrNoqLBHRDhmC .node .label,#mermaid-svg-OfpzrNoqLBHRDhmC .image-shape .label,#mermaid-svg-OfpzrNoqLBHRDhmC .icon-shape .label{text-align:center;}#mermaid-svg-OfpzrNoqLBHRDhmC .node.clickable{cursor:pointer;}#mermaid-svg-OfpzrNoqLBHRDhmC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OfpzrNoqLBHRDhmC .arrowheadPath{fill:#333333;}#mermaid-svg-OfpzrNoqLBHRDhmC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OfpzrNoqLBHRDhmC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OfpzrNoqLBHRDhmC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OfpzrNoqLBHRDhmC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OfpzrNoqLBHRDhmC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OfpzrNoqLBHRDhmC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OfpzrNoqLBHRDhmC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OfpzrNoqLBHRDhmC .cluster text{fill:#333;}#mermaid-svg-OfpzrNoqLBHRDhmC .cluster span{color:#333;}#mermaid-svg-OfpzrNoqLBHRDhmC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OfpzrNoqLBHRDhmC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OfpzrNoqLBHRDhmC rect.text{fill:none;stroke-width:0;}#mermaid-svg-OfpzrNoqLBHRDhmC .icon-shape,#mermaid-svg-OfpzrNoqLBHRDhmC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OfpzrNoqLBHRDhmC .icon-shape p,#mermaid-svg-OfpzrNoqLBHRDhmC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OfpzrNoqLBHRDhmC .icon-shape .label rect,#mermaid-svg-OfpzrNoqLBHRDhmC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OfpzrNoqLBHRDhmC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OfpzrNoqLBHRDhmC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OfpzrNoqLBHRDhmC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 调用 Framework API
JNI 调用 Native 方法
HAL 标准接口 dlopen()
syscall / ioctl 等系统调用
第一层 · Linux 内核层 Linux Kernel 进程调度 · 内存管理 · 驱动 · IPC(Binder / epoll / socket)
显示驱动 / 输入驱动 / 存储驱动 / 网络设备驱动
Binder Driver(内核级 IPC)
进程调度 / 内存管理 / 安全(UID/GID/SELinux)
第二层 · 硬件抽象层 HAL 标准 C 接口 .so 模块,屏蔽硬件差异
camera.h → camera.xxx.so
audio.h → audio.xxx.so
sensors.h → sensors.xxx.so
gralloc.h / hwcomposer.h
第三层 · 系统运行库层 Native Libraries & Android Runtime C/C++ 原生库 + ART 虚拟机运行时
Native Libs
(SQLite / OpenGL ES / WebKit / SSL / Media / Freetype...)
ART
DEX 执行 · AOT/JIT · GC
Bionic libc(Android 定制 C 库)
第四层 · Java API 框架层 Application Framework Layer 以 Java/Kotlin API 形式暴露系统能力
ActivityManagerService
WindowManagerService
PackageManagerService
PowerManagerService
NotificationManager
ResourceManager
第五层 · 应用层 Application Layer 所有应用进程在此运行,每个 App 一个沙箱进程
系统应用(设置 / 电话 / 通讯录)
用户应用(第三方)
📌 读法 :从上往下看是依赖方向 (App 依赖 Framework,Framework 依赖 Runtime+Native,Native 通过 HAL 找硬件,HAL 落入 Kernel 驱动)。从下往上看是支撑方向 (Kernel 把硬件能力一层层抽象出来,最终变成 App 可调用的
getSystemService())。
2.2 层间调用链路 ------ 一次"获取摄像头"的完整纵向穿越流程
下面这条流程图描述的是系统内部一条典型的纵向调用链,帮助你建立"层与层怎么接起来"的空间感:
#mermaid-svg-ZECzG5jke9OiYBUL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZECzG5jke9OiYBUL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZECzG5jke9OiYBUL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZECzG5jke9OiYBUL .error-icon{fill:#552222;}#mermaid-svg-ZECzG5jke9OiYBUL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZECzG5jke9OiYBUL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZECzG5jke9OiYBUL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZECzG5jke9OiYBUL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZECzG5jke9OiYBUL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZECzG5jke9OiYBUL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZECzG5jke9OiYBUL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZECzG5jke9OiYBUL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZECzG5jke9OiYBUL .marker.cross{stroke:#333333;}#mermaid-svg-ZECzG5jke9OiYBUL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZECzG5jke9OiYBUL p{margin:0;}#mermaid-svg-ZECzG5jke9OiYBUL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZECzG5jke9OiYBUL .cluster-label text{fill:#333;}#mermaid-svg-ZECzG5jke9OiYBUL .cluster-label span{color:#333;}#mermaid-svg-ZECzG5jke9OiYBUL .cluster-label span p{background-color:transparent;}#mermaid-svg-ZECzG5jke9OiYBUL .label text,#mermaid-svg-ZECzG5jke9OiYBUL span{fill:#333;color:#333;}#mermaid-svg-ZECzG5jke9OiYBUL .node rect,#mermaid-svg-ZECzG5jke9OiYBUL .node circle,#mermaid-svg-ZECzG5jke9OiYBUL .node ellipse,#mermaid-svg-ZECzG5jke9OiYBUL .node polygon,#mermaid-svg-ZECzG5jke9OiYBUL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZECzG5jke9OiYBUL .rough-node .label text,#mermaid-svg-ZECzG5jke9OiYBUL .node .label text,#mermaid-svg-ZECzG5jke9OiYBUL .image-shape .label,#mermaid-svg-ZECzG5jke9OiYBUL .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZECzG5jke9OiYBUL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZECzG5jke9OiYBUL .rough-node .label,#mermaid-svg-ZECzG5jke9OiYBUL .node .label,#mermaid-svg-ZECzG5jke9OiYBUL .image-shape .label,#mermaid-svg-ZECzG5jke9OiYBUL .icon-shape .label{text-align:center;}#mermaid-svg-ZECzG5jke9OiYBUL .node.clickable{cursor:pointer;}#mermaid-svg-ZECzG5jke9OiYBUL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZECzG5jke9OiYBUL .arrowheadPath{fill:#333333;}#mermaid-svg-ZECzG5jke9OiYBUL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZECzG5jke9OiYBUL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZECzG5jke9OiYBUL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZECzG5jke9OiYBUL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZECzG5jke9OiYBUL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZECzG5jke9OiYBUL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZECzG5jke9OiYBUL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZECzG5jke9OiYBUL .cluster text{fill:#333;}#mermaid-svg-ZECzG5jke9OiYBUL .cluster span{color:#333;}#mermaid-svg-ZECzG5jke9OiYBUL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZECzG5jke9OiYBUL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZECzG5jke9OiYBUL rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZECzG5jke9OiYBUL .icon-shape,#mermaid-svg-ZECzG5jke9OiYBUL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZECzG5jke9OiYBUL .icon-shape p,#mermaid-svg-ZECzG5jke9OiYBUL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZECzG5jke9OiYBUL .icon-shape .label rect,#mermaid-svg-ZECzG5jke9OiYBUL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZECzG5jke9OiYBUL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZECzG5jke9OiYBUL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZECzG5jke9OiYBUL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ① App 进程
CameraManager.openCamera
② Framework 层
CameraService 代理
③ Native 层
libcamera_client.so
④ HAL 层
camera.xxx.so
⑤ Kernel 层
Camera 驱动 / V4L2
⚠️ 这里的箭头不是让你去写调用代码 ,而是标注每一层的边界在哪里 :Framework 与 Native 的边界是 JNI ;Native 与 HAL 的边界是 标准 C 结构体函数表(
hw_module_t/hw_device_t) ;HAL 与 Kernel 的边界是 Unix 系统调用接口。
3. 逐层解剖:每一层到底是什么
第一层 · Linux 内核层(Linux Kernel)
3.1 官方定义
Android 的最底层是标准的 Linux 内核 (历史版本基于 Linux 长期支持分支 LTS,如 3.18 / 4.4 / 4.9 / 4.14 / 5.4 / 5.10 等,随版本演进)。它不是"魔改到认不出"的 Linux,而是在标准内核基础上增加了若干 Android 特有的内核组件:
| 内核组件 | 作用 |
|---|---|
Binder Driver (/dev/binder) |
Android 独占的 IPC 机制,内核级驱动,是所有跨进程通信的骨干 |
| Ashmem(匿名共享内存) | 跨进程共享大块内存的原语(新版本中被 memfd 逐步替代) |
| Logger(内核日志) | Android 早期内核日志驱动(现代转向 logd 用户态实现) |
| wakelocks | 电源锁机制,防止设备过早休眠 |
| 标准 Linux 子系统 | 进程调度(CFS)、内存管理(mmap / page cache)、文件系统(ext4 / f2fs)、网络(netfilter / tcpip)、设备驱动 |
3.2 为什么选 Linux 内核 ------ Google 官方给出的理由
根据 https://developer.android.google.cn/guide/platform:
- 线程与低级内存管理 :ART 依赖内核的
clone()/mmap()/pthread等原语实现进程和线程模型 - 安全模型:每个 App 对应一个唯一的 Linux UID/GID,文件权限 + SELinux 构成了沙箱的第一道防线
- 驱动生态:设备厂商已有成熟的 Linux 驱动开发路径
3.3 内核层代码片段(示意:Binder 驱动在内核中的存在形态)
c
/* drivers/android/binder.c ------ Linux 内核源码树中的 Binder 驱动(示意摘录) */
// Binder 设备在 /dev/binder 上注册为一个 misc 字符设备
static const struct file_operations binder_fops = {
.owner = THIS_MODULE,
.poll = binder_poll, // epoll 可读事件
.unlocked_ioctl = binder_ioctl, // ioctl 命令入口(BC_*/BR_* 协议)
.compat_ioctl = binder_compat_ioctl,
.mmap = binder_mmap, // 映射内核共享内存到用户空间
.open = binder_open,
.release = binder_release,
};
static int __init binder_init(void) {
// 向内核注册 misc 设备
misc_register(&binder_miscdev);
return 0;
}
📖 你不需要记住这段代码。关键是理解:Binder 不是一个 "Framework 层的东西",它扎根在内核里,
ioctl()是对它的操作命令通道。
第二层 · 硬件抽象层(HAL --- Hardware Abstraction Layer)
3.1 HAL 的官方定义与存在意义
HAL 解决的是一个工程事实 :Android 要跑在成百上千种硬件板上,每种板子的摄像头 IC、音频 codec、传感器型号都不一样------如果 Framework 层直接耦合具体硬件驱动,Android 就成了一坨不可移植的硬代码。
HAL 的做法是:
定义一套标准 C 语言接口(头文件
.h)→ 厂商提供对应的动态库实现(.so)→ Framework 通过dlopen()动态加载 → 只调用接口函数表里的指针,不看底层怎么实现
3.2 HAL 的核心数据结构(标准契约)
每一个 HAL 模块都遵循同一个准入契约:
c
/* hardware/libhardware/include/hardware/hardware.h ------ AOSP 源码 */
typedef struct hw_module_t {
uint32_t tag; // 必须为 HARDWARE_MODULE_TAG
uint16_t module_api_version;
uint16_t hal_api_version;
const char *id; // 模块标识:"camera" / "sensors" / "lights" ...
const char *name;
const char *author;
struct hw_module_methods_t* methods;
// ...
} hw_module_t;
typedef struct hw_module_methods_t {
// 打开设备 ------ 所有 HAL 的入口都走这个函数指针
int (*open)(const struct hw_module_t* module,
const char* id,
struct hw_device_t** device);
} hw_module_methods_t;
typedef struct hw_device_t {
uint32_t tag; // HARDWARE_DEVICE_TAG
uint32_t version;
struct hw_module_t* module;
// ...
int (*close)(struct hw_device_t* device);
} hw_device_t;
而具体硬件模块会在此基础上"派生":
c
/* hardware/libhardware/include/hardware/camera.h */
typedef struct camera_module {
hw_module_t common; // ← 必须第一个字段,相当于 C 风格"继承"
// 相机特有扩展接口......
} camera_module_t;
typedef struct camera_device {
hw_device_t common; // ← 同上
camera_device_ops_t *ops; // 函数表:start_preview / take_picture / stop_preview ...
} camera_device_t;
3.3 HAL 加载机制(Framework 如何找到 .so)
Framework 侧的 Native 代码通过 hw_get_module() 完成加载:
c
// hardware/libhardware/hardware.c(AOSP 精简示意)
int hw_get_module(const char *id, const struct hw_module_t **module) {
// 1. 拼路径:/vendor/lib/hw/<id>.<subarch>.so 或 /system/lib/hw/<id>.default.so
// 2. dlopen(path)
// 3. dlsym(handle, HAL_MODULE_INFO_SYM) → 拿到 hw_module_t*
// 4. 校验 magic tag
// 5. 返回 module
}
这就是 HAL 的全部魔法 :一个约定好的 hw_module_t 结构体 + dlopen() 动态链接 + 函数指针表。没有反射、没有注解、没有框架------就是 C 语言的经典手法。
第三层 · 系统运行库层(Native Libraries & Android Runtime)
这一层其实包含 两条平行轨道:
轨道 A:原生 C/C++ 库(Native Libraries)
这些是不带虚拟机色彩的纯原生能力,由 C/C++ 编译而来:
| 库 | 职责 |
|---|---|
libc(Bionic) |
Android 自研 C 标准库(非 glibc),轻量、专为嵌入式调优 |
libsqlite.so |
SQLite 引擎本体 |
libGLESv2.so / libEGL.so |
OpenGL ES 图形渲染 |
libmedia.so / libstagefright.so |
音视频编解码管线 |
libssl.so / libcrypto.so |
TLS / 加密 |
libgui.so |
SurfaceFlinger 客户端接口(BufferQueue 等) |
libbinder.so |
Binder 的用户态库封装 |
轨道 B:Android Runtime(ART)
ART 是 Android 应用的执行引擎。它的核心任务是:
- 读取
.dex/.oat格式的字节码 - 翻译成(或解释执行)机器指令
- 管理对象的生命周期(Garbage Collector)
- 提供 Java 核心库的 Native 实现(通过 JNI 桥到
libcore)
关键文件形态:
classes.dex ← Dalvik Executable,多 .class 合并优化后的字节码
.oat (ELF) ← ART AOT 编译产物,预编译为本地机器码
.vdex ← 验证过的 DEX 缓存,加速后续编译
ART 的两种编译策略(官方定义):
| 策略 | 说明 |
|---|---|
| AOT(Ahead-of-Time) | 安装/OTA 时将 DEX 编译为机器码(.oat),运行时直接执行,启动快 |
| JIT(Just-In-Time) | 运行时根据热路径对 DEX 做即时编译并缓存 profile,平衡首次安装速度与长期性能 |
Android 5.0 ~ 7.x:以 AOT 为主(安装即全量编译,
dex2oat)Android 7.0+(N 及以后):混合模式------安装时做轻量验证,运行时 JIT + profile-guided 后台 AOT
ART 与 Linux Kernel 的关系
ART 依赖 Linux 内核实现线程创建 (
clone)、内存映射 (mmap)、文件 I/O 和 线程同步原语 (futex)------这就是为什么文档里写 "ART depends on the Linux kernel for underlying functionality such as thread and low-level memory management"。
第四层 · Java API 框架层(Application Framework Layer)
3.1 它是什么
这是大多数人所理解的"Android API"所在的地方------但它本质上只是 对下层能力的 Java 封装 + 系统服务的管家。
框架层不是一块铁板,它由一系列常驻的系统服务(System Services)和供 App 调用的公开 API 类 组成。这些系统服务不运行在你的 App 进程里 ,而是运行在一个叫 system_server 的特殊系统进程里。
| 框架组件(Java 类名) | 背后对应的系统服务 | 管什么事 |
|---|---|---|
ActivityManager |
ActivityManagerService (AMS) |
四大组件生命周期调度、进程管理 |
WindowManager |
WindowManagerService (WMS) |
窗口层级、Surface 管理 |
PackageManager |
PackageManagerService (PMS) |
包安装/解析/权限/组件信息查询 |
InputManager |
InputManagerService (IMS) |
输入事件采集与分发 |
NotificationManager |
NotificationManagerService (NMS) |
通知条管理 |
PowerManager |
PowerManagerService |
唤醒锁、休眠策略 |
ConnectivityManager |
ConnectivityService |
网络连接状态 |
3.2 框架层的关键设计:Binder IPC 把 App 和 system_server 连起来
当你调用 context.getSystemService(Context.ACTIVITY_SERVICE) 拿到的并不是 AMS 本体,而是一个Binder Proxy ------它通过 /dev/binder 把请求发到 system_server 进程中真正的 AMS 去执行:
java
// android.app.ActivityManager ------ 框架层公开 API(精简示意)
public class ActivityManager {
public static IActivityManager getService() {
// 拿到 Binder Proxy → 通过 transact() 发往 system_server
return IActivityManagerStub.asInterface(
ServiceManager.getService(Context.ACTIVITY_SERVICE)
);
}
}
// App 侧调用(纯学术语境下的调用关系):
// ActivityManager.getService().startActivity(...)
// → Binder IPC 穿过进程边界
// → system_server 内 ActivityManagerService 收到请求 → 调度真实逻辑
🔑 这句是整篇最重要的认知锚点之一 :Framework 层的大部分"Manager"类不直接做事,它们只是 Binder 客户端的门面(Facade)。真正干活的人在另一个进程。
第五层 · 应用层(Application Layer)
3.1 官方定义
应用层包含:
- 系统应用 :随 ROM 内置(
/system/app/或/system/priv-app/),如 设置、Launcher、电话 - 用户应用 :安装到
/data/app/,即你从应用商店装的第三方 App
系统应用和第三方应用运行在同一个规则体系下 :它们都用同样的 Framework API、同样的四大组件模型、同样的沙箱隔离(每个 App 一个 UID,各自的数据目录归各自所有)。区别只在签名权限 和priv-app 路径带来的 elevated permission 层级。
3.2 应用进程从哪来
所有 Android 应用进程都不是你"手动 fork"出来的,而是由 Zygote 进程 (在 init 阶段启动的一个特殊根进程)fork 出来的。Zygote 预先加载了 Framework 的核心类和资源,子进程通过 copy-on-write 继承这份已初始化的堆,从而大幅加速应用启动。
(这一点在后续《第四篇:进程孵化 Zygote 与 Low Memory Killer》中会展开讲。)
4. 两张横向对比表 ------ 层与层的关系
4.1 每层用什么语言/什么形态存在
| 层 | 语言/形态 | 存在形式 | 谁用它 |
|---|---|---|---|
| Linux Kernel | C(少量汇编) | vmlinux + ko 驱动模块 | HAL、用户态 libc |
| HAL | C 接口 + .so |
/vendor/lib/hw/*.so |
Native Libs(通过 dlopen) |
| Native Libraries & ART | C/C++(部分汇编) | .so + 可执行文件(app_process、dex2oat) |
Framework(JNI 调用) / 自身互调 |
| Java API Framework | Java | framework.jar + services.jar |
App 进程(Binder IPC 到 system_server) |
| Application Layer | Java/Kotlin 字节码(DEX) | APK 内的 classes.dex |
---(顶层,被用户触发) |
4.2 层间边界------靠什么跨越
| 边界 | 跨越机制 | 方向 |
|---|---|---|
| Framework ↔ Native | JNI(Java Native Interface) | 双向 |
| Native ↔ HAL | dlopen() + 标准 C 函数指针表 (hw_module_t) |
Native → HAL |
| HAL ↔ Kernel | 系统调用 (ioctl / read / write / mmap / poll) |
HAL → Kernel |
| App进程 ↔ system_server | Binder IPC (/dev/binder) |
双向 |
| App进程 ↔ App进程 | Binder / Intent(底层仍是 Binder) | 受权限约束 |
5. 一个完整的小型思维实验:按下 App 图标后,系统内部经过了哪些层
#mermaid-svg-LK66JRHEE5Luizsp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LK66JRHEE5Luizsp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LK66JRHEE5Luizsp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LK66JRHEE5Luizsp .error-icon{fill:#552222;}#mermaid-svg-LK66JRHEE5Luizsp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LK66JRHEE5Luizsp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LK66JRHEE5Luizsp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LK66JRHEE5Luizsp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LK66JRHEE5Luizsp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LK66JRHEE5Luizsp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LK66JRHEE5Luizsp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LK66JRHEE5Luizsp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LK66JRHEE5Luizsp .marker.cross{stroke:#333333;}#mermaid-svg-LK66JRHEE5Luizsp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LK66JRHEE5Luizsp p{margin:0;}#mermaid-svg-LK66JRHEE5Luizsp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LK66JRHEE5Luizsp .cluster-label text{fill:#333;}#mermaid-svg-LK66JRHEE5Luizsp .cluster-label span{color:#333;}#mermaid-svg-LK66JRHEE5Luizsp .cluster-label span p{background-color:transparent;}#mermaid-svg-LK66JRHEE5Luizsp .label text,#mermaid-svg-LK66JRHEE5Luizsp span{fill:#333;color:#333;}#mermaid-svg-LK66JRHEE5Luizsp .node rect,#mermaid-svg-LK66JRHEE5Luizsp .node circle,#mermaid-svg-LK66JRHEE5Luizsp .node ellipse,#mermaid-svg-LK66JRHEE5Luizsp .node polygon,#mermaid-svg-LK66JRHEE5Luizsp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LK66JRHEE5Luizsp .rough-node .label text,#mermaid-svg-LK66JRHEE5Luizsp .node .label text,#mermaid-svg-LK66JRHEE5Luizsp .image-shape .label,#mermaid-svg-LK66JRHEE5Luizsp .icon-shape .label{text-anchor:middle;}#mermaid-svg-LK66JRHEE5Luizsp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LK66JRHEE5Luizsp .rough-node .label,#mermaid-svg-LK66JRHEE5Luizsp .node .label,#mermaid-svg-LK66JRHEE5Luizsp .image-shape .label,#mermaid-svg-LK66JRHEE5Luizsp .icon-shape .label{text-align:center;}#mermaid-svg-LK66JRHEE5Luizsp .node.clickable{cursor:pointer;}#mermaid-svg-LK66JRHEE5Luizsp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LK66JRHEE5Luizsp .arrowheadPath{fill:#333333;}#mermaid-svg-LK66JRHEE5Luizsp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LK66JRHEE5Luizsp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LK66JRHEE5Luizsp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LK66JRHEE5Luizsp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LK66JRHEE5Luizsp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LK66JRHEE5Luizsp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LK66JRHEE5Luizsp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LK66JRHEE5Luizsp .cluster text{fill:#333;}#mermaid-svg-LK66JRHEE5Luizsp .cluster span{color:#333;}#mermaid-svg-LK66JRHEE5Luizsp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LK66JRHEE5Luizsp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LK66JRHEE5Luizsp rect.text{fill:none;stroke-width:0;}#mermaid-svg-LK66JRHEE5Luizsp .icon-shape,#mermaid-svg-LK66JRHEE5Luizsp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LK66JRHEE5Luizsp .icon-shape p,#mermaid-svg-LK66JRHEE5Luizsp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LK66JRHEE5Luizsp .icon-shape .label rect,#mermaid-svg-LK66JRHEE5Luizsp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LK66JRHEE5Luizsp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LK66JRHEE5Luizsp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LK66JRHEE5Luizsp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Launcher 调用
startActivity(Intent)
Binder IPC 穿进程
→ system_server
PMS 解析 intent / 查 ResolveInfo
确认目标包名 + Activity
若目标进程未存活 →
通知 Zygote fork 新进程
新进程进入:
ActivityThread.main()
Looper 启动 → Binder 线程池初始化
AMS 调度:
调用 scheduleLaunchActivity
→ Binder 回到 App 进程
用户在 Launcher(也是一个 App)
点击图标
Framework 层
ActivityManager.getService()
ActivityManagerService
(system_server 内)
PackageManagerService
Zygote → fork() → 新 App 进程
App 进程初始化
Activity 实例创建
→ onCreate → setContentView
→ onResume
每一个箭头都有据可查 ,对应 AOSP 里真实的类和方法调用链。你现在不需要背下来,但要记住它的形状:App → Binder → system_server → Zygote → 新 App 进程 → 回到 App 。这就是 Android 的运行哲学------一切关键调度都跨进程,一切跨进程都走 Binder。
6. AOSP 源码仓库结构速览(学术导航)
知道架构图还不够,你得知道去哪里看源码印证。AOSP 的代码组织结构本身就反映了分层:
AOSP/
├── kernel/ # ① Linux 内核(有时单独 repo)
├── hardware/libhardware/ # ② HAL 头文件 + 加载逻辑(hw_module_t 等)
│ └── include/hardware/
├── hardware/qcom/ # ② 厂商 HAL .so 实现(高通例)
├── bionic/ # ③ Bionic libc(C 运行库)
├── external/sqlite/ # ③ 原生第三方库(SQLite / openssl / ...)
├── frameworks/native/ # ③ Native 侧:libgui / libbinder / inputflinger
├── frameworks/base/ # ④ Java 框架层:
│ ├── core/java/android/ # 公开 API(android.* 包)
│ ├── services/ # system_server 里的各 Service
│ └── cmds/am/ # am 命令等
├── art/ # ③ ART 虚拟机本体
├── packages/apps/Settings/ # ⑤ 系统应用(设置)
├── packages/apps/Launcher3/ # ⑤ 系统应用(桌面)
└── build/ # 编译体系(Soong / Blueprint / envsetup.sh)
📌 学术阅读顺序建议:从
frameworks/base/core/java/android/看 Framework API 长什么样 → 顺着 JNI 跳到frameworks/native/和art/→ 顺着 HAL 接口看hardware/libhardware/→ 落到驱动看kernel/。
7. 本篇总结(知识闭环)
| 你要带走的认知 | 一句话 |
|---|---|
| Android 是 Linux | 内核层干进程、内存、驱动、IPC 的脏活累活 |
| 硬件差异被 HAL 吃掉 | 厂商写 .so,Framework 用 dlopen() + 函数指针调它------不污染上层 |
| 应用不直接碰系统 | App 调的 Manager 类大多是 Binder Proxy,真活儿在 system_server |
| 每个 App 是一个沙箱进程 | 独立 UID、独立 ART 实例、通过 Zygote fork 出生 |
| 字节码才是交付物 | APK 里不是 .class,是专门为 Android 设计的 .dex,由 ART 执行 |
下一篇预告 :第一板块:Android 系统基石与运行原理 | 第二篇 · Android 编译、打包与安装机制 ------从
javac到d8到dex到apk到PackageManagerService的安装全过程。我们将看到你写的那几个.kt/.java文件究竟是如何变成一个"可以被系统识别和启动的包"的。