Android 设备包括几个分区,它们在启动过程中提供不同的功能。
标准隔断
boot
分区。此分区包含内核映像,并使用mkbootimg
创建。您可以使用虚拟分区直接刷新任一映像,而无需刷新新的引导分区。此分区还包含在 Android 13 之前启动的设备中的通用 ramdisk。核心。虚拟
kernel
分区通过在旧内核映像上写入新内核映像来覆盖内核(zImage
、zImage-dtb
、Image.gz-dtb
)。如果提供的开发内核不兼容,您可能需要使用关联的内核模块更新vendor
、system
或dtb
分区(如果存在)。内存盘。虚拟
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 分区。
动态分区
运行 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构建系统使用映像变体来拆分构建依赖项。本机模块( /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 库对产品模块不可用。