diff --git a/core/Makefile b/core/Makefile index 2d7144a98..46920b393 100644 --- a/core/Makefile +++ b/core/Makefile @@ -162,11 +162,19 @@ endif $(call dist-for-goals,sdk,$(API_FINGERPRINT)) INSTALLED_RECOVERYIMAGE_TARGET := +# Build recovery image if +# BUILDING_RECOVERY_IMAGE && !BOARD_USES_RECOVERY_AS_BOOT && !BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. +# If BOARD_USES_RECOVERY_AS_BOOT is true, leave empty because INSTALLED_BOOTIMAGE_TARGET is built +# with recovery resources. +# If BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT is true, leave empty to build recovery resources +# but not the final recovery image. ifdef BUILDING_RECOVERY_IMAGE ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +ifneq ($(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT),true) INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img endif endif +endif include $(BUILD_SYSTEM)/sysprop.mk @@ -746,7 +754,19 @@ endif INTERNAL_KERNEL_CMDLINE := $(strip $(INTERNAL_KERNEL_CMDLINE) buildvariant=$(TARGET_BUILD_VARIANT) $(VERITY_KEYID)) -ifndef BUILDING_VENDOR_BOOT_IMAGE +boot_uses_generic_kernel_image := +ifdef BUILDING_VENDOR_BOOT_IMAGE + # building vendor boot image, dtb/base/pagesize go there + boot_uses_generic_kernel_image := true +else ifeq (true,$(BOARD_USES_GENERIC_KERNEL_IMAGE)) + boot_uses_generic_kernel_image := true +endif + +ifeq (true,$(boot_uses_generic_kernel_image)) + ifdef GENERIC_KERNEL_CMDLINE + INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(GENERIC_KERNEL_CMDLINE)" + endif +else # boot_uses_generic_kernel_image != true ifdef BOARD_KERNEL_BASE INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) endif @@ -756,12 +776,8 @@ endif ifdef INTERNAL_KERNEL_CMDLINE INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)" endif -else -# building vendor boot image, dtb/base/pagesize go there -ifdef GENERIC_KERNEL_CMDLINE - INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(GENERIC_KERNEL_CMDLINE)" -endif -endif +endif # boot_uses_generic_kernel_image == true +boot_uses_generic_kernel_image := INTERNAL_MKBOOTIMG_VERSION_ARGS := \ --os_version $(PLATFORM_VERSION_LAST_STABLE) \ @@ -868,6 +884,12 @@ INSTALLED_BOOTIMAGE_TARGET := endif # BOARD_PREBUILT_BOOTIMAGE endif # TARGET_NO_KERNEL +# ----------------------------------------------------------------- +# declare recovery ramdisk files +ifeq ($(BUILDING_RECOVERY_IMAGE),true) +INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP := $(call intermediates-dir-for,PACKAGING,recovery)/ramdisk_files-timestamp +endif + # ----------------------------------------------------------------- # vendor boot image ifeq ($(BUILDING_VENDOR_BOOT_IMAGE),true) @@ -881,8 +903,14 @@ INTERNAL_VENDOR_RAMDISK_FILES := $(filter $(TARGET_VENDOR_RAMDISK_OUT)/%, \ $(ALL_DEFAULT_INSTALLED_MODULES)) INTERNAL_VENDOR_RAMDISK_TARGET := $(call intermediates-dir-for,PACKAGING,vendor-boot)/vendor-ramdisk.cpio$(RAMDISK_EXT) + +ifeq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT)) +$(INTERNAL_VENDOR_RAMDISK_TARGET): $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP) +$(INTERNAL_VENDOR_RAMDISK_TARGET): PRIVATE_ADDITIONAL_DIR := $(TARGET_RECOVERY_ROOT_OUT) +endif + $(INTERNAL_VENDOR_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_VENDOR_RAMDISK_FILES) | $(COMPRESSION_COMMAND_DEPS) - $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_VENDOR_RAMDISK_OUT) | $(COMPRESSION_COMMAND) > $@ + $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_VENDOR_RAMDISK_OUT) $(PRIVATE_ADDITIONAL_DIR) | $(COMPRESSION_COMMAND) > $@ ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG INTERNAL_VENDOR_BOOTIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET) @@ -1863,17 +1891,23 @@ endif ifeq (truetrue,$(strip $(BUILDING_VENDOR_BOOT_IMAGE))$(strip $(AB_OTA_UPDATER))) INTERNAL_RECOVERYIMAGE_ARGS := --ramdisk $(recovery_ramdisk) + +ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)) ifdef GENERIC_KERNEL_CMDLINE INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(GENERIC_KERNEL_CMDLINE)" -endif +endif # GENERIC_KERNEL_CMDLINE != "" +endif # BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE != true + else # not (BUILDING_VENDOR_BOOT_IMAGE and AB_OTA_UPDATER) INTERNAL_RECOVERYIMAGE_ARGS := \ $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ --ramdisk $(recovery_ramdisk) # Assumes this has already been stripped +ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)) ifdef INTERNAL_KERNEL_CMDLINE INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)" -endif +endif # INTERNAL_KERNEL_CMDLINE != "" +endif # BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE != true ifdef BOARD_KERNEL_BASE INTERNAL_RECOVERYIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) endif @@ -1898,7 +1932,7 @@ ifndef BOARD_RECOVERY_MKBOOTIMG_ARGS BOARD_RECOVERY_MKBOOTIMG_ARGS := $(BOARD_MKBOOTIMG_ARGS) endif -$(recovery_ramdisk): $(MKBOOTFS) $(COMPRESSION_COMMAND_DEPS) \ +$(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP): $(MKBOOTFS) $(COMPRESSION_COMMAND_DEPS) \ $(INTERNAL_ROOT_FILES) \ $(INSTALLED_RAMDISK_TARGET) \ $(INTERNAL_RECOVERYIMAGE_FILES) \ @@ -1934,16 +1968,19 @@ $(recovery_ramdisk): $(MKBOOTFS) $(COMPRESSION_COMMAND_DEPS) \ cp -f $(recovery_wipe) $(TARGET_RECOVERY_ROOT_OUT)/system/etc/recovery.wipe) ln -sf prop.default $(TARGET_RECOVERY_ROOT_OUT)/default.prop $(BOARD_RECOVERY_IMAGE_PREPARE) + $(hide) touch $@ + +$(recovery_ramdisk): $(INTERNAL_RECOVERY_RAMDISK_FILES_TIMESTAMP) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RECOVERY_ROOT_OUT) | $(COMPRESSION_COMMAND) > $(recovery_ramdisk) # $(1): output file -# $(2): kernel file +# $(2): optional kernel file define build-recoveryimage-target $(if $(filter true,$(PRODUCT_SUPPORTS_VBOOT)), \ - $(MKBOOTIMG) --kernel $(2) $(INTERNAL_RECOVERYIMAGE_ARGS) \ + $(MKBOOTIMG) $(if $(strip $(2)),--kernel $(strip $(2))) $(INTERNAL_RECOVERYIMAGE_ARGS) \ $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_RECOVERY_MKBOOTIMG_ARGS) \ --output $(1).unsigned, \ - $(MKBOOTIMG) --kernel $(2) $(INTERNAL_RECOVERYIMAGE_ARGS) \ + $(MKBOOTIMG) $(if $(strip $(2)),--kernel $(strip $(2))) $(INTERNAL_RECOVERYIMAGE_ARGS) \ $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_RECOVERY_MKBOOTIMG_ARGS) \ --output $(1)) $(if $(filter true,$(PRODUCT_SUPPORTS_BOOT_SIGNER)),\ @@ -1995,7 +2032,8 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(recoveryimage-deps) endif # BOARD_USES_RECOVERY_AS_BOOT $(INSTALLED_RECOVERYIMAGE_TARGET): $(recoveryimage-deps) - $(call build-recoveryimage-target, $@, $(recovery_kernel)) + $(call build-recoveryimage-target, $@, \ + $(if $(filter true, $(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)),, $(recovery_kernel))) ifdef RECOVERY_RESOURCE_ZIP $(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ZIPTIME) @@ -2007,7 +2045,8 @@ endif .PHONY: recoveryimage-nodeps recoveryimage-nodeps: @echo "make $@: ignoring dependencies" - $(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET), $(recovery_kernel)) + $(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET), \ + $(if $(filter true, $(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)),, $(recovery_kernel))) else # BUILDING_RECOVERY_IMAGE RECOVERY_RESOURCE_ZIP := @@ -4153,6 +4192,9 @@ endif ifeq ($(BOARD_BOOTLOADER_IN_UPDATE_PACKAGE),true) $(hide) echo "bootloader_in_update_package=true" >> $@ endif +ifeq ($(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE),true) + $(hide) echo "exclude_kernel_from_recovery_image=true" >> $@ +endif .PHONY: misc_info misc_info: $(INSTALLED_MISC_INFO_TARGET) @@ -4211,8 +4253,11 @@ endif $(BUILT_TARGET_FILES_PACKAGE): $(updater_dep) # If we are using recovery as boot, output recovery files to BOOT/. +# If we are moving recovery resources to vendor_boot, output recovery files to VENDOR_BOOT/. ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := BOOT +else ifeq ($(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT),true) +$(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := VENDOR_BOOT else $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := RECOVERY endif @@ -4423,7 +4468,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \ @echo "Package target files: $@" $(hide) rm -rf $@ $@.list $(zip_root) $(hide) mkdir -p $(dir $@) $(zip_root) -ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))) +ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))$(filter true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT))) @# Components of the recovery image $(hide) mkdir -p $(zip_root)/$(PRIVATE_RECOVERY_OUT) $(hide) $(call package_files-copy-root, \ @@ -4431,12 +4476,14 @@ ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_ ifdef INSTALLED_KERNEL_TARGET ifneq (,$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))) cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/ -else # BOARD_USES_RECOVERY_AS_BOOT not true +else ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)) cp $(firstword $(INSTALLED_KERNEL_TARGET)) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/kernel endif endif ifeq (truetrue,$(strip $(BUILDING_VENDOR_BOOT_IMAGE))$(strip $(AB_OTA_UPDATER))) +ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)) echo "$(GENERIC_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline +endif # BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE != true else # not (BUILDING_VENDOR_BOOT_IMAGE and AB_OTA_UPDATER) ifdef INSTALLED_2NDBOOTLOADER_TARGET cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second @@ -4454,9 +4501,11 @@ endif ifdef INSTALLED_DTBIMAGE_TARGET cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/dtb endif +ifneq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)) ifdef INTERNAL_KERNEL_CMDLINE echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline -endif +endif # INTERNAL_KERNEL_CMDLINE != "" +endif # BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE != true ifdef BOARD_KERNEL_BASE echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/base endif @@ -4479,23 +4528,25 @@ endif ifdef INSTALLED_KERNEL_TARGET $(hide) cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/ endif -ifndef INSTALLED_VENDOR_BOOTIMAGE_TARGET +ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET + echo "$(GENERIC_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline +else ifeq (true,$(BOARD_USES_GENERIC_KERNEL_IMAGE)) + echo "$(GENERIC_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline +else # INSTALLED_VENDOR_BOOTIMAGE_TARGET == "" && BOARD_USES_GENERIC_KERNEL_IMAGE != true + echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline ifdef INSTALLED_2NDBOOTLOADER_TARGET cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second endif ifdef INSTALLED_DTBIMAGE_TARGET cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/BOOT/dtb endif - echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline ifdef BOARD_KERNEL_BASE echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base endif ifdef BOARD_KERNEL_PAGESIZE echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize endif -else # INSTALLED_VENDOR_BOOTIMAGE_TARGET defined - echo "$(GENERIC_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline -endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET defined +endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET == "" && BOARD_USES_GENERIC_KERNEL_IMAGE != true endif # BOARD_USES_RECOVERY_AS_BOOT not true $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\ mkdir -p $(zip_root)/RADIO; \ diff --git a/core/board_config.mk b/core/board_config.mk index 05b6b29c1..03d2b3e78 100644 --- a/core/board_config.mk +++ b/core/board_config.mk @@ -97,6 +97,19 @@ _board_strip_readonly_list += \ BOARD_KERNEL_BINARIES \ BOARD_KERNEL_MODULE_INTERFACE_VERSIONS \ +# Variables related to generic kernel image (GKI) and generic boot image +# - BOARD_USES_GENERIC_KERNEL_IMAGE is the global variable that defines if the +# board uses GKI and generic boot image. +# Update mechanism of the boot image is not enforced by this variable. +# - BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE controls whether the recovery image +# contains a kernel or not. +# - BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT controls whether ramdisk +# recovery resources are built to vendor_boot. +_board_strip_readonly_list += \ + BOARD_USES_GENERIC_KERNEL_IMAGE \ + BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE \ + BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT \ + _build_broken_var_list := \ BUILD_BROKEN_DUP_RULES \ BUILD_BROKEN_DUP_SYSPROP \ @@ -364,6 +377,9 @@ BUILDING_RECOVERY_IMAGE := ifeq ($(PRODUCT_BUILD_RECOVERY_IMAGE),) ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) BUILDING_RECOVERY_IMAGE := true + else ifeq ($(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT),true) + # Set to true to build recovery resources for vendor_boot + BUILDING_RECOVERY_IMAGE := true else ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY))) BUILDING_RECOVERY_IMAGE := true @@ -745,3 +761,25 @@ $(foreach m,$(filter-out BUILD_COPY_HEADERS,$(DEFAULT_ERROR_BUILD_MODULE_TYPES)) $(if $(filter true,$(BUILD_BROKEN_USES_$(m))),\ $(KATI_deprecated_var $(m),Please convert to Soong),\ $(KATI_obsolete_var $(m),Please convert to Soong))) + +ifndef BUILDING_RECOVERY_IMAGE + ifeq (true,$(BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE)) + $(error Should not set BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE if not building recovery image) + endif +endif + +ifndef BUILDING_VENDOR_BOOT_IMAGE + ifeq (true,$(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT)) + $(error Should not set BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT if not building vendor_boot image) + endif +endif + +# If BOARD_USES_GENERIC_KERNEL_IMAGE is set, BOARD_USES_RECOVERY_AS_BOOT must not be set. +# Devices without a dedicated recovery partition uses BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT to +# build recovery into vendor_boot. +ifeq (true,$(BOARD_USES_GENERIC_KERNEL_IMAGE)) + ifeq (true,$(BOARD_USES_RECOVERY_AS_BOOT)) + $(error BOARD_USES_RECOVERY_AS_BOOT cannot be true if BOARD_USES_GENERIC_KERNEL_IMAGE is true. \ + Use BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT instead) + endif +endif diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 77d2021d8..acf98117d 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1287,23 +1287,27 @@ def _BuildBootableImage(image_name, sourcedir, fs_config_file, info_dict=None, for building the requested image. """ + if info_dict is None: + info_dict = OPTIONS.info_dict + # "boot" or "recovery", without extension. partition_name = os.path.basename(sourcedir).lower() + kernel = None if partition_name == "recovery": - kernel = "kernel" + if info_dict.get("exclude_kernel_from_recovery_image") == "true": + logger.info("Excluded kernel binary from recovery image.") + else: + kernel = "kernel" else: kernel = image_name.replace("boot", "kernel") kernel = kernel.replace(".img", "") - if not os.access(os.path.join(sourcedir, kernel), os.F_OK): + if kernel and not os.access(os.path.join(sourcedir, kernel), os.F_OK): return None if has_ramdisk and not os.access(os.path.join(sourcedir, "RAMDISK"), os.F_OK): return None - if info_dict is None: - info_dict = OPTIONS.info_dict - img = tempfile.NamedTemporaryFile() if has_ramdisk: @@ -1313,7 +1317,9 @@ def _BuildBootableImage(image_name, sourcedir, fs_config_file, info_dict=None, # use MKBOOTIMG from environ, or "mkbootimg" if empty or not set mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg" - cmd = [mkbootimg, "--kernel", os.path.join(sourcedir, kernel)] + cmd = [mkbootimg] + if kernel: + cmd += ["--kernel", os.path.join(sourcedir, kernel)] fn = os.path.join(sourcedir, "second") if os.access(fn, os.F_OK):