Android 设备包含多个分区,这些分区在启动过程中具有不同的功能。
标准分区
boot
分区。 此分区包含内核映像,并且是使用mkbootimg
创建的。您可以使用虚拟分区直接刷写任一映像,而无需刷写新的启动分区。在 Android 13 之前发布的设备中,此分区还包含通用 ramdisk。内核。 虚拟
kernel
分区通过在新内核映像上写入覆盖旧内核映像来覆盖内核(zImage
、zImage-dtb
、Image.gz-dtb
)。如果提供的开发内核不兼容,您可能需要使用相关的内核模块更新vendor
、system
或dtb
分区(如果存在)。ramdisk。 虚拟
ramdisk
分区通过在新 ramdisk 映像上写入覆盖旧 ramdisk 映像来覆盖 ramdisk。
覆盖操作确定 eMMC 中现有映像的起始位置,并将新映像复制到该位置。新映像(内核或 ramdisk)可能比现有映像大;为了腾出空间,引导加载程序可以移动映像后面的数据,或者放弃操作并显示错误。
init_boot
分区。 此分区包含为搭载 Android 13 及更高版本发布的设备提供的通用 ramdisk。system
分区。 此分区包含 Android 框架。odm
分区。 此分区包含原始设计制造商 (ODM) 对芯片上系统 (SoC) 供应商板级支持包 (BSP) 的自定义项。此类自定义项使 ODM 能够替换或自定义 SoC 组件,以及为板级特定组件、守护进程和硬件抽象层 (HAL) 上的 ODM 特定功能实现内核模块。此分区是可选的;通常,它用于包含自定义项,以便设备可以将单个供应商映像用于多个硬件 SKU。如需了解详情,请参阅ODM 分区。odm_dlkm
分区。 此分区专用于存储 ODM 内核模块。将 ODM 内核模块存储在odm_dlkm
分区中(而不是odm
分区中)可以实现在不更新odm
分区的情况下更新 ODM 内核模块。recovery
分区。 此分区存储恢复映像,该映像在 OTA 过程中启动。支持无缝更新的设备可以将恢复映像存储为包含在boot
或init_boot
映像中的 ramdisk(而不是单独的映像)。cache
分区。 此分区存储临时数据,如果设备使用无缝更新,则此分区是可选的。缓存分区不需要可从引导加载程序写入,但需要可擦除。分区大小取决于设备类型和userdata
上的可用空间;通常,50 MB–100 MB 就足够了。misc
分区。 此分区由恢复分区使用,大小为 4 KB 或更大。userdata
分区。 此分区包含用户安装的应用和数据,包括自定义数据。metadata
分区。 当设备使用元数据加密时,此分区用于存储元数据加密密钥。大小为 16 MB 或更大。它未加密,并且其数据未进行快照。当设备恢复出厂设置时,它将被擦除。此分区的使用受到严格限制。vendor
分区。 此分区包含任何不可分发给 AOSP 的二进制文件。如果设备不包含专有信息,则可以省略此分区。vendor_dlkm
分区。 此分区专用于存储供应商内核模块。将供应商内核模块存储在vendor_dlkm
分区中(而不是vendor
分区中)可以实现在不更新vendor
分区的情况下更新内核模块。radio
分区。 此分区包含无线装置映像,并且仅当设备包含在专用分区中具有无线装置特定软件的无线装置时才需要。tos
分区。 此分区存储 Trusty OS 的二进制映像,并且仅当设备包含 Trusty 时才使用。如需了解详情,请参阅TOS 分区。pvmfw
分区。 此分区存储受保护虚拟机固件 (pvmfw),它是受保护虚拟机中运行的第一个代码。有关更多详细信息,请参阅受保护虚拟机固件。
动态分区
运行 Android 11 及更高版本的设备可以支持动态分区,这是一种适用于 Android 的用户空间分区系统,可在无线 (OTA) 更新期间创建、调整大小或销毁分区。如需了解详情,请参阅动态分区。
指定关键分区
如果设备需要特定的分区或数据才能运行,则您必须将这些分区或数据指定为完全受保护,或者指定为可重新刷写,这意味着可以使用 fastboot oem
命令重新构建、提供或提取它们。这包括每个设备的工厂特定设置、序列号、校准数据等数据。
Android 11 中的变更
Android 11 包含对分区的多项变更,包括对链接到库的限制和新的 Soong 映像变体。
图 1. Android 11 中的分区布局
单系统映像 (SSI)。 一种新的概念性映像,其中包含
system
和system_ext
映像。当这些分区对于一组目标设备是通用的时,这些设备可以共享 SSI 并跳过构建system
和system_ext
映像。system_ext
分区。 一个新的分区,可以使用system
资源,并且可以包含以下系统模块:扩展
system
分区中的 AOSP 系统模块。 我们建议将此类模块向上游推送到 AOSP,以便稍后可以将它们安装到system
分区。捆绑 OEM 或 SoC 特定模块。 我们建议解绑此类模块,以便可以将它们安装到
product
或vendor
分区。
system
分区。 用于 OEM 产品的通用系统映像。我们建议将专有模块移出system
分区,方法是将它们向上游推送到 AOSP,或将它们移动到system_ext
分区。product
分区。 此分区现在可以使用允许的接口来安装未与任何其他分区捆绑在一起的产品特定模块。
VNDK 变更
供应商原生开发套件 (VNDK) 是一组安装在 system
分区中的库,专为供应商实现其 HAL 而设计。
在 Android 10 及更低版本中,
vendor
分区可以链接到system
分区中的 VNDK 库,但不能链接到system
分区中的其他库。product
分区中的原生模块可以链接到system
分区中的任何库。在 Android 11 及更高版本中,
product
和vendor
分区可以链接到system
分区中的 VNDK 库,但不能链接到system
分区中的其他库。
Soong 产品变体
Soong 构建系统使用映像变体来拆分构建依赖项。原生模块(/build/soong/cc
)可以将系统进程模块变异为核心变体,将供应商进程模块变异为供应商变体;一个映像变体中的模块无法链接到另一个映像变体中的其他模块。
在 Android 10 或更低版本中,系统模块会自动创建核心变体。它还可以通过在其
Android.bp
文件中定义vendor_available: true
来创建供应商变体;这使供应商模块能够链接到系统模块。VNDK 库是system
库的供应商变体,也可以通过在其Android.bp
文件中定义vendor_available: true
来为供应商模块创建供应商变体(请参阅示例)。在 Android 11 中,系统模块还可以通过定义
vendor_available: true
来创建产品变体(除了核心变体和供应商变体之外)。在 Android 12 或更高版本中,具有
vendor_available: true
的系统模块除了核心变体之外,还会创建一个供应商变体。要创建产品变体,必须定义product_available: true
。一些没有product_available: true
的 VNDK 库不适用于产品模块。