Android 设备包含若干个分区,这些分区在启动过程中发挥不同的作用。
标准分区
boot分区:此分区包含一个内核映像,使用mkbootimg创建。您可以使用虚拟分区直接刷写任意映像,而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。kernel:
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分区:此分区会存储临时数据,如果设备使用无缝更新,则此分区是可选的。cache 分区并非必须可从引导加载程序写入,但必须可清空。此分区大小取决于设备类型和userdata上的可用空间。通常,50-100 MB 就足够了。misc分区:此分区供 recovery 分区使用,大小为 4 KB 或更大。userdata分区:此分区包含用户安装的应用和数据,包括自定义数据。metadata分区:此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。 此分区未经加密,其中的数据不会被拍摄快照,但在设备恢复出厂设置时会被清空。此分区的使用受到严格限制。vendor分区:此分区包含所有无法分发给 AOSP 的二进制文件。如果设备不包含专有信息,则可以忽略此分区。vendor_dlkm分区:此分区专门用于存储供应商内核模块。将供应商内核模块存储在vendor_dlkm分区(而不是vendor分区)中后,无需更新vendor分区即可更新内核模块。radio分区:此分区包含无线装置映像,只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。tos分区:此分区用于存储 Trusty 操作系统的二进制映像文件,仅在设备包含 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 依赖项。原生模块 (/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 库不适用于产品模块。