Android 系统架构总览
学习日期: 2026-04-28 参考项目: Amlogic S905X5M (ross) Android 14 TV 前置知识: Linux embedded C/C++ 基础
1. Android 分层架构
Android 系统从上到下分为 5 层,每一层都依赖下一层提供的服务:
┌─────────────────────────────────────────────────┐
│ Applications │ ← 系统应用 + 第三方应用
│ Launcher, Settings, Browser, OTA Client... │
├─────────────────────────────────────────────────┤
│ Application Framework │ ← 应用框架(Java)
│ ActivityManager, WindowManager, PackageManager│
├─────────────────────────────────────────────────┤
│ Android System Services │ ← 系统服务(Native + Java)
│ System Server, SurfaceFlinger, MediaServer... │
├─────────────────────────────────────────────────┤
│ Hardware Abstraction Layer (HAL) │ ← 硬件抽象层(C/C++)
│ Camera HAL, Audio HAL, Graphics HAL... │
├─────────────────────────────────────────────────┤
│ Linux Kernel │ ← Linux 内核 + 驱动
│ Display Driver, WiFi, BT, Audio, DMA-BUF... │
└─────────────────────────────────────────────────┘
与传统 Linux embedded 的对比
| 概念 | 传统 Linux | Android |
|---|---|---|
| 内核 | Linux kernel | 同一内核 + Android 特有驱动 (ashmem/binder/ion) |
| init 系统 | systemd/busybox init | init(专属,解析 .rc 文件) |
| IPC | D-Bus/socket | Binder(Android 核心 IPC 机制) |
| 设备访问 | 直接 open /dev/xxx | 通过 HAL + HIDL 接口 |
| 应用格式 | ELF 可执行文件 | APK(Java + Native libs) |
| 权限控制 | DAC (user/group) | DAC + SELinux(强制) |
| 构建系统 | Makefile/CMake | Soong (Android.bp) + Makefile |
2. 各层详解(结合参考代码库)
2.1 Layer 1: Linux Kernel
位置: kernel 源码 + 设备树 DTS
职责: 硬件驱动、内存管理、进程调度、网络栈
Android 特有的内核特性:
- Binder 驱动: 进程间通信(IPC)的核心
- ashmem: 匿名共享内存
- ION/DMA-BUF: 内存分配器(图形/多媒体用)
- wakelocks: 电源管理休眠锁
参考代码库中的体现:
# BoardConfig.mk 中定义了内核版本和构建方式
# device/amlogic/ross/BoardConfig.mk:
TARGET_BOARD_PLATFORM := s6
# 内核通过 ./mk ross -v common14-5.15 构建(ross 的 uboot target: s7d_bm201)
# 内核 cmdline 中配置 console、SELinux、分区信息:
BOARD_KERNEL_CMDLINE += console=ttyS0,921600
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive # 条件开启
BOARD_BOOTCONFIG += "androidboot.boot_devices=soc/fe08c000.mmc"
2.2 Layer 2: Hardware Abstraction Layer (HAL)
位置: hardware/、vendor/、device/ 下的 HAL 实现
职责: 封装内核驱动接口,向上层提供标准化的硬件访问 API
关键概念 — Treble 架构: Android 8.0 引入 Project Treble,将 HAL 从 Framework 中解耦出来。厂商实现 HAL,Framework 通过 HIDL(HAL Interface Definition Language)调用 HAL 服务。
通信流程:
App/Service
↓ Binder IPC
Framework (Java)
↓ JNI
Native Service (C++)
↓ HIDL/hwBinder
HAL Implementation (C/C++) ← 厂商实现
↓ system calls
Kernel Driver
↓
Hardware
参考代码库中的体现:
# device/giec/device-giec.mk 中的 HIDL 声明:
DEVICE_MANIFEST_FILE += vendor/giec/common/manifest.xml
DEVICE_MATRIX_FILE += vendor/giec/common/compatibility_matrix.xml
# vendor/giec 的自定义 HAL 服务:
PRODUCT_PACKAGES += \
giec.hardware.hwstbcmdservice@1.0 \ # HIDL 接口定义
giec.hardware.hwstbcmdservice@1.0-impl \ # HAL 实现
giec.hardware.hwstbcmdservice@1.0-service # HAL 服务进程
manifest.xml 声明"我这个设备提供了哪些 HAL 服务",compatibility_matrix.xml 声明"我需要 Framework 给我提供什么"。
ross 设备的外设配置:
# device/amlogic/ross/BoardConfig.mk
USE_OPENGL_RENDERER := true
USE_HWC2 := true # 使用 HWC2 (Hardware Composer 2)
BOARD_HAVE_FRONT_CAM := false # 无前置摄像头
BOARD_HAVE_BACK_CAM := false # 无后置摄像头
BOARD_USE_USB_CAMERA := true # 使用 USB 摄像头
BOARD_USES_ALSA_AUDIO := true # ALSA 音频架构
2.3 Layer 3: System Services (Native 层)
位置: frameworks/native/、system/core/
关键进程:
| 进程 | 作用 | 类比 Linux |
|---|---|---|
| init | PID 1,解析 init.rc 启动所有服务 | 类似 systemd |
| surfaceflinger | 图形合成显示 | 类似 Weston/Wayland compositor |
| mediaserver | 多媒体编解码、播放 | 类似 GStreamer 管道 |
| servicemanager | Binder 服务注册与发现 | 类似 D-Bus daemon |
| logd | 系统日志 | 类似 syslogd |
init 启动流程:
Boot ROM → Bootloader → Kernel → init → init.rc → Zygote → System Server
↓
所有 Java 系统服务
参考代码库:
# device/amlogic/ross/device.mk
# init 启动脚本:
PRODUCT_COPY_FILES += \
device/amlogic/ross/init.amlogic.board.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.amlogic.board.rc
2.4 Layer 4: Application Framework (Java 层)
位置: frameworks/base/
核心服务(运行在 System Server 进程中):
| 服务 | 作用 |
|---|---|
| ActivityManagerService (AMS) | 管理应用生命周期、任务栈 |
| WindowManagerService (WMS) | 窗口管理、触摸事件分发 |
| PackageManagerService (PMS) | APK 安装、权限管理 |
| PowerManagerService | 电源管理、休眠策略 |
| NotificationManagerService | 通知管理 |
App 通过 Binder IPC 调用这些服务,不需要知道底层实现。
2.5 Layer 5: Applications
位置: packages/、vendor/giec/apps/
分为两类:
- 系统应用: 预置在 system 分区,有系统权限
- 用户应用: 用户安装,权限受限
参考代码库中的系统应用:
# vendor/giec/device-giec.mk
PRODUCT_PACKAGES += \
LeanKeyboard \ # 定制输入法
OTAClient \ # OTA 升级客户端
BazeportLauncher \ # 定制桌面 Launcher
BazeportSystem # 系统工具应用
系统应用通过平台 key 签名可以获得 system 级别的权限,这是厂商定制的常用手段。
3. 分区架构
这是 embedded Android 特有的概念。固件烧录到设备后,存储被划分为多个分区:
Ross (S905X5M) 的分区布局
从 BoardConfig.mk 中提取的关键分区信息:
| 分区 | 大小 | 文件系统 | 内容 |
|---|---|---|---|
| bootloader | - | raw | U-Boot(AVB2 + VAB 签名) |
| boot | 64MB (67108864) | raw | kernel + ramdisk |
| dtb | 252KB (258048) | raw | 设备树 blob |
| dtbo | 2MB (2097152) | raw | 设备树 overlay |
| vendor_boot | 64MB (67108864) | raw | vendor 内核模块 + DTB |
| super | 3.2GB (3355443200) | 逻辑卷 | 包含以下动态分区 |
| ├ system | - | erofs | Android 系统镜像 |
| ├ vendor | - | erofs | 厂商专有文件 |
| ├ product | - | erofs | 产品特定配置 |
| ├ system_ext | - | erofs | 系统扩展 |
| ├ odm | 16MB (16777216) | ext4 | 设备 OEM 定制 |
| └ vendor_dlkm | - | erofs | 可动态加载的内核模块 |
| userdata | 550MB (576716800) | f2fs | 用户数据(应用、设置) |
| metadata | - | - | 加密 metadata |
注: Android 10+ 使用动态分区(super 分区),system/vendor/product 不再是物理分区,而是 super 分区内的逻辑卷。这可以灵活调整各分区大小。
分区挂载流程
Boot ROM
↓ 读取启动设备
Bootloader (U-Boot)
↓ 验证 vbmeta → 验证 boot.img
↓ 加载 kernel + ramdisk 到内存
Kernel
↓ init 进程启动
↓ 解析 fstab 挂载分区
├── mount /system (erofs, 只读)
├── mount /vendor (erofs, 只读)
├── mount /product (erofs, 只读)
└── mount /data (f2fs, 读写)
参考代码库中的 fstab:
device/amlogic/ross/fstab.ab_oem.amlogic
4. 启动流程完整时序
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ ┌─────────┐
│ Boot ROM │───→│ U-Boot │───→│ Kernel │───→│ init │───→| Zygote │
│ (芯片固件) │ │ (启动加载器) │ │ (Linux) │ │ (PID 1) │ │ (Java VM)│
└──────────┘ └──────────┘ └──────────┘ └─────────┘ └─────────┘
│ │
↓ ↓
init.rc System Server
│ │
↓ ↓
Vendor Init AMS/PMS/WMS...
(init.amlogic. │
board.rc) ↓
Launcher
(桌面启动)
关键说明:
- Boot ROM: 芯片出厂固化的代码,上电后从 eMMC/NAND 加载 bootloader
- U-Boot: 初始化硬件(ddr、时钟)、验证启动镜像签名(AVB2)、加载 kernel
- Kernel: 启动内核、初始化驱动、挂载根文件系统
- init: PID 1,执行 init.rc 脚本启动核心服务
- Zygote: Android Java 虚拟机进程,所有 Java 应用的父进程
- System Server: 启动所有 Java 系统服务
- Launcher: 桌面应用启动,用户看到 UI
5. 代码库目录结构对照
| 目录 | 对应架构层 | 说明 |
|---|---|---|
bootloader/uboot-repo/ |
Bootloader | U-Boot 源码 |
kernel/ |
Kernel | Linux 内核 |
hardware/amlogic/ |
HAL | Amlogic 硬件抽象层(gralloc, hwcomposer, camera 等) |
hardware/interfaces/ |
HAL | HIDL 接口定义 |
device/amlogic/ |
HAL + 设备配置 | 设备树、BoardConfig、init rc |
vendor/giec/ |
各层 | 厂商全栈定制(HAL 服务、SELinux、APK) |
frameworks/base/ |
Framework | Java Framework、系统服务 |
frameworks/native/ |
Framework + Native | Native 服务、SurfaceFlinger |
packages/ |
应用 | 系统应用 |
system/core/ |
核心工具 | init、adbd、logd |
build/make/soong/ |
构建系统 | Android.bp / Makefile 构建规则 |
6. 自问自答(检验理解)
Q: Android 和传统 Linux embedded 的主要区别是什么? A: 主要是框架层。底层还是 Linux 内核,但上层套了 Java Framework、HAL 隔离层、Binder IPC、SELinux、独特的构建系统。对嵌入式开发者来说,从 kernel 一路往上看到 HAL 层是平滑过渡的。
Q: Project Treble 解决了什么问题? A: 以前厂商改 HAL 必须连 Framework 一起更新,导致 Android 版本升级困难。Treble 用 HIDL 把 HAL 标准化、独立化,Framework 和厂商 HAL 可以分别更新。
Q: super 分区和传统分区有什么不同? A: 以前 system、vendor 都是独立的物理分区,大小固定不能改。Android 10+ 用 super 动态分区,把这些分区变成 super 内的逻辑卷,空间利用率更高,OTA 更新也更灵活。
Q: boot.img 里有什么? A: 包含 kernel(Linux 内核)+ ramdisk(init 程序和挂载脚本)。Android 13+ 还引入了 init_boot.img 把 generic ramdisk 独立出来,实现 GKI(通用内核镜像)。
7. 下一步
理解架构后,下一步建议进入 Phase 1.2: 构建系统入门,了解 Android 如何用 Android.bp/Android.mk 组织代码编译。
如果对某层特别感兴趣,也可以深入:
- Launcher/APK 层 → 看
vendor/giec/apps/BazeportLauncher/ - HAL 层 → 看
hardware/amlogic/hwcomposer/或vendor/giec/hardware/interfaces/ - SELinux → 看
vendor/giec/common/sepolicy/ - init 启动 → 看
device/amlogic/ross/init.amlogic.board.rc