📚 Android 系统全景专栏 · 持续更新中
本系列从内核驱动(Binder/ashmem/wakelock)到 HAL 移植,到 ART/Framework,到应用启动全链路,再到 Treble/CTS 生态外围。
👉 想系统追更,戳这里查看完整专栏:
👉 其他技术系列专栏,欢迎关注、交流、共同成长:
【操作系统设计思想系列】 【CAN 技术系列】 【SPI 技术系列】【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【Linux内核系列】
一句话 :本专栏把 Android 当成"Linux 内核 + 一层为移动/碎片化/沙箱重新设计的用户态"来拆------从内核驱动(Binder/ashmem/wakelock)到 HAL 移植,到 ART/Framework,到应用启动全链路,再到 Treble/CTS 生态外围,21 篇打通从内核到应用的完整调用链 。不是"Android 开发入门",是给中高级 BSP/底层工程师做系统全景与底层深挖 的硬核专栏。重心在 BSP/HAL 底层 (贴近你工作),上三层做"打通理解"。所有论述围绕调用链与源码路径,不堆 API 文档。
本专栏的价值是建立一根纵向坐标系 :一旦理解"Android 每一层为什么这样设计(为移动?为碎片化?为沙箱?为 OTA?)",所有模块在你眼里就只剩调用链 + 分层契约 。这根轴立起来后,移植一个 HAL 不该从零(08 篇 HAL 架构 + 09-12 篇各 HAL 模板),定位一个 ANR 先看哪条调用链(16/17 篇启动链+四大组件),过 CTS 先补哪层(21 篇)。嵌入式/BSP 视角:Android 不是"Linux 加个 UI",是"Linux 内核被改造成移动地基 + 整个用户态为碎片化治理重写"
本专栏对BSP的价值:① 内核侧 (03-07 篇)告诉你 Android 内核相对主线 Linux 改了什么、为什么;② HAL 侧 (08-12 篇)是 BSP 主交付物,Treble 后怎么写;③ 生态外围(20-21 篇)是出厂认证必经。Framework/应用层(16-19 篇)做"打通理解",让你出问题能从应用一路追到内核,不卡在中间。全程对照 Linux 纯栈(bionic vs glibc、Binder vs socket/pipe、ART vs JVM)。
一、总图:从内核到应用的七层推进
#mermaid-svg-E4V2TLFb8V8dvOV7{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-E4V2TLFb8V8dvOV7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-E4V2TLFb8V8dvOV7 .error-icon{fill:#552222;}#mermaid-svg-E4V2TLFb8V8dvOV7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-E4V2TLFb8V8dvOV7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .marker.cross{stroke:#333333;}#mermaid-svg-E4V2TLFb8V8dvOV7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-E4V2TLFb8V8dvOV7 p{margin:0;}#mermaid-svg-E4V2TLFb8V8dvOV7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .cluster-label text{fill:#333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .cluster-label span{color:#333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .cluster-label span p{background-color:transparent;}#mermaid-svg-E4V2TLFb8V8dvOV7 .label text,#mermaid-svg-E4V2TLFb8V8dvOV7 span{fill:#333;color:#333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .node rect,#mermaid-svg-E4V2TLFb8V8dvOV7 .node circle,#mermaid-svg-E4V2TLFb8V8dvOV7 .node ellipse,#mermaid-svg-E4V2TLFb8V8dvOV7 .node polygon,#mermaid-svg-E4V2TLFb8V8dvOV7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-E4V2TLFb8V8dvOV7 .rough-node .label text,#mermaid-svg-E4V2TLFb8V8dvOV7 .node .label text,#mermaid-svg-E4V2TLFb8V8dvOV7 .image-shape .label,#mermaid-svg-E4V2TLFb8V8dvOV7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-E4V2TLFb8V8dvOV7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-E4V2TLFb8V8dvOV7 .rough-node .label,#mermaid-svg-E4V2TLFb8V8dvOV7 .node .label,#mermaid-svg-E4V2TLFb8V8dvOV7 .image-shape .label,#mermaid-svg-E4V2TLFb8V8dvOV7 .icon-shape .label{text-align:center;}#mermaid-svg-E4V2TLFb8V8dvOV7 .node.clickable{cursor:pointer;}#mermaid-svg-E4V2TLFb8V8dvOV7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .arrowheadPath{fill:#333333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-E4V2TLFb8V8dvOV7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E4V2TLFb8V8dvOV7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-E4V2TLFb8V8dvOV7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E4V2TLFb8V8dvOV7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-E4V2TLFb8V8dvOV7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-E4V2TLFb8V8dvOV7 .cluster text{fill:#333;}#mermaid-svg-E4V2TLFb8V8dvOV7 .cluster span{color:#333;}#mermaid-svg-E4V2TLFb8V8dvOV7 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-E4V2TLFb8V8dvOV7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-E4V2TLFb8V8dvOV7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-E4V2TLFb8V8dvOV7 .icon-shape,#mermaid-svg-E4V2TLFb8V8dvOV7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E4V2TLFb8V8dvOV7 .icon-shape p,#mermaid-svg-E4V2TLFb8V8dvOV7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-E4V2TLFb8V8dvOV7 .icon-shape .label rect,#mermaid-svg-E4V2TLFb8V8dvOV7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E4V2TLFb8V8dvOV7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-E4V2TLFb8V8dvOV7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-E4V2TLFb8V8dvOV7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} L7 生态外围
⑳ Treble 分区/OTA/Virtual A/B
㉑ CTS/VTS/GMS + Mainline/APEX
L6 应用层
⑲ APK/签名/安装 + 应用启动全链路
L5 Framework
⑯ 启动链 init→Zygote→SystemServer
⑰ 四大组件 + AMS/WMS/PMS
⑱ Binder Framework 层
L4 Native + ART
⑬ bionic + Native 启动链
⑭ ART 运行时
⑮ Stagefright 媒体
L3 HAL --- BSP 主战场
⑧ HAL 架构 + HIDL/AIDL
⑨ Audio HAL
⑩ Camera HAL3
⑪ Graphics HAL
⑫ Sensor/BT/GPS/Keymaster 群像
L2 Linux 内核 --- BSP 核心
③ ACK/GKI/vendor 模块
④ Binder 驱动 · IPC 命门
⑤ ashmem/ion/dma-heap
⑥ wakelock/lmk/PSI
⑦ EAS 调度/cpuset/uid
L1 地基 --- 全景与编译
① 架构全景
六层贯通
② AOSP 源码与编译
repo/manifest/Soong/lunch
📜 Android 系统全景专栏
(21 篇 · BSP 底层侧重)
七层权重 :L2 内核(5 篇)+ L3 HAL(5 篇)+ L1 编译(1 篇)+ L7 生态(2 篇)= 13 篇 BSP 底层(62%) ;L4 Native+ART(3 篇)+ L5 Framework(3 篇)+ L6 应用(1 篇)= 7 篇上层打通(33%);L1 架构全景(1 篇)做总纲(5%)。这是"BSP 底层侧重 + 全链路打通"的篇目配比。
二、核心命题:全专栏围绕的六句话
- Android 不是 Linux:Android = Linux 内核 + 一层"为移动/碎片化/沙箱"重新设计的用户态(Binder/ART/HAL/Framework)。内核只是地基,真正的 Android 在用户态。
- Binder 是 Android 的脊梁 :几乎所有跨进程通信走 Binder(内核驱动 + 用户态 libbinder + Framework 封装)。理解 Binder = 理解 Android 一半------04 篇内核侧、18 篇 Framework 侧,两篇合起来才是完整 Binder。
- HAL 是 BSP 的命门 :Treble 后 HAL 用 HIDL/AIDL 与 Framework 解耦,BSP 工程师的核心交付物是
vendor.img里的 HAL 实现。08 篇立架构,09-12 篇逐 HAL 模板。 - ART 不是 JVM:DEX 字节码 + AOT(安装时)/JIT(运行时)混编 + 分代 GC,是为"移动端内存小+启动慢"做的运行时取舍,不是桌面 JVM 的搬运。
- 分层是为了碎片化治理 :六层架构 + Treble 分区 + GKI 内核 + Mainline 模块化,全是为了在"数千种硬件 + 数年 OTA + 多厂商"约束下保持兼容性。CTS/VTS 是这套契约的强制执行。
- 调试先定位层 :出问题先判"卡在哪层"(logcat/dumpsys/systrace/perfetto/strace),再下钻调用链(app→Framework→native→HAL→kernel)。全栈工程师的核心能力是分层定位,不是背 API。
三、21 篇骨架(每篇:定位 / 核心重点 / 深度标尺)
每篇统一结构:定位 → 学习目标 → 前置知识 → 核心概念(含调用链路图)→ 关键源码路径 → 调试方法(命令示例)→ 踩坑记录 → 实战练习 → 小结速查 → 相关笔记 → 导航 → 日期页脚。技术博客体:结构清晰、调用链图、代码/命令示例,不泛泛而谈。
L1 地基 --- 全景与编译
① Android 架构全景 --- 六层贯通,Linux 到应用 ⭐⭐⭐
- 定位:全专栏地基,立起"Android 六层 + 生态外围"的纵向坐标系,把每层职责与层间契约讲清。
- 核心重点:六层架构(内核/HAL/Native+ART/Framework/应用/生态)各自职责;层间调用契约(Binder/ABI/HIDL-AIDL/JNI);Android 相对主线 Linux 改了什么(Binder/ashmem/wakelock/bionic);AOSP 工程总览(源码树顶层目录含义);Pixel 设备从上电到 Launcher 的全链路一图;与本系列 OS 设计思想系列的对照(Android 是 GPOS 在移动场景的特化)。
- 深度标尺:30 秒说清"Android 六层各做什么、层间靠什么通信、为什么不是普通 Linux"。
② AOSP 源码工程与编译系统 --- repo/manifest/Soong/Blueprint/lunch ⭐⭐⭐
- 定位:BSP 工程第一课,能拉源码、能 lunch、能编出镜像、能刷 Pixel。
- 核心重点 :repo + manifest 多仓管理;AOSP 源码树顶层目录(art/bionic/frameworks/hardware/system/vendor/device/kernel);编译系统演进(make→Soong/Blueprint→Bazel 试点);
lunch/m/m vendorimage命令链;product/device/board 三层配置;out/ 产物(system.img/vendor.img/boot.img/dtbo);Pixel 刷机(fastboot flashall);增量编译与 ccache。 - 深度标尺 :从零
repo init到刷出一个能开机的 Pixel,讲清 SoongAndroid.bp与老Android.mk的关系。
L2 Linux 内核 --- BSP 核心
③ Android 内核 --- ACK/GKI/vendor 模块 ⭐⭐
- 定位:Android 内核相对主线 Linux 的差异与 GKI 合规,BSP 内核适配入口。
- 核心重点 :Android Common Kernel(ACK)与主线 Linux 的关系;GKI(Generic Kernel Image,Android 11+)目标(统一内核镜像 + vendor 模块加载);vendor 模块与
vendor_modules/system_dlkm;内核配置 defconfig 与碎片化治理;Pixel 内核获取与编译(aosp_...-kernel);与 AEGIX RISC-V 内核适配对照。 - 深度标尺:讲清 GKI 为何把内核切成"通用镜像 + vendor 可加载模块",BSP 怎么交付 vendor 模块。
④ Binder 驱动 --- Android 的 IPC 命门(内核侧) ⭐⭐⭐
- 定位 :Android 内核最特有的模块,Binder 的内核侧根基。全栈理解 Binder 的第一半(18 篇是 Framework 侧)。
- 核心重点 :Binder 一次性映射(ioctl + mmap)与零拷贝原理;
binder_node/binder_ref/binder_proc/binder_thread数据结构;BC_* / BR_* 命令协议;ServiceManager 的内核角色;线程池与等待队列;优先级传递(防反转);死亡通知(death recipient);与 Linux pipe/socket/shared memory 的本质差异;调用链:app→libbinder→/dev/binder ioctl→驱动→对端线程。 - 深度标尺 :读
drivers/android/binder.c讲清一次transact的内核路径,讲清 Binder 为何比 socket 快且为何能传对象引用。
⑤ 内存共享三态 --- ashmem/ion/dma-heap ⭐⭐
- 定位:Android 内存共享机制演进,BSP 显示/相机/媒体 buffer 流转的根基。
- 核心重点:ashmem(匿名共享内存,已废弃弃用路径);ion(allocator 替代,Pixel 主力);dma-heap(Android 12+ 新方向,替代 ion);fd 传递与 mmap 共享;gralloc 与 ion/dma-heap 的关系;为何不用 POSIX shm;与 AEGIX Linux dma-buf 对照。
- 深度标尺 :讲清 ashmem→ion→dma-heap 三代演进的动机(碎片化/安全/标准化),Pixel 上
dumpsys SurfaceFlinger看 buffer 流转。
⑥ 电源与内存压力 --- wakelock/lmk/PSI ⭐⭐
- 定位:移动端电源与低内存治理,Android 特有的内核增强。
- 核心重点 :wakelock(防止休眠,Android 特有,后并入主线
wakeup source);lowmemorykiller(lmk,Android 旧 OOM 策略,按 oom_adj 杀进程);PSI(Pressure Stall Information,Android 10+ 用 PSI + LMKD 用户态替代内核 lmk);lmkd 的策略(minfree/oom_adj 阈值);与 Linux 主线 OOM killer 的差异;AEGIX 低内存场景对照。 - 深度标尺 :讲清 lmk→lmkd(用户态)的演进,Pixel 上
cat /proc/pressure/memory看压力。
⑦ 内核调度 --- EAS/cpuset/uid_cputime(BSP 调优视角) ⭐
- 定位:Android 内核调度策略与 BSP 调优,移动端能效优先。
- 核心重点:EAS(Energy Aware Scheduling,大小核调度);schedtune/schedutil 调频;cpuset/cgroup(前台/后台隔离);uid_cputime(按 uid 统计 CPU);SCHED_FIFO/RT 限制(避免应用占死 RT);stune 与 top-app cgroup;与 Linux 主线调度差异;调优 case(卡顿/发热)。
- 深度标尺 :讲清 EAS 为何对大小核关键,Pixel 上
schedstat/dumpsys cpuinfo诊断卡顿。
L3 HAL --- BSP 主战场
⑧ HAL 架构总览 --- HIDL/AIDL/hwservicemanager/Treble 解耦 ⭐⭐⭐
- 定位 :HAL 层总纲,Treble 后 HAL 如何与 Framework 解耦。BSP 主战场入口。
- 核心重点 :HAL 演进(老 HAL libhardware→HIDL→AIDL);Treble 的核心(system/vendor 分区隔离 + 稳定 ABI);HIDL(
.hal+ hidl-gen)与 AIDL(.aidl+ aidl_interface)对照;hwservicemanager/servicemanager/vndservicemanager 三个服务管理的分域;VINTF(Compatibility Matrix/Manifest)契约;passthrough vs binderized HAL;vendor.img 里 HAL 的交付形态;调用链:Framework→IInterface→binder→hwservicemanager→vendor HAL。 - 深度标尺 :写一个 AIDL HAL demo(从
.aidl到 vendor service 注册),讲清 Treble 为何能让 system 独立 OTA。
⑨ Audio HAL --- 从 HAL 到 AudioFlinger ⭐⭐
- 定位:典型流式 HAL,打通音频从 app 到驱动的完整链路。
- 核心重点 :audio HAL 接口(
IDevice/IStreamIn/IStreamOut);AudioFlinger 与 HAL 的衔接;PCM 流路由(primary/a2dp/usb);tinyalsa 内核接口;延迟链路(FastMixer/FastCapture);Pixel 上dumpsys media.audio_flinger;踩坑(采样率/通道/格式协商失败、pop 噪声、underrun)。 - 深度标尺 :从
AudioTrack.write()追到 ALSApcm_write,讲清一次音频帧的跨层路径。
⑩ Camera HAL --- HAL3 pipeline ⭐⭐⭐
- 定位:最复杂的 HAL,Camera HAL3 的 pipeline 模型是 HAL 设计的范本。
- 核心重点 :HAL3 与 HAL1 差异(request/result 异步流模型);pipeline 与 stream config;ICameraProvider/ICameraDevice/ICameraDeviceSession;capture request/result 通道;metadata(CAMERA_CHARACTERISTICS);buffer 流转(gralloc + ion);3A(自动曝光/对焦/白平衡)控制;Pixel 上
dumpsys media.camera;踩坑(帧抖动/metadata 协商/多流并发)。 - 深度标尺 :讲清 HAL3 "request→pipeline→result" 异步模型为何比 HAL1 同步模型强,从
CameraManager.openCamera追到 HAL3 session。
⑪ Graphics HAL --- gralloc/hwcomposer/SurfaceFlinger ⭐⭐⭐
- 定位:图形栈核心,BSP 显示移植的命门。与 05 篇内存共享、15 篇媒体联动。
- 核心重点 :gralloc(buffer 分配,ion/dma-heap 后端);hwcomposer(HWC,硬件合成);SurfaceFlinger(合成调度);BufferQueue(producer/consumer 三角);VSYNC 与 choreographer;fence 同步;
ITwcComposer/IGrallocAIDL HAL;显示模式切换;Pixel 上dumpsys SurfaceFlinger/service call SurfaceFlinger;踩坑(撕裂/丢帧/合成 fallback 到 GPU)。 - 深度标尺 :讲清 BufferQueue + SurfaceFlinger + HWC 三角,从
Surface.lockHardwareCanvas追到 HWC 合成。
⑫ Sensor/BT/GPS/Keymaster HAL 群像 ⭐⭐
- 定位:其余高频 HAL 的统一模板,补全景。
- 核心重点:Sensor HAL(IISensor/AIDL,直接/批处理模式,BMA);Bluetooth HAL(蓝牙控制器 HCI 层);GPS HAL(IGnss,位置流);Keymaster/Gatekeeper(硬件密钥与启动验证,安全 HAL 特殊性);每个 HAL 的接口骨架 + 内核驱动衔接 + 踩坑;群像共性(HIDL/AIDL 注册 + VINTF + vendor service)。
- 深度标尺:讲清安全 HAL(Keymaster)为何与普通 HAL 不同(TEE/StrongBox),Sensor/BT/GPS 的通用移植步骤。
L4 Native + ART
⑬ bionic libc 与 Native 启动链 --- init/ueventd ⭐⭐
- 定位:Native 层地基,bionic 与 glibc 差异 + Android init 启动。
- 核心重点 :bionic libc(为嵌入式重写,比 glibc 小,缺少部分 GNU 扩展);linker(动态链接器,
/system/bin/linker);init 与 ueventd(init.rc/*.rc语法,action/trigger/service);属性系统(property_service,__system_property_get);启动顺序(bootloader→kernel→init→Zygote);与 systemd 对照;踩坑(bionic 缺函数/linker 报错/init.rc 语法)。 - 深度标尺:讲清 bionic 为何不直接用 glibc,init.rc 启动 Zygote 的完整路径。
⑭ ART 运行时 --- DEX/AOT/JIT/GC ⭐⭐⭐
- 定位:Android 应用运行时,理解应用为何"慢启动+稳运行"。
- 核心重点 :DEX 字节码与 OAT/VDEX/ART 文件;AOT(dex2oat,安装时编译);JIT(运行时热点);Profile-guided(PGO,Android 7+ AOT+JIT 混合);解释器/quick asm/quickening;GC(分代 Concurrent Copying GC,Android 10+);堆分区(image space/zygote space/allocation space/large object space);JNI 与 ART 衔接;
oatdump/dexdump/profman;踩坑(启动慢/内存抖动/GC pause)。 - 深度标尺:讲清 AOT/JIT/PGO 三者如何配合,从 APK 安装到 dex2oat 输出 OAT 的链路。
⑮ 媒体框架 --- Stagefright/NuPlayer ⭐⭐
- 定位:Native 媒体栈,打通音视频解码链路(与 09 Audio/11 Graphics 联动)。
- 核心重点 :Stagefright 架构(MediaCodec/OMX/CODEC2);NuPlayer 播放器 pipeline;MediaCodec API(app↔native);硬解(MediaCodec → HAL Codec)与软解路径;buffer 流转( GraphicBuffer + ion );
MediaExtractor/MediaCodec/MediaMuxer;踩坑(硬解协商失败/缓冲抖动/格式兼容)。 - 深度标尺 :从
MediaPlayer.start追到 HAL codec 一帧解码,讲清 Stagefright 与 GStreamer 对照。
L5 Framework
⑯ 启动链 --- init→Zygote→SystemServer→核心服务 ⭐⭐⭐
- 定位:Android Framework 启动全链路,定位开机问题/ANR 的根基。
- 核心重点 :init→Zygote(
app_process -Xzygote,fork 机制);Zygote 预加载(preloadClasses/preloadResources);SystemServer 启动(bootstrap/services/other 三阶段);核心服务(AMS/WMS/PMS/PMS/PowerMS/InputMS)注册顺序;SystemServiceManager;Launcher 启动;开机耗时分析(boottrace/systrace);调用链:kernel→init→Zygote→SystemServer→AMS→Launcher。 - 深度标尺:讲清 Zygote 为何用 fork(共享预加载),SystemServer 崩了为何重启整机。
⑰ 四大组件与 AMS/WMS/PMS 调度 ⭐⭐⭐
- 定位:Framework 核心调度,理解应用行为如何被系统服务调度。
- 核心重点 :四大组件(Activity/Service/BroadcastReceiver/ContentProvider)的生命周期与 AMS 调度;WMS 窗口管理(zorder/input dispatch);PMS 包管理(install/scan/dexopt);进程优先级(oom_adj,前台/可见/服务/缓存);ANR 机制(Input dispatch timeout/Service timeout);调用链:startActivity→AMS→Zygote fork→ActivityThread;
dumpsys activity/dumpsys window。 - 深度标尺 :从
startActivity追到新进程 Activity onCreate,讲清 oom_adj 如何决定进程被 lmkd 杀的顺序。
⑱ Binder Framework 层 --- Java Binder 与 native 衔接 ⭐⭐
- 定位 :Binder 的用户态与 Framework 封装,全栈理解 Binder 的第二半(04 篇内核侧的补充)。
- 核心重点 :libbinder(BpBinder/BBinder);Java 层 Binder/IBinder/AIDL stub;Parcel 序列化;ServiceManager(C++/Java 双层);AIDL 生成代码结构;one-way 与同步调用;Binder 线程池(15 默认);Proxy/Stub 模式;调用链:Java AIDL→libbinder→/dev/binder→对端 Stub;
service list/dumpsys -l。 - 深度标尺:讲清一个 AIDL 调用从 Java Proxy 到对端 Java Stub 的完整链路,与 04 篇内核侧合起来是完整 Binder。
L6 应用层
⑲ APK 结构/签名/安装与应用启动全链路 ⭐⭐
- 定位:应用的交付形态与安装启动,打通最上层(与 14 ART/17 AMS 联动)。
- 核心重点 :APK 结构(Manifest/dex/resources/lib/assets/signature);签名(v1/v2/v3/v4,签名方案演进与安全);安装链路(PackageInstaller→PMS→dex2oat→/data/app);应用启动(Launcher→AMS→Zygote fork→ActivityThread→Application.onCreate);
apkanalyzer/aapt2;踩坑(签名失败/资源冲突/启动白屏)。 - 深度标尺 :从 APK 文件结构到
Application.onCreate全链路,讲清 v2 签名为何比 v1 快且安全。
L7 生态外围
⑳ Treble 分区架构 / OTA / Virtual A/B ⭐⭐⭐
- 定位:现代 Android 出厂架构,BSP 分区与 OTA 的命门。
- 核心重点 :分区演进(boot/system/vendor/cache/userdata → 加入 product/system_ext/odm);Treble 的 system/vendor 隔离契约;A/B 分区(双槽 OTA,无 bricking);Virtual A/B(用动态卷替代物理双槽,Android 11+);OTA 流程(update_engine→payload→slot 切换);bootloader 参与(bootcontrol HAL);恢复出厂/救援;Pixel 分区实操(
fastboot getvar all);踩坑(分区大小/回滚/super 边界)。 - 深度标尺:讲清 Treble 为何能让 system 独立 OTA,Virtual A/B 为何省 flash。
㉑ CTS/VTS/GMS 认证与 Project Mainline/APEX ⭐⭐
- 定位:出厂认证与模块化更新,Android 兼容性治理的最终执行。
- 核心重点 :CTS(Compatibility Test Suite,API 兼容);VTS(Vendor Test Suite,HAL/Treble 兼容);CTS-Verifier(人工测试);GMS(Google Mobile Services,Play/Services/Maps,认证才能预装);GMS 认证流程(MADA/GMS Test);Project Mainline(核心模块模块化更新,如媒体/ART);APEX 包格式(类 APK 的系统模块);Mainline 与 Treble 的关系;Pixel 跑 CTS 实操(
cts-tradefed)。 - 深度标尺:讲清 CTS/VTS/GMS 三道关各自验证什么,Mainline 为何能在不 OTA 整个 system 的情况下更新 ART。
四、优先级速查
| 级别 | 模块 | 触发时机 |
|---|---|---|
| ⭐⭐⭐ 立即 | ① 架构全景 + ② AOSP 编译 + ④ Binder 驱动 + ⑧ HAL 架构 + ⑪ Graphics HAL + ⑯ 启动链 + ⑳ Treble | BSP 求职/移植实战核心 |
| ⭐⭐ 立即 | ③ ACK/GKI + ⑤ 内存共享 + ⑨ Audio + ⑩ Camera + ⑭ ART + ⑰ 四大组件 + ㉑ CTS | 触达具体模块 |
| ⭐ 触达 | ⑥ 电源 + ⑦ 调度 + ⑫ HAL 群像 + ⑬ bionic + ⑮ Stagefright + ⑱ Binder FW + ⑲ APK | 建认知/按需深挖 |
五、学习方法:BSP 视角的"分层定位 + 调用链追踪"法
嵌入式视角:学 Android 不先背 API,先学"出问题先定层,再追调用链"
学每个模块,先问四个问题:① 它在哪一层(内核/HAL/Native/Framework/应用)?② 它与上下层的契约是什么(Binder/ABI/JNI/HIDL-AIDL)?③ 它的调用链怎么走(app→Framework→native→HAL→kernel)?④ 对照 Linux 纯栈它改了什么、为什么?四问答完,API 只是表层。这套方法让你移植 HAL 不从零(08-12 篇模板)、定位 ANR 先看调用链(16/17 篇)、过 CTS 先补哪层(21 篇)。
5.1 分层定位工具速查
| 现象 | 先用 | 看哪层 |
|---|---|---|
| 应用 crash/ANR | logcat / dumpsys activity |
Framework/应用 |
| 服务异常 | dumpsys <service> / service list |
Framework |
| 启动慢 | systrace/perfetto boottrace |
init/Zygote/SystemServer |
| HAL 不工作 | lshal / dumpsys <hal> / dmesg |
HAL/kernel |
| 内核/驱动 | dmesg / /proc / /sys |
kernel |
| 性能/卡顿 | perfetto / dumpsys gfxinfo |
全链路 |
5.2 治"看了就忘"三法
- 调用链法:每个概念画一条 app→kernel 的调用链,机制都在链上。
- 对照法:每个 Android 概念找 Linux 纯栈对应物(bionic↔glibc、Binder↔socket/pipe、ART↔JVM、lmkd↔OOM killer)。
- 实操法:每个模块在 Pixel 上跑一次 dump/命令,见过的命令记得住。
六、分篇规划(逐篇建,本表随写随勾)
21 篇按顺序写,每篇统一结构:定位/学习目标/前置知识/核心概念(调用链路图)/关键源码路径/调试方法/踩坑记录/实战练习/小结速查/相关笔记/导航/日期页脚。每篇贴合 BSP 底层视角 + Pixel + AOSP 实战 + Linux 纯栈对照。
L1 地基 --- 全景与编译
- \[01-Android架构全景-六层贯通-Linux到应用] ------ 六层架构/层间契约(Binder/ABI/HIDL-AIDL/JNI)/Android vs 主线Linux改了什么/AOSP源码树总览/Pixel上电到Launcher全链路一图/与OS设计思想系列对照
- \[02-AOSP源码工程与编译系统-repo-manifest-Soong-lunch] ------ repo+manifest多仓/源码树顶层目录/编译系统make→Soong-Blueprint→Bazel/lunch-m-vendorimage/product-device-board三层配置/out产物/Pixel fastboot刷机/ccache
L2 Linux 内核 --- BSP 核心
- \[03-Android内核-ACK-GKI-vendor模块] ------ ACK与主线Linux/GKI统一内核镜像+vendor模块/vendor_modules-system_dlkm/defconfig碎片化治理/Pixel内核编译/与AEGIX RISC-V内核适配对照
- \[04-Binder驱动-Android的IPC命门-内核侧] ------ ioctl+mmap零拷贝/binder_node-ref-proc-thread/BC_BR命令协议/ServiceManager内核角色/线程池/优先级传递/死亡通知/与pipe-socket-shm差异/app→libbinder→/dev/binder→对端
- \[05-内存共享三态-ashmem-ion-dma-heap] ------ ashmem(弃用)/ion(Pixel主力)/dma-heap(Android12+)/fd传递+mmap共享/gralloc与ion关系/为何不用POSIX shm/与dma-buf对照
- \[06-电源与内存压力-wakelock-lmk-PSI] ------ wakelock→wakeup_source/lmk内核旧OOM按oom_adj/lmkd用户态+PSI(Android10+)/minfree-oom_adj阈值/与主线OOM killer差异
- \[07-内核调度-EAS-cpuset-uid-BSP调优视角] ------ EAS大小核/schedtune-schedutil调频/cpuset-cgroup前后台隔离/uid_cputime/RT限制/stune top-app/卡顿发热case
L3 HAL --- BSP 主战场
- \[08-HAL架构总览-HIDL-AIDL-hwservicemanager-Treble解耦] ------ HAL演进libhardware→HIDL→AIDL/Treble system-vendor隔离+稳定ABI/HIDL与AIDL对照/三个servicemanager分域/VINTF契约/passthrough vs binderized/vendor.img交付/Framework→IInterface→binder→hwservicemanager→vendor HAL
- \[09-Audio-HAL-从HAL到AudioFlinger] ------ IDevice-IStreamIn-IStreamOut/AudioFlinger衔接/PCM路由primary-a2dp-usb/tinyalsa/FastMixer低延迟/dumpsys media.audio_flinger/采样率协商-underrun踩坑/AudioTrack.write→ALSA pcm_write
- \[10-Camera-HAL-HAL3-pipeline] ------ HAL3 vs HAL1异步流/pipeline+stream config/ICameraProvider-Device-Session/capture request-result通道/metadata/3A/gralloc buffer流转/dumpsys media.camera/帧抖动踩坑/CameraManager.openCamera→HAL3 session
- \[11-Graphics-HAL-gralloc-hwcomposer-SurfaceFlinger] ------ gralloc(ion后端)/hwcomposer硬件合成/SurfaceFlinger合成调度/BufferQueue producer-consumer/VSYNC+fence/ITwcComposer-IGralloc AIDL HAL/撕裂丢帧踩坑/Surface.lockHardwareCanvas→HWC合成
- \[12-Sensor-BT-GPS-Keymaster-HAL群像] ------ Sensor(IISensor AIDL 直接/批处理 BMA)/BT(HCI)/GPS(IGnss)/Keymaster-Gatekeeper(TEE StrongBox 安全HAL特殊性)/每HAL接口骨架+内核驱动衔接+VINTF+vendor service共性
L4 Native + ART
- \[13-bionic-libc与Native启动链-init-ueventd] ------ bionic vs glibc(小/缺GNU扩展)/linker动态链接器/init.rc语法action-trigger-service/ueventd/属性系统__system_property_get/启动顺序bootloader→kernel→init→Zygote/与systemd对照
- \[14-ART运行时-DEX-AOT-JIT-GC] ------ DEX-OAT-VDEX-ART文件/AOT dex2oat安装时/JIT热点/PGO Android7+混合/解释器-quick asm/分代CC GC Android10+/堆分区image-zygote-alloc-large/JNI衔接/oatdump-dexdump-profman/启动慢GC pause踩坑
- \[15-媒体框架-Stagefright-NuPlayer] ------ Stagefright MediaCodec-OMX-CODEC2/NuPlayer pipeline/MediaCodec app↔native/硬解→HAL codec vs 软解/GraphicBuffer+ion流转/MediaExtractor-Codec-Muxer/硬解协商踩坑/MediaPlayer.start→HAL codec一帧
L5 Framework
- \[16-启动链-init-Zygote-SystemServer-核心服务] ------ Zygote app_process -Xzygote fork/preloadClasses-preloadResources/SystemServer bootstrap-services-other三阶段/AMS-WMS-PMS-PowerMS-InputMS注册/SystemServiceManager/Launcher启动/boottrace开机耗时/kernel→init→Zygote→SystemServer→AMS→Launcher
- \[17-四大组件与AMS-WMS-PMS调度] ------ Activity-Service-BR-CP生命周期+AMS调度/WMS zorder+input dispatch/PMS install-scan-dexopt/oom_adj前台-可见-服务-缓存/ANR Input-Service timeout/startActivity→AMS→Zygote fork→ActivityThread/dumpsys activity-window
- \[18-Binder-Framework层-Java-Binder与native衔接] ------ libbinder BpBinder-BBinder/Java Binder-IBinder-AIDL stub/Parcel序列化/ServiceManager C+±Java双层/one-way vs 同步/线程池15默认/Proxy-Stub/Java AIDL→libbinder→/dev/binder→对端Stub/service list-dumpsys -l(与04篇合体完整Binder)
L6 应用层
- \[19-APK结构签名安装与应用启动全链路] ------ APK Manifest-dex-resources-lib-assets-signature/签名v1-v2-v3-v4演进+安全/安装PackageInstaller→PMS→dex2oat→/data/app/启动Launcher→AMS→Zygote fork→ActivityThread→Application.onCreate/apkanalyzer-aapt2/签名失败-启动白屏踩坑
L7 生态外围
- \[20-Treble分区架构-OTA-Virtual-AB] ------ 分区演进boot-system-vendor-cache-userdata→product-system_ext-odm/Treble system-vendor隔离契约/A/B双槽OTA无bricking/Virtual A-B动态卷Android11+/update_engine-payload-slot切换/bootcontrol HAL/恢复出厂救援/fastboot getvar all/分区大小-回滚-super边界踩坑
- \[21-CTS-VTS-GMS认证与Project-Mainline-APEX] ------ CTS API兼容/VTS HAL-Treble兼容/CTS-Verifier人工/GMS Play-Services-Maps预装/MADA-GMS Test认证流程/Project Mainline核心模块模块化更新/APEX包格式/Mainline与Treble关系/cts-tradefed实操
🎉 专栏完成(21/21):L1 内核 → L2 HAL → L3 HAL 群像 → L4 Native+ART → L5 Framework → L6 应用层 → L7 生态外围,从 Linux 内核到应用层+生态外围全覆盖。BSP 底层侧重(13 篇 62%)+ 上层打通(7 篇 33%)+ 架构总纲(1 篇 5%)。核心主线贯穿:私有→主线化(Treble)、buffer 流转底座(⑤分配/⑪队列/⑩⑮使用)、启动链(bootloader→kernel→init→Zygote→SystemServer→AMS→app)、Binder IPC 命门(④内核+⑱用户态)、调度三层(CPU/Framework/认证)、嵌入式对照。严谨硬核,每篇含学习目标/前置知识/核心概念/源码路径/调试方法/踩坑记录/实战练习。
八、相关笔记
- 00-操作系统设计思想系列总目录 ------ 姊妹系列,OS 设计思想与选型方法论,本专栏的方法论母体
- 00-Linux内核专题总目录 ------ ③④⑤⑦ 内核层的 Linux 主线深度(对照 Android 内核改了什么)
✨ 感谢你的阅读 ✨
技术之路漫漫,分享是为了更好地交流。
如果本文的内容对你有启发,希望能得到你的支持:
👍 点赞 | ⭐ 收藏 | 👀 关注
如果你在调试过程中遇到了其他问题,
欢迎在 评论区 💬 留言,我们一起探讨。
关注我,一起交流底层开发的那些事儿!🚀