第1章:Android 系统源码整体布局

本章从架构总览视角,系统梳理 AOSP(Android Open Source Project)顶层目录的结构与职责,定位 Framework 源码位置,并给出核心模块清单。这是理解 Android 模块化机制的前提——只有在脑图中标定每一块的边界与连接方式,后续的剥离、复用、测试才能落地。

1.1 AOSP 顶层目录与模块边界

AOSP 根目录下数十个一级目录,各自代表一个大模块组。模块边界划分遵循“平台层-硬件层-工具链”三族原则,每一族内再按“功能域”细分。下表列出最关键的 12 个顶层目录及其职责边界:

目录名所属族模块边界与核心职责
frameworks平台层应用框架与系统服务(Android Framework 主仓库)
system平台层核心系统守护进程、init、adb、logd 等基础基础设施
hardware硬件层HAL(硬件抽象层)接口定义与参考实现
kernel硬件层Linux 内核(AOSP 内为预构建内核头文件与配置)
external平台层第三方开源库(如 libpng、boringssl、sqlite)
art平台层Android Runtime(ART 编译器与运行时)
bionic平台层标准 C 库实现(BSD 派生,替代 glibc)
build工具链构建系统(Soong / Blueprint 规则与 make 支持)
prebuilts工具链预编译工具链(JDK、clang、gradle 等)
device硬件层OEM 设备配置、BoardConfig、内核与 vendor 脚本
packages平台层系统预装应用(Settings、Launcher、Phone)
vendor硬件层厂商私有扩展(驱动、HAL 实现、专有库)
边界设计原则:平台层目录 frameworks 与 system 严格分离——frameworks 只包含 Java / C++ 服务框架,system 包含原生守护进程与核心命令行工具。这种拆分使得 Framework 可在不依赖 init/ logd 的情况下做单元测试(通过 Mock 系统调用)。

1.2 Framework 源码位置与核心模块清单

Framework 源码集中在 frameworks/ 目录下,其中四个子目录构成主体:

  • frameworks/base — 所有核心 Java 框架、系统服务、资源管理、API 定义。
  • frameworks/native — 原生 C++ 层服务(SurfaceFlinger、AudioFlinger、SensorService)。
  • frameworks/av — 多媒体组件(MediaPlayer、MediaCodec、Camera 服务)。
  • frameworks/support — 现为 Jetpack 仓库,提供向后兼容的 API 库。

核心模块清单(仅列出架构级关键模块):

模块名称位置职责
ActivityManagerServiceframeworks/base/services/core/java/…生命周期管理、进程调度、任务栈
WindowManagerServiceframeworks/base/services/core/java/…窗口布局、输入分发、动画合成
PackageManagerServiceframeworks/base/services/core/java/…APK 安装、权限校验、组件查询
SurfaceFlingerframeworks/native/services/surfaceflinger图形合成(GPU 图层混合)
AudioFlingerframeworks/av/services/audioflinger音频混音与 HAL 代理
MediaServerframeworks/av/media/mediaserver多媒体服务主进程(MediaPlayerService 等)
控制流与信任链路简述:应用通过 Binder IPC 调用系统服务端(如 AMS),服务端再通过 JNI 调用 Native 层(如 SurfaceFlinger),最终通过 HAL 与内核驱动交互。信任链路以进程隔离为基础,每个服务运行在独立进程中(system_server、media_server 等),权限由 manifest 中的 android:permission 与 ServiceManager 的访问控制共同保障。

1.3 分层结构:从内核到应用的四层模型

Android 系统在逻辑上分为四层,每一层封装底层复杂性,向上提供稳定接口。下图为分层架构及各层核心组件:

