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

时间:2019-03-06 08:44:58

标签: android kernel android-source device-tree

我正在将android移植到显示设备,并且几乎完成了此操作。该设备使用飞思卡尔/ NXP i.MX6 Dual Lite Soc。所使用的Android版本为Android 8.0.0,该版本基于NXP / Freescale的Board Support Packages(以下链接)。 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

操作系统运行良好,并且从“ 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 ...

1 个答案:

答案 0 :(得分:0)

似乎恩智浦/飞思卡尔已经修改了其AOSP板级支持包中的构建脚本,并破坏了该过程中DTB的包含。当标准“ make”过程的输出在其开发板上工作时,他们似乎很高兴,并且从不费心检查是否可以使用它来创建有效的已签名的Release映像。

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

为了使其正常工作,我必须对主Makefile进行一些小的更改,该文件指定了BoardConfig.mk中定义的DTB的位置。所做的更改很简单,但困难的部分是首先弄清楚问题出在哪里以及打算如何解决。

只要BoardConfig.mk仅指定一个DTB(至少满足我的需求),下面的“ build / make /”修补程序将解决此问题:

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)