云计算百科
云计算领域专业知识百科平台

第一板块:Android 系统基石与运行原理 | 第一篇:Android 系统架构分层与 AOSP 规范

第一板块: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-qBqHQLUSoW9fyw3a{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-qBqHQLUSoW9fyw3a .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qBqHQLUSoW9fyw3a .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qBqHQLUSoW9fyw3a .error-icon{fill:#552222;}#mermaid-svg-qBqHQLUSoW9fyw3a .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qBqHQLUSoW9fyw3a .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qBqHQLUSoW9fyw3a .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qBqHQLUSoW9fyw3a .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qBqHQLUSoW9fyw3a .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qBqHQLUSoW9fyw3a .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qBqHQLUSoW9fyw3a .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qBqHQLUSoW9fyw3a .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qBqHQLUSoW9fyw3a .marker.cross{stroke:#333333;}#mermaid-svg-qBqHQLUSoW9fyw3a svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qBqHQLUSoW9fyw3a p{margin:0;}#mermaid-svg-qBqHQLUSoW9fyw3a .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-qBqHQLUSoW9fyw3a .cluster-label text{fill:#333;}#mermaid-svg-qBqHQLUSoW9fyw3a .cluster-label span{color:#333;}#mermaid-svg-qBqHQLUSoW9fyw3a .cluster-label span p{background-color:transparent;}#mermaid-svg-qBqHQLUSoW9fyw3a .label text,#mermaid-svg-qBqHQLUSoW9fyw3a span{fill:#333;color:#333;}#mermaid-svg-qBqHQLUSoW9fyw3a .node rect,#mermaid-svg-qBqHQLUSoW9fyw3a .node circle,#mermaid-svg-qBqHQLUSoW9fyw3a .node ellipse,#mermaid-svg-qBqHQLUSoW9fyw3a .node polygon,#mermaid-svg-qBqHQLUSoW9fyw3a .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qBqHQLUSoW9fyw3a .rough-node .label text,#mermaid-svg-qBqHQLUSoW9fyw3a .node .label text,#mermaid-svg-qBqHQLUSoW9fyw3a .image-shape .label,#mermaid-svg-qBqHQLUSoW9fyw3a .icon-shape .label{text-anchor:middle;}#mermaid-svg-qBqHQLUSoW9fyw3a .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qBqHQLUSoW9fyw3a .rough-node .label,#mermaid-svg-qBqHQLUSoW9fyw3a .node .label,#mermaid-svg-qBqHQLUSoW9fyw3a .image-shape .label,#mermaid-svg-qBqHQLUSoW9fyw3a .icon-shape .label{text-align:center;}#mermaid-svg-qBqHQLUSoW9fyw3a .node.clickable{cursor:pointer;}#mermaid-svg-qBqHQLUSoW9fyw3a .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qBqHQLUSoW9fyw3a .arrowheadPath{fill:#333333;}#mermaid-svg-qBqHQLUSoW9fyw3a .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qBqHQLUSoW9fyw3a .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qBqHQLUSoW9fyw3a .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qBqHQLUSoW9fyw3a .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qBqHQLUSoW9fyw3a .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qBqHQLUSoW9fyw3a .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qBqHQLUSoW9fyw3a .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qBqHQLUSoW9fyw3a .cluster text{fill:#333;}#mermaid-svg-qBqHQLUSoW9fyw3a .cluster span{color:#333;}#mermaid-svg-qBqHQLUSoW9fyw3a 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-qBqHQLUSoW9fyw3a .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qBqHQLUSoW9fyw3a rect.text{fill:none;stroke-width:0;}#mermaid-svg-qBqHQLUSoW9fyw3a .icon-shape,#mermaid-svg-qBqHQLUSoW9fyw3a .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qBqHQLUSoW9fyw3a .icon-shape p,#mermaid-svg-qBqHQLUSoW9fyw3a .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qBqHQLUSoW9fyw3a .icon-shape .label rect,#mermaid-svg-qBqHQLUSoW9fyw3a .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qBqHQLUSoW9fyw3a .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qBqHQLUSoW9fyw3a .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qBqHQLUSoW9fyw3a :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 RuntimeC/C++ 原生库 + ART 虚拟机运行时

Native Libs(SQLite / OpenGL ES / WebKit / SSL / Media / Freetype…)

ARTDEX 执行 · 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-PJK2GWB5YCq3atJk{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-PJK2GWB5YCq3atJk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PJK2GWB5YCq3atJk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PJK2GWB5YCq3atJk .error-icon{fill:#552222;}#mermaid-svg-PJK2GWB5YCq3atJk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PJK2GWB5YCq3atJk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PJK2GWB5YCq3atJk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PJK2GWB5YCq3atJk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PJK2GWB5YCq3atJk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PJK2GWB5YCq3atJk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PJK2GWB5YCq3atJk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PJK2GWB5YCq3atJk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PJK2GWB5YCq3atJk .marker.cross{stroke:#333333;}#mermaid-svg-PJK2GWB5YCq3atJk svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PJK2GWB5YCq3atJk p{margin:0;}#mermaid-svg-PJK2GWB5YCq3atJk .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-PJK2GWB5YCq3atJk .cluster-label text{fill:#333;}#mermaid-svg-PJK2GWB5YCq3atJk .cluster-label span{color:#333;}#mermaid-svg-PJK2GWB5YCq3atJk .cluster-label span p{background-color:transparent;}#mermaid-svg-PJK2GWB5YCq3atJk .label text,#mermaid-svg-PJK2GWB5YCq3atJk span{fill:#333;color:#333;}#mermaid-svg-PJK2GWB5YCq3atJk .node rect,#mermaid-svg-PJK2GWB5YCq3atJk .node circle,#mermaid-svg-PJK2GWB5YCq3atJk .node ellipse,#mermaid-svg-PJK2GWB5YCq3atJk .node polygon,#mermaid-svg-PJK2GWB5YCq3atJk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PJK2GWB5YCq3atJk .rough-node .label text,#mermaid-svg-PJK2GWB5YCq3atJk .node .label text,#mermaid-svg-PJK2GWB5YCq3atJk .image-shape .label,#mermaid-svg-PJK2GWB5YCq3atJk .icon-shape .label{text-anchor:middle;}#mermaid-svg-PJK2GWB5YCq3atJk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PJK2GWB5YCq3atJk .rough-node .label,#mermaid-svg-PJK2GWB5YCq3atJk .node .label,#mermaid-svg-PJK2GWB5YCq3atJk .image-shape .label,#mermaid-svg-PJK2GWB5YCq3atJk .icon-shape .label{text-align:center;}#mermaid-svg-PJK2GWB5YCq3atJk .node.clickable{cursor:pointer;}#mermaid-svg-PJK2GWB5YCq3atJk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PJK2GWB5YCq3atJk .arrowheadPath{fill:#333333;}#mermaid-svg-PJK2GWB5YCq3atJk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PJK2GWB5YCq3atJk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PJK2GWB5YCq3atJk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PJK2GWB5YCq3atJk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PJK2GWB5YCq3atJk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PJK2GWB5YCq3atJk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PJK2GWB5YCq3atJk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PJK2GWB5YCq3atJk .cluster text{fill:#333;}#mermaid-svg-PJK2GWB5YCq3atJk .cluster span{color:#333;}#mermaid-svg-PJK2GWB5YCq3atJk 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-PJK2GWB5YCq3atJk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PJK2GWB5YCq3atJk rect.text{fill:none;stroke-width:0;}#mermaid-svg-PJK2GWB5YCq3atJk .icon-shape,#mermaid-svg-PJK2GWB5YCq3atJk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PJK2GWB5YCq3atJk .icon-shape p,#mermaid-svg-PJK2GWB5YCq3atJk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PJK2GWB5YCq3atJk .icon-shape .label rect,#mermaid-svg-PJK2GWB5YCq3atJk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PJK2GWB5YCq3atJk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PJK2GWB5YCq3atJk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PJK2GWB5YCq3atJk :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 驱动在内核中的存在形态)

/* 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 模块都遵循同一个准入契约:

/* 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;

而具体硬件模块会在此基础上"派生":

/* 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() 完成加载:

// 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 去执行:

    // 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-83eht9gC0DMFY7ca{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-83eht9gC0DMFY7ca .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-83eht9gC0DMFY7ca .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-83eht9gC0DMFY7ca .error-icon{fill:#552222;}#mermaid-svg-83eht9gC0DMFY7ca .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-83eht9gC0DMFY7ca .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-83eht9gC0DMFY7ca .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-83eht9gC0DMFY7ca .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-83eht9gC0DMFY7ca .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-83eht9gC0DMFY7ca .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-83eht9gC0DMFY7ca .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-83eht9gC0DMFY7ca .marker{fill:#333333;stroke:#333333;}#mermaid-svg-83eht9gC0DMFY7ca .marker.cross{stroke:#333333;}#mermaid-svg-83eht9gC0DMFY7ca svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-83eht9gC0DMFY7ca p{margin:0;}#mermaid-svg-83eht9gC0DMFY7ca .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-83eht9gC0DMFY7ca .cluster-label text{fill:#333;}#mermaid-svg-83eht9gC0DMFY7ca .cluster-label span{color:#333;}#mermaid-svg-83eht9gC0DMFY7ca .cluster-label span p{background-color:transparent;}#mermaid-svg-83eht9gC0DMFY7ca .label text,#mermaid-svg-83eht9gC0DMFY7ca span{fill:#333;color:#333;}#mermaid-svg-83eht9gC0DMFY7ca .node rect,#mermaid-svg-83eht9gC0DMFY7ca .node circle,#mermaid-svg-83eht9gC0DMFY7ca .node ellipse,#mermaid-svg-83eht9gC0DMFY7ca .node polygon,#mermaid-svg-83eht9gC0DMFY7ca .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-83eht9gC0DMFY7ca .rough-node .label text,#mermaid-svg-83eht9gC0DMFY7ca .node .label text,#mermaid-svg-83eht9gC0DMFY7ca .image-shape .label,#mermaid-svg-83eht9gC0DMFY7ca .icon-shape .label{text-anchor:middle;}#mermaid-svg-83eht9gC0DMFY7ca .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-83eht9gC0DMFY7ca .rough-node .label,#mermaid-svg-83eht9gC0DMFY7ca .node .label,#mermaid-svg-83eht9gC0DMFY7ca .image-shape .label,#mermaid-svg-83eht9gC0DMFY7ca .icon-shape .label{text-align:center;}#mermaid-svg-83eht9gC0DMFY7ca .node.clickable{cursor:pointer;}#mermaid-svg-83eht9gC0DMFY7ca .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-83eht9gC0DMFY7ca .arrowheadPath{fill:#333333;}#mermaid-svg-83eht9gC0DMFY7ca .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-83eht9gC0DMFY7ca .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-83eht9gC0DMFY7ca .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-83eht9gC0DMFY7ca .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-83eht9gC0DMFY7ca .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-83eht9gC0DMFY7ca .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-83eht9gC0DMFY7ca .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-83eht9gC0DMFY7ca .cluster text{fill:#333;}#mermaid-svg-83eht9gC0DMFY7ca .cluster span{color:#333;}#mermaid-svg-83eht9gC0DMFY7ca 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-83eht9gC0DMFY7ca .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-83eht9gC0DMFY7ca rect.text{fill:none;stroke-width:0;}#mermaid-svg-83eht9gC0DMFY7ca .icon-shape,#mermaid-svg-83eht9gC0DMFY7ca .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-83eht9gC0DMFY7ca .icon-shape p,#mermaid-svg-83eht9gC0DMFY7ca .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-83eht9gC0DMFY7ca .icon-shape .label rect,#mermaid-svg-83eht9gC0DMFY7ca .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-83eht9gC0DMFY7ca .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-83eht9gC0DMFY7ca .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-83eht9gC0DMFY7ca :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 文件究竟是如何变成一个"可以被系统识别和启动的包"的。


    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 第一板块:Android 系统基石与运行原理 | 第一篇:Android 系统架构分层与 AOSP 规范
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!