Android 系统分层架构与核心模块 Android 系统分层架构(框架层边界) 应用层 (Applications) 系统应用 (Settings / Launcher / Phone) · 第三方APK 应用框架层 (Java API Framework) ActivityManagerService · WindowManagerService · PackageManagerService ContentProvider · View System · Resource Manager ServiceManager (Binder 注册中心) 原生运行时与系统服务层 (Native Services + ART) SurfaceFlinger · AudioFlinger · MediaServer · SensorService ART (JIT/AOT) · Bionic libc · 核心守护进程 (init / logd) libbinder · libui · libgui 硬件抽象层 (HAL) Camera HAL · Audio HAL · Graphics HAL (Gralloc) · Sensors HAL Linux 内核 + 驱动 Binder 驱动 HAL Stub / HIDL / AIDL 设备节点 / Sysfs
模块化陷阱:分层模型令人误以为层间耦合松散,但实际上 ActivityManagerService 直接通过 JNI 调用 SurfaceFlinger 的 native 接口,形成严重的跨层依赖。后续章节将详细剖析如何通过接口剥离、服务化切分来解除这种硬绑定。

1.4 选型权衡与风险点

决策点选项 A选项 BAOSP 选择与权衡
系统服务实现语言全部 C++全部 Java混合:性能敏感型(图形/音频)用 C++;业务逻辑复杂(AMS/WMS)用 Java。代价是 JNI 桥接开销与调试复杂。
IPC 机制Socket / PipeBinderBinder 兼具高性能与安全校验,但需要维护 .aidl 接口与 Stub/Proxy 模式,增加了模块拆分的代码量。
模块复用粒度静态库 / 动态库单独进程服务AOSP 倾向于将大模块(如媒体服务)独立进程以隔离崩溃影响,但带来了跨进程通信延迟与序列化开销。
Hardware 抽象方式内核模块直编HAL + HIDLHAL 支持厂商 stub 替换,但每次版本升级需重新编译全部 stub,旧版 HAL 与新版本 Framework 不兼容(Treble 后通过 HIDL 解决)。

风险点摘要:

  • 源码树耦合:frameworks/base 与 external/ 大量条件编译(#ifdef),改动一处可能引爆全局。
  • 构建依赖爆炸:单个模块更改(如 libbinder)触发数千个目标重编译。
  • 厂商碎片化:vendor/ 直接引用 hardware/ 中的私有符号,导致 OTA 升级时二进制不兼容。

1.5 落地步骤(面向架构师)

  1. 环境准备:拉取 AOSP 源码(建议 master 或 android-13+),确保 lunch 目标为 aosp_arm64-eng。
  2. 目录扫描:逐层进入 frameworks/base、frameworks/native、frameworks/av,记录各子目录模块名与其 Android.bp 入口。
  3. 边界绘制:使用工具(如 find . -name "Android.bp" | xargs grep "cc_library\|java_library")导出模块依赖,画出本机模块依赖图(用于后续模块化改造基准)。
  4. 关键模块标注:在依赖图中标注 AMS、WMS、SurfaceFlinger 等核心节点的进程归属与对外接口类型(Binder AIDL / 直接函数调用)。
  5. 信任链路审计:检查 system/core/rootdir/init.rc 以确认各服务启动顺序与 SELinux 策略文件中的 domain 声明。

1.6 验收标准

检查项验收通过条件
顶层目录识别能独立说出 frameworks/sys tem/hardware/kernel/external/art 等目录的核心职责
Framework 源码位置能准确指示 frameworks/base 中 core/java、services/core、graphics 等关键 package 路径
核心模块清单能列出至少6个系统服务名称及其所属进程(system_server / media_server / surfaceflinger)
分层结构图能手绘或利用工具绘制出四层架构及每层的代表组件,并标注层间通信机制
风险点描述能说出至少 2 个与源码组织相关的架构风险(如跨层 JNI 耦合、构建依赖爆炸)
第一章小结:本章建立了 Android 系统源码的“地图”——从顶层目录的模块边界到 Framework 内部的核心模块清单,并以分层结构图展示了数据流与控制流的基本路径。后续章节将深入每一层的模块化设计方案,包括 ServiceManager 的接口解耦、Binder 的跨进程能力提纯、以及 HAL 层的 Treble 化改造。