概览

Android 设备包括几个分区,它们在启动过程中提供不同的功能。

标准隔断

  • boot分区。该分区包含一个内核映像和一个使用mkbootimg组合的 ramdisk 映像。您可以使用虚拟分区直接刷新任一映像,而无需刷新新的引导分区。

    • 核心。虚拟kernel分区通过在旧内核映像上写入新内核映像来覆盖内核( zImagezImage-dtbImage.gz-dtb )。如果提供的开发内核不兼容,您可能需要使用关联的内核模块更新vendorsystemdtb分区(如果存在)。

    • 内存盘。虚拟ramdisk分区通过在旧 ramdisk 映像上写入新 ramdisk 映像来覆盖 ramdisk。

    覆盖操作确定 eMMC 中现有镜像的起始位置,并将新镜像复制到该位置。新映像(内核或 ramdisk)可能比现有映像大;为了腾出空间,引导加载程序可以移动图像之后的数据或放弃错误操作。

  • system分区。此分区包含 Android 框架。

  • odm分区。此分区包含原始设计制造商 (ODM) 对片上系统 (SoC) 供应商板支持包 (BSP) 的定制。此类定制使 ODM 能够替换或定制 SoC 组件,并为特定于板的组件、守护程序和硬件抽象层 (HAL) 上的 ODM 特定功能实现内核模块。这个分区是可选的;通常,它用于包含自定义,以便设备可以将单个供应商映像用于多个硬件 SKU。有关详细信息,请参阅ODM 分区

  • odm_dlkm分区。此分区专用于存储 ODM 内核模块。将 ODM 内核模块存储在odm_dlkm分区(与odm分区相反)可以在不更新odm分区的情况下更新 ODM 内核模块。

  • recovery分区。此分区存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为引导映像中包含的 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 图像变体。

Android 分区布局

图 1. Android 11 中的分区布局

  • 单一系统映像 (SSI)。包含systemsystem_ext图像的新概念图像。当这些分区对于一组目标设备是通用的时,这些设备可以共享 SSI 并跳过构建systemsystem_ext映像。

  • system_ext分区。可以使用system资源并且可以包含以下系统模块的新分区:

    • system分区中扩展 AOSP 系统模块。我们建议将此类模块上传到 AOSP,以便稍后将它们安装到system分区。

    • 捆绑 OEM 或 SoC 特定模块。我们建议取消捆绑此类模块,以便将它们安装到productvendor分区。

  • system分区。用于 OEM 产品的通用系统映像。我们建议将专有模块移出system分区,方法是将它们上游到 AOSP 或将它们移到system_ext分区。

  • product分区。此分区现在可以使用允许的接口来安装未与任何其他分区捆绑的产品特定模块。

VNDK 更改

供应商本机开发工具包 (VNDK)是一组安装在system分区中的库,专为供应商实现其 HAL 而设计。

  • 在 Android 10 及更低版本中, vendor分区可以链接到system分区中的 VNDK 库,但不能链接到system分区中的其他库。 product分区中的本机模块可以链接到system分区中的任何库。

  • 在 Android 11 及更高版本中, productvendor分区可以链接到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来创建产品变体(除了核心变体和供应商变体)。