From e74a38bc6df35321c029ae7a5da9708437e820c2 Mon Sep 17 00:00:00 2001 From: Hridya Valsaraju Date: Wed, 21 Mar 2018 12:15:11 -0700 Subject: [PATCH] Allow addition of recovery DTBO to recovery image Non-A/B devices need to include the DTBO image within the recovery partition to be self-sufficient and prevent OTA failures. Test: Ran 'm dist' and verified that the DTBO image was included in recovery.img using unpack_bootimg. Also ran 'make' and verified that the DTBO image was included in recovery.img using unpack_bootimg. Also tested that aosp_angler-userdebug could boot into recovery(including a fake dtbo.img in recovery image). Bug: 74763691 Change-Id: I38c9c395c95d21f4da42cfa646063bd4416f6bd8 --- core/Makefile | 17 +++++++++++++++-- tools/releasetools/common.py | 5 +++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/Makefile b/core/Makefile index 06573fba7..8c88d0a39 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1278,11 +1278,15 @@ endif # (BOARD_USES_RECOVERY_AS_BOOT = true); # c) We build the root into system image - not needing the resource file as we do bsdiff # (BOARD_BUILD_SYSTEM_ROOT_IMAGE = true). +# d) We include the recovery DTBO image within recovery - not needing the resource file as we +# do bsdiff because boot and recovery will contain different number of entries +# (BOARD_INCLUDE_RECOVERY_DTBO = true). # Note that condition b) implies condition c), because of the earlier check in this file: # "BOARD_USES_RECOVERY_AS_BOOT = true must have BOARD_BUILD_SYSTEM_ROOT_IMAGE = true" (not vice # versa though). -ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_BUILD_SYSTEM_ROOT_IMAGE))) +ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_BUILD_SYSTEM_ROOT_IMAGE) \ + $(BOARD_INCLUDE_RECOVERY_DTBO))) # Named '.dat' so we don't attempt to use imgdiff for patching it. RECOVERY_RESOURCE_ZIP := $(TARGET_OUT)/etc/recovery-resource.dat else @@ -1304,6 +1308,9 @@ endif ifdef BOARD_KERNEL_PAGESIZE INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) endif +ifdef BOARD_INCLUDE_RECOVERY_DTBO + INTERNAL_RECOVERYIMAGE_ARGS += --recovery_dtbo $(BOARD_PREBUILT_DTBOIMAGE) +endif # Keys authorized to sign OTA packages this build will accept. The # build always uses dev-keys for this; release packaging tools will @@ -1569,7 +1576,7 @@ SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) # image size check calculation. ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) ifneq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) -ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) +ifneq (,$(filter true, $(BOARD_BUILD_SYSTEM_ROOT_IMAGE) $(BOARD_INCLUDE_RECOVERY_DTBO))) diff_tool := $(HOST_OUT_EXECUTABLES)/bsdiff else diff_tool := $(HOST_OUT_EXECUTABLES)/imgdiff @@ -2550,6 +2557,9 @@ endif ifdef INSTALLED_2NDBOOTLOADER_TARGET $(hide) cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second endif +ifdef BOARD_INCLUDE_RECOVERY_DTBO + $(hide) cp $(INSTALLED_DTBOIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_dtbo +endif ifdef INTERNAL_KERNEL_CMDLINE $(hide) echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline endif @@ -2641,6 +2651,9 @@ endif ifeq ($(INSTALLED_RECOVERYIMAGE_TARGET),) $(hide) echo "no_recovery=true" >> $(zip_root)/META/misc_info.txt endif +ifdef BOARD_INCLUDE_RECOVERY_DTBO + $(hide) echo "include_recovery_dtbo=true" >> $(zip_root)/META/misc_info.txt +endif ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE $(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt endif diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index b5f69a526..fd8a13007 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -461,6 +461,11 @@ def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None, # "boot" or "recovery", without extension. partition_name = os.path.basename(sourcedir).lower() + if (partition_name == "recovery" and + info_dict.get("include_recovery_dtbo") == "true"): + fn = os.path.join(sourcedir, "recovery_dtbo") + cmd.extend(["--recovery_dtbo", fn]) + p = Run(cmd, stdout=subprocess.PIPE) p.communicate() assert p.returncode == 0, "mkbootimg of %s image failed" % (partition_name,)