第一板块: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-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 应用的执行引擎。它的核心任务是:

  1. 读取 .dex / .oat 格式的字节码
  2. 翻译成(或解释执行)机器指令
  3. 管理对象的生命周期(Garbage Collector
  4. 提供 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_processdex2oat 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 编译、打包与安装机制 ------从 javacd8dexapkPackageManagerService 的安装全过程。我们将看到你写的那几个 .kt / .java 文件究竟是如何变成一个"可以被系统识别和启动的包"的。


相关推荐
名不经传的养虾人1 小时前
从0到1:企业级AI项目迭代日记 Vol.41|多租户不是一个功能,是一次手术
服务器·数据库·系统架构·ai编程·ai工作流·企业ai
故渊at1 小时前
系列三:组件化与模块化进阶 | 第12篇 老项目重构实战(绞杀者模式):从单体巨石到组件化架构的无痛迁移
android·重构·架构·模块化·组件化
神仙别闹1 小时前
基于Android的科学计算器
android
say_fall2 小时前
Linux系统编程(十一):深入理解Linux进程地址空间
android·linux·运维
程思扬2 小时前
Android 大厂编码规范
android·网络·安全·开源·流程图
SoftLipaRZC2 小时前
C语言文件:文件操作完全指南
android·java·c语言
@insist1232 小时前
系统架构设计师-软件容错架构设计:高可靠系统构建指南
架构·系统架构·软考·系统架构设计师·软件水平考试
2501_916007472 小时前
不用 Mac 也可以 Windows下管理iOS描述文件的非Xcode完整指南
android·ios·小程序·https·uni-app·iphone·webview
@insist1232 小时前
系统架构设计师-信息安全核心技术加解密、PKI、访问控制
系统架构·软考·系统架构设计师·软件水平考试