创建签名 Android 图像后缺少内核 DTB

Missing Kernel DTB after creating signed Android images

我正在将 android 移植到显示设备上,并且即将完成。该设备使用 Freescale/NXP i.MX6 Dual Lite Soc。使用的 Android 版本是 Android 8.0.0,构建基于 NXP/Freescale 中的 Board Support Packages(下面的 link)。 https://www.nxp.com/support/developer-resources/software-development-tools/i.mx-developer-resources/android-os-for-i.mx-applications-processors:IMXANDROID?tab=Design_Tools_Tab

OS 构建良好,"make" 过程产生的映像(u-boot、boot.img、system.img、vendor.img)工作正常在设备上非常好。所以我的最后一步基本上是为图像签名,这是我努力让东西工作的地方。

我正在按照此处找到的指南进行操作: https://source.android.com/devices/tech/ota/sign_builds

完成这些步骤后,我使用 "signed-img.zip" 文件中找到的现已签名的映像来刷新设备(使用 NXP 制造工具,而不是快速启动)。但是,设备现在无法启动内核,给我一个 DTB 丢失的错误。

Hit any key to stop autoboot:  0 
boota mmc0 
kernel   @ 14008000 (8183104)
ramdisk  @ 15000000 (2036048)
## Booting Android Image at 0x12000000 ...
Kernel load addr 0x14008000 size 7992 KiB
Kernel command line: console=ttymxc0,115200 init=/init video=mxcfb0:dev=ldb video=mxcfb1:off video=mxcfb2:off video=mxcfb3:off vmalloc=128M androidboot.console=ttymxc0 consoleblank=0 ldo_active=on androidboot.hardware=sedevices cma=448M android.selinux=permissive android.dm_verify=disable androidboot.selinux=enforce androidboot.dm_verity=disable androidboot.storage_type=emmc loglevel=8 vt.global_cursor_default=0 buildvariant=userdebug androidboot.serialno=0b2861d4df668b47 androidboot.soc_type=imx6dl androidboot.storage_type=emmc
ERROR: Did not find a cmdline Flattened Device Tree
Could not find a valid device tree
resetting ...

我已将问题缩小到指南的第一步,其中 "make dist" 在构建目录中执行。这会在 "out/dist" 文件夹中生成许多 ZIP 文件,这些文件将在本指南的以下步骤中进一步处理。我已经尝试使用此步骤中生成的图像(在生成的 "out/dist/*-img-*.zip" 文件中找到)来刷新设备,这会产生完全相同的问题。

所以我的问题是,"make dist" 到底做了什么导致 DTB 在 "boot.img" 中丢失?我希望它使用 "out/target/product//" 中已经可用的 "boot.img"。但它似乎重新构建了这个图像,在这种情况下不包括 DTB。与从 Source 构建 Android 的许多其他方面一样,"make dist" 的工作原理似乎在文档中的任何地方都没有解释。

我希望任何有从源代码构建 Android 经验的人对此有所了解,因为我似乎被皇家卡住了。

仅供参考;当我刷入正常"make"后产生的"boot.img"时,U-boot后的输出如下:

Hit any key to stop autoboot:  0 
boota mmc0 
Error: blob decap job completed with errors 0x2000081A
In boota get fastboot lock status error. Set lock status
kernel   @ 14008000 (8183104)
ramdisk  @ 15000000 (2036754)
fdt      @ 14f00000 (40998)
## Booting Android Image at 0x12000000 ...
Kernel load addr 0x14008000 size 7992 KiB
Kernel command line: console=ttymxc0,115200 init=/init video=mxcfb0:dev=ldb video=mxcfb1:off video=mxcfb2:off video=mxcfb3:off vmalloc=128M androidboot.console=ttymxc0 consoleblank=0 ldo_active=on androidboot.hardware=sedevices cma=448M android.selinux=permissive android.dm_verify=disable androidboot.selinux=enforce androidboot.dm_verity=disable androidboot.storage_type=emmc loglevel=8 vt.global_cursor_default=0 buildvariant=userdebug androidboot.serialno=0b2861d4df668b47 androidboot.soc_type=imx6dl androidboot.storage_type=emmc
## Flattened Device Tree blob at 14f00000
   Booting using the fdt blob at 0x14f00000
   Loading Kernel Image ... OK
   Using Device Tree in place at 14f00000, end 14f0d025
switch to ldo_bypass mode!

Starting kernel ...

似乎 NXP/Freescale 已经修改了他们的 AOSP 板级支持包中的构建脚本,并在该过程中破坏了 DTB 包含。当标准 "make" 过程的输出在他们的开发板上工作时,他们似乎很高兴,并且从不费心检查是否可以用它创建工作签名的发布图像。

在 dist 包中包含 DTB 的机制已经到位(在 BOARD_KERNEL_DTS 中指定 DTB 的位置),并且也用于他们的 "make otapackage" 目标。但是,该目标仅生成一个未签名(或使用开发密钥签名)的 OTA 包,不能与签名脚本一起使用。

为了让它正常工作,我不得不在主 Makefile 中做一点小改动,它指定了 BoardConfig.mk 中定义的 DTB 的位置。更改很简单,但困难的部分是首先找出问题出在哪里以及它打算如何工作。

"build/make/" 中的以下补丁修复了该问题,只要 BoardConfig.mk 仅指定一个 DTB(至少满足我的需要):

diff --git a/core/Makefile b/core/Makefile
index a650565a1..92f3025a9 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -621,6 +621,19 @@ ifdef INTERNAL_KERNEL_CMDLINE
 INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"
 endif

+# NOTE! This script has a defect which cause the kernel DTB to be left out when ever 'make dist'
+#       is executed. The following addition "fixes" this by adding the first dtb specified in the 
+#       BoardConfig.mk file. (I would guess in most cases there is never more than one!)
+ifdef dist_goal
+ifndef BOARD_KERNEL_DTS
+ifdef TARGET_BOARD_DTS_CONFIG
+DTS_BOARD=$(word 2, $(subst :, ,$(word 1, $(TARGET_BOARD_DTS_CONFIG))))
+BOARD_KERNEL_DTS="$(KERNEL_OUT)/$(DTS_BOARD)"
+$(info FIXUP: Defining BOARD_KERNEL_DTS:=[$(BOARD_KERNEL_DTS)] for BOOT packaging)
+endif
+endif
+endif
+
 INTERNAL_MKBOOTIMG_VERSION_ARGS := \
     --os_version $(PLATFORM_VERSION) \
     --os_patch_level $(PLATFORM_SECURITY_PATCH)