Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 1 章:系统架构全景

这一章集中说明后续性能、稳定性和工具篇会涉及的系统层次。遇到慢启动、ANR、安装失败或原生代码崩溃时,工程师要先确定代码运行在哪个进程、跨过哪些进程间通信(IPC)或应用二进制接口(ABI)边界、由谁调度,以及相关状态由用户态进程还是内核维护。

全章核对平台机制,统一使用 Android 17(API 37)的固定源码标签 android-17.0.0_r1。涉及 Binder、调度、cgroup 进程资源分组和 BPF 内核可编程机制的内容,以 android17-6.18-2026-06_r6 为准。Android 17 设备仍可能使用通用内核镜像(Generic Kernel Image,GKI)的较早受支持分支:书中的 6.18 结论用于核对公共内核源码,不代表每台升级设备都运行 6.18。

用五层视角定位问题

层次常见载体主要职责排查时要问
App 与 ART(Android 运行时)UI 线程、业务线程、Binder 调用线程、垃圾回收(GC)/编译线程组件生命周期、业务执行、字节码执行与编译主线程在运行、等锁、等 IPC,还是未获调度
应用框架(Framework)system_server(承载多数 Java 系统服务的进程)内的 ActivityManagerService(AMS)、WindowManagerService(WMS)、PackageManagerService(PMS)等系统策略、组件调度、权限与全局状态请求在哪个服务排队,服务端持有什么锁
原生服务SurfaceFlinger、AudioFlinger、installd、apexd 等图形、音频、安装和底层系统能力数据如何跨 Java 原生接口(JNI)、Binder 或共享内存,服务线程在做什么
硬件抽象层(HAL)与厂商实现AIDL/HIDL HAL、厂商守护进程、驱动的用户态接口稳定硬件接口与厂商实现ABI 是否兼容,VINTF 清单是否匹配,动态链接器命名空间和 SELinux 策略是否允许这条路径
Linux 内核Binder、调度器、内存、文件系统、驱动线程调度、内存、IPC 传输、设备访问线程为何睡眠或处于可运行状态(runnable,即已经就绪但还未获得 CPU),缓冲区、队列或设备是否成为限制

表中的 AIDL 和 HIDL 都用于定义 Android 组件之间的接口,其中 HIDL 主要出现在存量 HAL 中。VINTF 清单记录系统与厂商组件之间的兼容要求。SELinux 策略决定进程能访问哪些服务和设备节点。

性能现象通常跨越两层以上。比如主线程卡在 BinderProxy.transactNative(),这只是调用方的等待点;还要沿这次 Binder 事务(transaction)找到服务端线程,检查它是在执行业务、等锁、等输入输出(I/O),还是尚未从目标进程队列取出。

五层视角:先定位执行载体,再追等待链

图:层次用于定位职责,不能当作每次请求都必须经过的固定五步。看到调用方等待时,要沿 Binder、JNI、共享队列或设备依赖追到实际工作与等待点,并记录进程、线程和版本条件。

内容索引

按问题选择阅读路径

  • 启动慢:1.3 → 1.5 → 1.4 → 1.7。
  • 主线程卡顿或 ANR:1.9 → 1.8 → 1.10 → 1.11,并到服务端章节核对调用链。
  • 安装、系统升级(OTA)或分阶段安装会话(staged session):1.16 → 1.17。
  • 配置变化导致重建:1.18 → 1.19。
  • 原生库加载失败或启动开销:1.6 → 1.7。
  • system_server 调度与进程优先级:1.12 → 1.10 → 1.14 → 1.13。

读源码时保留三条边界

同一个 Android 版本,运行行为也不保证一致。应用面向的 SDK 版本(target SDK)、兼容性开关(compat change)、aconfig 功能开关、可独立更新的 Mainline 模块版本、厂商分支与设备内核都可能改变结果。正文中出现“Android 17 默认启用”时,应继续检查启用条件。

源码常量不等于性能承诺。Binder 缓冲区、线程数、超时或队列阈值只能解释实现范围,收益与风险仍要在目标设备、相同测试负载和相同构建上测量。

历史版本有助于解释设计变化,但 Android 17 结论必须回到 android-17.0.0_r1 与相应的固定内核版本。预览文档、旧源码标签和设备厂商(OEM)的私有实现都不能替代当前源码。

固定源码版本