自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 AOSP 的变更。
DTB 映像
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
Android 实现可以包含设备树 blob (DTB) 映像,供引导加载程序使用。DTB 映像的位置(以及用于指定 DTB 映像参数的选项)因 Android 版本而异。
在 Android 11 中,使用通用内核映像 (GKI) 的设备必须支持供应商启动分区,该映像包含从启动分区重新定位的所有供应商特定信息。由于 DTB 映像包含供应商特定数据,因此它现在已成为供应商启动分区的一部分。如需指定 DTB 映像参数,请参阅供应商启动头文件。
在 Android 10 中,设备可以在启动分区中添加 DTB 映像。如需指定 DTB 映像参数,请参阅在启动映像中添加 DTB 映像。
在 Android 9 及更低版本中,DTB 映像可以位于自己的分区中,也可以附加到内核 image.gz
以创建内核 + DTB 映像(随后传递给 mkbootimg
以创建 boot.img
)。
在 Android 10 及更高版本中,DTB 映像必须使用以下格式之一:
在启动映像中添加 DTB 映像
搭载 Android 10 的设备可以在启动映像中添加 DTB 映像。这样一来,Android 便无需支持将 DTB 映像附加到内核中的 image.gz
的脚本,并允许使用供应商测试套件 (VTS) 测试来验证(和标准化)DTB 的放置。
此外,对于非 A/B 设备,将 DTB 作为恢复映像的一部分(而不是将其放置在一个单独的分区中)更为安全,可防止出现由 OTA 中断引起的问题。在 OTA 期间,如果在 DTB 分区更新后(但在完成全部更新之前)出现问题,设备会尝试启动到恢复模式,以完成 OTA。不过,由于 DTB 分区已更新,恢复映像(尚未更新)可能会出现不匹配的情况。将 DTB 映像作为启动映像格式的一部分可使恢复映像“自给自足”(即不依赖于另一个分区),从而防止出现此类问题。
启动映像结构
搭载 Android 10 的设备可以添加使用以下启动映像结构的 DTB 映像。
启动映像部分 |
页数 |
启动头文件(1 页) |
1 |
内核(l 页) |
l = (kernel_size + page_size - 1) / page_size |
Ramdisk(m 页) |
m = (ramdisk_size + page_size - 1) / page_size |
第二阶段引导加载程序(n 页) |
n = (second_size + page_size -
1) / page_size |
恢复 DTBO(o 页) |
o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB(p 页) |
p = (dtb_size + page_size -
1) / page_size |
DTB 映像路径
对于搭载 Android 10 的设备,您可以使用 mkbootimg.py
工具和以下参数来指定 DTB 映像的路径。
参数 |
说明 |
dtb |
要添加到启动/恢复映像的 DTB 映像的路径。 |
dtb_offset |
在添加到 base 参数时,系统会提供最终设备树的物理加载地址。例如,如果 base 参数为 0x10000000 且 dtb_offset 参数为 0x01000000 ,那么,启动映像头文件中的 dtb_addr_field 填充为 0x11000000 。 |
必须使用板级配置变量 BOARD_PREBUILT_DTBIMAGE_DIR
来指定 DTB 映像的路径。如果目录 BOARD_PREBUILT_DTBIMAGE_DIR
中存在多个扩展名为 *.dtb
的文件,Android 构建系统会串联这些文件,以创建用于创建启动映像的最终 DTB 映像。
如需将参数 dtb
连同 BOARD_PREBUILT_DTBIMAGE_DIR
指定的目录中的 DTB 映像一起传递给 mkbootimg.py
,就必须将板级配置变量 BOARD_INCLUDE_DTB_IN_BOOTIMG
设置为 true
。例如:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
您可以将 dtb_offset
参数连同其他偏移量和头文件版本一起附加到板级配置变量 BOARD_MKBOOTIMG_ARGS
。例如:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
引导加载程序支持
为了让 VTS 能够在搭载 Android 10 的设备上成功运行,引导加载程序必须支持更新后的启动映像,并且必须添加 androidboot.dtb_idx
内核命令行参数以指示所选设备树 (DT) 的索引。您只能指定一 (1) 个索引。例如,参数 androidboot.dtb_idx=N
将 N
报告为引导加载程序从启动映像中的一组 DTB 中选择的设备树的索引(从零开始)。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-03-26。
[null,null,["最后更新时间 (UTC):2025-03-26。"],[],[],null,["# DTB images\n\nAndroid implementations can include a device tree blob (DTB) image for use by\nthe bootloader. The location of the DTB image (and the options for specifying\nDTB image parameters) differs between Android releases.\n\n- In Android 11, devices using the [Generic Kernel\n Image (GKI)](/docs/core/architecture/kernel/generic-kernel-image) must\n support the [vendor boot\n partition](/docs/core/architecture/bootloader/partitions/vendor-boot-partitions),\n which includes all vendor-specific information that was relocated from the\n boot partition. Because the DTB image contains vendor-specific data, it's now\n part of the vendor boot partition. To specify DTB image parameters, see\n [Vendor boot\n header](/docs/core/architecture/bootloader/partitions/vendor-boot-partitions#vendor-boot-header).\n\n- In Android 10, devices can include the DTB image in\n the boot partition. To specify DTB image parameters, see [Including the DTB\n image in the boot image](#dtb-image-include).\n\n- In Android 9 and lower, the DTB image can exist in\n its own partition or be appended to the kernel `image.gz` to create the kernel\n + DTB image (which is then passed to `mkbootimg` to create `boot.img`).\n\nDTB image format\n----------------\n\nIn Android 10 and higher, the DTB image must use one\nof the following formats:\n\n- **DT blobs concatenated one after the other.** The bootloader uses the\n `totalsize` field in each FDT header to read and parse the corresponding blob.\n\n- **DTB/DTBO partitions.** The bootloader has an efficient way to select the\n correct DT blob by examining the `dt_table_entry` struct (contains `id`,\n `rev`, and `custom` fields) that can hold hardware identifying information for\n the entry. For details, see [DTB/DTBO\n Partitions](/docs/core/architecture/dto/partitions#structures).\n\nInclude the DTB image in the boot image\n---------------------------------------\n\nDevices running Android 10 can include the DTB image in\nthe boot image. This removes the need for Android to support scripts that append\nthe DTB image to `image.gz` in the kernel, and enables the use of [Vendor Test\nSuite (VTS)](/docs/compatibility/vts) test to verify (and standardize) DTB\nplacement.\n\nIn addition, for non-A/B devices, it's safer to have the DTB as part of the\nrecovery image rather than in a separate partition to prevent issues caused by\ninterrupted OTAs. During an OTA, if a problem occurs after the DTB partition is\nupdated (but prior to completing the full update), the device tries to boot into\nrecovery mode to complete the OTA; however, because the DTB partition has\nalready been updated, a mismatch could occur with the recovery image (which has\nnot yet been updated). Having the DTB image as part of the boot image format\nprevents such issues by making the recovery image self sufficient (that is, it\ndoesn't depend on another partition).\n\n### Boot image structure\n\nDevices running Android 10 can include a DTB image\nusing the following boot image structure.\n\n| Boot image section | Number of pages |\n|-----------------------------------|------------------------------------------------------------|\n| Boot header (1 page) | 1 |\n| Kernel (l pages) | l = (`kernel_size` + `page_size` - 1) / `page_size` |\n| Ramdisk (m pages) | m = (`ramdisk_size` + `page_size` - 1) / `page_size` |\n| Second stage bootloader (n pages) | n = (`second_size` + `page_size` - 1) / `page_size` |\n| Recovery DTBO (o pages) | o = (`recovery_dtbo_size` + `page_size` - 1) / `page_size` |\n| DTB (p pages) | p = (`dtb_size` + `page_size` - 1) / `page_size` |\n\n### DTB image path\n\nFor devices running Android 10, you can use the\n`mkbootimg.py` tool and the following arguments to specify the path to the DTB\nimage.\n\n| Argument | Description |\n|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `dtb` | Path to the DTB image to be included in the boot/recovery images. |\n| `dtb_offset` | When added to the `base` argument, provides the physical load address for the final device tree. For example, if the `base` argument is `0x10000000` and the `dtb_offset` argument is `0x01000000`, the `dtb_addr_field` in the boot image header is populated as `0x11000000`. |\n\nThe board config variable `BOARD_PREBUILT_DTBIMAGE_DIR` must be used to specify\nthe path to the DTB image. If more than one file with extension `*.dtb` is\npresent in the directory `BOARD_PREBUILT_DTBIMAGE_DIR`, the Android build system\nconcatenates the files to create the final DTB image used in the boot image\ncreation.\n\nTo pass the argument `dtb` to `mkbootimg.py` with the DTB image from the\ndirectory specified by `BOARD_PREBUILT_DTBIMAGE_DIR`, the board config variable\n`BOARD_INCLUDE_DTB_IN_BOOTIMG` must be set to `true`. For example: \n\n BOARD_INCLUDE_DTB_IN_BOOTIMG := true\n\nYou can append the `dtb_offset` argument to the `BOARD_MKBOOTIMG_ARGS` board\nconfig variable with the other offsets and header version. For example: \n\n BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)\n\n### Bootloader support\n\nFor VTS to run successfully on devices running Android\n10, the bootloader must support the updated boot image\nand must add the `androidboot.dtb_idx` kernel command line parameter to indicate\nthe index of the selected device tree (DT). **You can specify only one (1)\nindex.** For example, the parameter `androidboot.dtb_idx=N` reports `N` as the\nzero-based index of the device tree selected by the bootloader from the set of\nDTBs present in the boot image."]]