Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建签名的Android映像后缺少内核DTB_Android_Kernel_Android Source_Device Tree - Fatal编程技术网

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

创建签名的Android映像后缺少内核DTB,android,kernel,android-source,device-tree,Android,Kernel,Android Source,Device Tree,我正在将android移植到一个显示设备上,并且几乎完成了这项工作。该设备使用飞思卡尔/NXP i.MX6双Lite Soc。使用的安卓版本是安卓8.0.0,构建基于NXP/Freescale的板级支持包(以下链接)。 操作系统构建良好,并且“make”过程产生的映像(u-boot、boot.img、system.img、vendor.img)在设备上运行良好。所以我的最后一步基本上是在图片上签名,这就是我努力让东西正常工作的地方 我遵循在这里找到的指南: 完成这些步骤后,我使用“signe

我正在将android移植到一个显示设备上,并且几乎完成了这项工作。该设备使用飞思卡尔/NXP i.MX6双Lite Soc。使用的安卓版本是安卓8.0.0,构建基于NXP/Freescale的板级支持包(以下链接)。

操作系统构建良好,并且“make”过程产生的映像(u-boot、boot.img、system.img、vendor.img)在设备上运行良好。所以我的最后一步基本上是在图片上签名,这就是我努力让东西正常工作的地方

我遵循在这里找到的指南:

完成这些步骤后,我使用“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 ...
我已经将问题缩小到指南中的第一步,其中“makedist”在build目录中执行。这会在“out/dist”文件夹中生成许多ZIP文件,在本指南的以下步骤中会进一步处理这些文件。我尝试过用这个步骤中生成的图像(在生成的“out/dist/*-img-*.zip”文件中找到)来刷新设备,这会产生完全相同的问题

所以我的问题是,“makedist”到底做了什么导致DTB在“boot.img”中丢失?我希望它使用“out/target/product/”中已经在工作的“boot.img”。但它似乎重新构建了这个映像,在本例中不包括DTB。与从源代码构建Android的许多其他方面一样,“makedist”的工作原理似乎在文档中的任何地方都没有解释

我希望任何有从源代码构建安卓系统经验的人都知道这一点,因为我似乎完全被卡住了

仅供参考;当我刷新正常“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的机制已经到位(指定了DTB在BOARD_KERNEL_DTS中的位置),并且还用于其“make-otapackage”目标。但是,该目标仅生成未签名(或使用开发密钥签名)的OTA包,该包不能与签名脚本一起使用

为了让它正常工作,我必须在主Makefile中做一个小的更改,该文件指定BoardConfig.mk中定义的DTB的位置。改变很简单,但最困难的部分是弄清楚问题出在哪里,以及最初打算如何解决

“build/make/”中的以下修补程序修复了该问题,只要BoardConfig.mk只指定一个DTB(至少适合我的需要):


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

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

为了让它正常工作,我必须在主Makefile中做一个小的更改,该文件指定BoardConfig.mk中定义的DTB的位置。改变很简单,但最困难的部分是弄清楚问题出在哪里,以及最初打算如何解决

“build/make/”中的以下修补程序修复了该问题,只要BoardConfig.mk只指定一个DTB(至少适合我的需要):


很可能引导映像不是作为一个整体blob签名的,而是每个部分单独签名的。您可能需要找到打包签名版本的代码或脚本,并使其同时处理dtb。不幸的是,在使用AOSP时,进入供应商代码库不完整或未经测试的地方并不少见,因为android在一两个版本中出现了重大突破性变化,因此跟踪此类事件很容易成为AOSP项目的最大部分。是的,事实上,我已经做了1.5天了。所涉及的脚本数量惊人,而且似乎没有关于这些东西是如何工作的文档,也没有关于它是如何设计的文档。因此,这需要一些时间才能弄清楚。有趣的是,unsigned boot.img可以很好地处理已签名的系统和供应商映像。因此,似乎boot.img并没有真正被签名脚本所触动。boot签名与apk签名无关。实际上,只有在bootloader被锁定的情况下,您才需要它。用您的密钥锁定它可能是一种冒险,通常有一种“指示但不强制”模式,但仍然要做好准备以砖块形式构建一些硬件…很可能引导映像不是作为一个整体blob签名的,而是每个部分单独签名的。您可能需要找到打包签名版本的代码或脚本,并使其同时处理dtb。不幸的是,在使用AOSP时,进入供应商代码库不完整或没有经过测试的地方并不少见,因为android在一两个版本中进行了重大突破性的更改,因此跟踪此类事情很容易成为AOSP项目的最大部分。是的,这实际上就是我所做的
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)