4. Android标准分区布局

Android 的存储体系并不是“一个根目录装所有东西”的简单结构,而是由多个具有明确职责、独立挂载、独立更新策略的分区共同组成。理解这些分区的分工与依赖关系,是分析系统启动、OTA 升级、分区校验、文件安全与故障排查的基础。本章围绕标准分区布局,逐一说明各分区的核心作用,并梳理它们之间的依赖链。

一、核心原理:分区是启动链与更新链的物理边界

Android 分区布局的设计目标可以概括为三点:可启动、可更新、可隔离。可启动意味着 bootloader 能按固定顺序找到引导镜像;可更新意味着 system、vendor、product 等分区可以独立升级而不互相破坏;可隔离意味着厂商定制、运营商定制与 AOSP 通用代码被拆分到不同分区,避免耦合。

从启动视角看,分区之间存在严格的先后依赖:boot 提供内核与 ramdisk,内核挂载 system 作为根文件系统,vendor 提供硬件抽象层实现,product 与 odm 提供上层定制内容,data 保存运行时可变数据,cache 与 metadata 承担升级与加密元数据职责,misc 则保存 bootloader 与 recovery 之间的通信标志。

Android 标准分区布局与依赖关系 Bootloader misc 启动/恢复标志 boot kernel + ramdisk recovery 恢复模式镜像 system AOSP 框架与核心应用 vendor HAL 与厂商驱动 product 产品定制与预装 odm ODM 定制与配置 data 用户数据与应用数据 cache OTA 临时缓存 metadata 加密与元数据 persistent 持久化配置 OTA 升级数据流 misc 写入升级标志 → recovery 读取 cache 中的升级包 → 校验并写入 system / vendor / product / odm → 更新 metadata 与 data 兼容性 升级完成后清除 misc 标志,重启进入新系统 启动/硬件相关 系统框架 定制/恢复 数据/引导

二、各分区作用详解

boot 分区包含 Linux 内核与 ramdisk(或 init_boot 分离后的 ramdisk)。它是启动链中第一个被加载的可执行镜像,负责初始化硬件、挂载根文件系统并启动 init 进程。boot 损坏通常表现为无法开机或卡在 bootloader。

system 分区是 AOSP 的核心载体,包含 framework、系统服务、核心应用与系统库。在 Android 10 之后,system 与 system_ext 可能合并或拆分,但职责不变:提供与硬件无关的通用系统能力。

vendor 分区承载厂商硬件抽象层(HAL)、驱动与专有库。它使 system 可以保持通用,而硬件相关实现由厂商独立维护。vendor 与 system 之间存在接口版本约束,即 VINTF 兼容性矩阵。

product 分区用于存放产品级定制内容,如运营商预装应用、区域配置与产品专属资源。它位于 system 与 vendor 之上,属于“产品差异化”层。

odm 分区用于 ODM 厂商的定制内容,通常包含设备树覆盖、odm 专属配置与额外 HAL。它与 vendor 类似,但更偏向整机厂商的二次定制。

data 分区是用户数据分区,保存应用数据、用户配置、数据库与内部存储。它是唯一在恢复出厂设置时被清空的分区,也是加密与权限控制的核心对象。

cache 分区在传统 A/B 升级之前用于存放 OTA 下载包与临时文件。在 A/B 与虚拟 A/B 方案中,cache 的作用被弱化,但部分设备仍保留用于恢复模式临时存储。

metadata 分区用于保存加密元数据、密钥派生信息与部分系统状态。它通常以加密方式存储,是 data 分区可解密挂载的前提之一。

misc 分区是一个极小的分区,用于 bootloader 与 recovery 之间传递命令,例如“进入恢复模式”“执行 OTA 升级”“清除数据”等标志位。

三、依赖关系与升级流程

分区之间的依赖不是简单的并列关系,而是存在明确的层次。启动时,bootloader 读取 misc 判断启动目标,加载 boot;内核启动后挂载 system;system 通过 VINTF 检查 vendor 接口;product 与 odm 在 system 启动后期被挂载并合并到命名空间。data 与 metadata 在解密后挂载,cache 仅在需要时使用。

OTA 升级时,升级包通常包含 boot、system、vendor、product 等镜像。升级流程如下:

  1. 系统下载升级包到 data 或 cache,并校验签名与哈希。
  2. 向 misc 写入“升级中”标志,重启进入 recovery 或 A/B 切换槽位。
  3. recovery 读取升级包,逐分区写入新镜像。
  4. 更新 metadata 中的加密与版本信息,确保 data 兼容。
  5. 清除 misc 标志,重启进入新系统。

关键依赖:system 依赖 vendor 提供 HAL 实现;vendor 依赖 boot 提供内核与驱动;product 与 odm 依赖 system 提供框架接口;data 依赖 metadata 提供解密密钥;recovery 依赖 misc 与 cache 完成升级。

四、案例与排障场景

某设备 OTA 后无法开机,日志显示 VINTF compatibility check failed。排查发现升级包只更新了 system,未同步更新 vendor,导致 system 要求的 HAL 版本高于 vendor 实际提供版本。解决方法是使用完整 OTA 包,或确保 system 与 vendor 来自同一构建版本。

# 查看分区挂载与依赖
adb shell mount | grep -E "system|vendor|product|odm|data|metadata"
adb shell getprop ro.vendor.build.version
adb shell getprop ro.system.build.version
adb shell dumpsys package | grep -i "vendor"

# 检查 VINTF 兼容性
adb shell dumpsys vintf

另一类常见问题是 data 分区加密失败,表现为开机后反复重启。此时应检查 metadata 分区是否损坏,以及密钥派生参数是否与当前系统匹配。若 metadata 丢失,data 将无法解密,通常只能格式化 data。

误区提醒:不要认为“分区越多越安全”。分区拆分是为了更新与隔离,但过度拆分会导致镜像管理复杂、OTA 包增大、兼容性检查困难。标准分区布局是平衡后的结果,不应随意增删。

五、分区职责速查表

分区 核心作用 是否可写 升级方式 依赖对象
boot 内核与 ramdisk 只读 OTA 整包 bootloader
system AOSP 框架与核心应用 只读 OTA / A/B vendor、boot
vendor HAL 与厂商驱动 只读 OTA / A/B boot、system
product 产品定制与预装 只读 OTA / A/B system
odm ODM 定制与配置 只读 OTA / A/B vendor、system
data 用户数据与应用数据 可写 不升级,可清空 metadata
cache OTA 临时缓存 可写 可清空 recovery
metadata 加密与元数据 可写 随系统更新 data
misc 启动/恢复标志 可写 bootloader 写入 recovery

掌握标准分区布局,等于掌握了 Android 系统启动、升级与安全隔离的骨架。后续分析分区校验、AVB、动态分区与文件级加密时,都可以回到这张分区依赖图上进行定位。