From d82a1549f1ebd3c8a22795eb472e8bd6eb7b28a2 Mon Sep 17 00:00:00 2001 From: Bowgo Tsai Date: Wed, 20 Mar 2019 17:59:52 +0800 Subject: [PATCH] Adding boot-debug.img and ramdisk-debug.img The two new debugging images adds additional files based on boot.img and ramdisk.img/ramdisk-recovery.img, respectively. File /force_debuggable is to trigger special logic in /init to load an userdebug version of sepolicy and an additional property file from this ramdisk to allow adb root, if the device is unlocked. It's intentional to skip signing for boot-debug.img, as it can only be used if the device is unlocked, where verification error is allowed. Those debugging images allows adb root on user build system.img, vendor.img, product.img, etc. This can facilitate more automated testings on user builds and is helpful to narrow down the delta between what's being tested v.s. what's being shipped. Bug: 126493225 Test: `make dist`, checks both boot-debug.img and ramdisk-debug.img are in $OUT/ and out/dist. Test: `make dist`, checks installed-files-ramdisk-debug.{json,txt} are in out/dist. Test: `system/core/mkbootimg/unpack_bootimg.py --boot_img $OUT/boot-debug.img`, checks the extracted out/ramdisk is as expected Test: Run `gunzip -c ramdisk | cpio -idm` for the ramdisk extracted from $OUT/boot-debug.img and $OUT/boot.img, respectively. Then compare the root dirs of both, e.g., `diff -rq --no-dereference ./ramdisk ./ramdisk-debug` Test: `make ramdisk_debug-nodeps` and `make bootimage_debug-nodeps` Change-Id: I30137c3caef91805d9143d404e5e4d06c0fccc30 Merged-In: I30137c3caef91805d9143d404e5e4d06c0fccc30 (cherry picked from commit 0013f55ef4768fdb996894e8d08aa8222467831b) --- core/Makefile | 100 +++++++++++++++++++++++++++++++++++++++++++ core/board_config.mk | 6 +++ core/config.mk | 2 + core/envsetup.mk | 2 + core/main.mk | 14 ++++++ 5 files changed, 124 insertions(+) diff --git a/core/Makefile b/core/Makefile index 224c09917b..ca040f6ca7 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1990,6 +1990,106 @@ ifneq ($(BOARD_NAND_SPARE_SIZE),) $(error MTD device is no longer supported and thus BOARD_NAND_SPARE_SIZE is deprecated.) endif +# ----------------------------------------------------------------- +# the debug ramdisk, which is the original ramdisk plus additional +# files: force_debuggable, adb_debug.prop and userdebug sepolicy. +# When /force_debuggable is present, /init will load userdebug sepolicy +# and property files to allow adb root, if the device is unlocked. + +ifdef BUILDING_RAMDISK_IMAGE +BUILT_DEBUG_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk-debug.img +INSTALLED_DEBUG_RAMDISK_TARGET := $(BUILT_DEBUG_RAMDISK_TARGET) + +INTERNAL_DEBUG_RAMDISK_FILES := $(filter $(TARGET_DEBUG_RAMDISK_OUT)/%, \ + $(ALL_GENERATED_SOURCES) \ + $(ALL_DEFAULT_INSTALLED_MODULES)) + +# Note: TARGET_DEBUG_RAMDISK_OUT will be $(PRODUCT_OUT)/debug_ramdisk/first_stage_ramdisk, +# if BOARD_USES_RECOVERY_AS_BOOT is true. Otherwise, it will be $(PRODUCT_OUT)/debug_ramdisk. +# But the root dir of the ramdisk to build is always $(PRODUCT_OUT)/debug_ramdisk. +my_debug_ramdisk_root_dir := $(PRODUCT_OUT)/debug_ramdisk + +INSTALLED_FILES_FILE_DEBUG_RAMDISK := $(PRODUCT_OUT)/installed-files-ramdisk-debug.txt +INSTALLED_FILES_JSON_DEBUG_RAMDISK := $(INSTALLED_FILES_FILE_DEBUG_RAMDISK:.txt=.json) +$(INSTALLED_FILES_FILE_DEBUG_RAMDISK): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_DEBUG_RAMDISK) +$(INSTALLED_FILES_FILE_DEBUG_RAMDISK): DEBUG_RAMDISK_ROOT_DIR := $(my_debug_ramdisk_root_dir) + +# Cannot just depend on INTERNAL_DEBUG_RAMDISK_FILES like other INSTALLED_FILES_FILE_* rules. +# Because ramdisk-debug.img will rsync from either ramdisk.img or ramdisk-recovery.img. +# Need to depend on the built ramdisk-debug.img, to get a complete list of the installed files. +$(INSTALLED_FILES_FILE_DEBUG_RAMDISK) : $(INSTALLED_DEBUG_RAMDISK_TARGET) +$(INSTALLED_FILES_FILE_DEBUG_RAMDISK) : $(INTERNAL_DEBUG_RAMDISK_FILES) $(FILESLIST) + echo Installed file list: $@ + mkdir -p $(dir $@) + rm -f $@ + $(FILESLIST) $(DEBUG_RAMDISK_ROOT_DIR) > $(@:.txt=.json) + build/make/tools/fileslist_util.py -c $(@:.txt=.json) > $@ + +# ramdisk-debug.img will rsync the content from either ramdisk.img or ramdisk-recovery.img, +# depending on whether BOARD_USES_RECOVERY_AS_BOOT is set or not. +ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +my_debug_ramdisk_sync_dir := $(TARGET_RECOVERY_ROOT_OUT) +else +my_debug_ramdisk_sync_dir := $(TARGET_RAMDISK_OUT) +endif # BOARD_USES_RECOVERY_AS_BOOT + +$(INSTALLED_DEBUG_RAMDISK_TARGET): DEBUG_RAMDISK_SYNC_DIR := $(my_debug_ramdisk_sync_dir) +$(INSTALLED_DEBUG_RAMDISK_TARGET): DEBUG_RAMDISK_ROOT_DIR := $(my_debug_ramdisk_root_dir) +# We should have just depended on ramdisk.img or ramdisk-recovery.img. +# But ramdisk-recovery.img is not a make target, so let's depend on the boot.img directly. +$(INSTALLED_DEBUG_RAMDISK_TARGET): $(INSTALLED_BOOTIMAGE_TARGET) +$(INSTALLED_DEBUG_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_DEBUG_RAMDISK_FILES) | $(MINIGZIP) + $(call pretty,"Target debug ram disk: $@") + mkdir -p $(TARGET_DEBUG_RAMDISK_OUT) + touch $(TARGET_DEBUG_RAMDISK_OUT)/force_debuggable + rsync -a $(DEBUG_RAMDISK_SYNC_DIR)/* $(DEBUG_RAMDISK_ROOT_DIR) + $(MKBOOTFS) -d $(TARGET_OUT) $(DEBUG_RAMDISK_ROOT_DIR) | $(MINIGZIP) > $@ + +.PHONY: ramdisk_debug-nodeps +ramdisk_debug-nodeps: DEBUG_RAMDISK_SYNC_DIR := $(my_debug_ramdisk_sync_dir) +ramdisk_debug-nodeps: DEBUG_RAMDISK_ROOT_DIR := $(my_debug_ramdisk_root_dir) +ramdisk_debug-nodeps: $(MKBOOTFS) | $(MINIGZIP) + echo "make $@: ignoring dependencies" + mkdir -p $(TARGET_DEBUG_RAMDISK_OUT) + touch $(TARGET_DEBUG_RAMDISK_OUT)/force_debuggable + rsync -a $(DEBUG_RAMDISK_SYNC_DIR)/* $(DEBUG_RAMDISK_ROOT_DIR) + $(MKBOOTFS) -d $(TARGET_OUT) $(DEBUG_RAMDISK_ROOT_DIR) | $(MINIGZIP) > $(INSTALLED_DEBUG_RAMDISK_TARGET) + +my_debug_ramdisk_sync_dir := +my_debug_ramdisk_root_dir := + +endif # BUILDING_RAMDISK_IMAGE + +# ----------------------------------------------------------------- +# the boot-debug.img, which is the kernel plus ramdisk-debug.img +# +# Note: it's intentional to skip signing for boot-debug.img, because it +# can only be used if the device is unlocked with verification error. +ifneq ($(strip $(TARGET_NO_KERNEL)),true) + +INSTALLED_DEBUG_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot-debug.img + +# Replace ramdisk.img in $(MKBOOTIMG) ARGS with ramdisk-debug.img to build boot-debug.img +ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +INTERNAL_DEBUG_BOOTIMAGE_ARGS := $(subst $(recovery_ramdisk),$(INSTALLED_DEBUG_RAMDISK_TARGET), $(INTERNAL_RECOVERYIMAGE_ARGS)) +else +INTERNAL_DEBUG_BOOTIMAGE_ARGS := $(subst $(INSTALLED_RAMDISK_TARGET),$(INSTALLED_DEBUG_RAMDISK_TARGET), $(INTERNAL_BOOTIMAGE_ARGS)) +endif + +# Depends on original boot.img and ramdisk-debug.img, to build the new boot-debug.img +$(INSTALLED_DEBUG_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_DEBUG_RAMDISK_TARGET) + $(call pretty,"Target boot debug image: $@") + $(MKBOOTIMG) $(INTERNAL_DEBUG_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ + $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + +.PHONY: bootimage_debug-nodeps +bootimage_debug-nodeps: $(MKBOOTIMG) + echo "make $@: ignoring dependencies" + $(MKBOOTIMG) $(INTERNAL_DEBUG_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_DEBUG_BOOTIMAGE_TARGET) + $(call assert-max-image-size,$(INSTALLED_DEBUG_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + +endif # TARGET_NO_KERNEL + # ----------------------------------------------------------------- # system image # diff --git a/core/board_config.mk b/core/board_config.mk index 2c8a571889..d1ca89be1e 100644 --- a/core/board_config.mk +++ b/core/board_config.mk @@ -236,6 +236,12 @@ ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) TARGET_COPY_OUT_RAMDISK := $(TARGET_COPY_OUT_ROOT) endif +########################################### +# Now we can substitute with the real value of TARGET_COPY_OUT_DEBUG_RAMDISK +ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) +TARGET_COPY_OUT_DEBUG_RAMDISK := debug_ramdisk/first_stage_ramdisk +endif + ########################################### # Configure whether we're building the system image BUILDING_SYSTEM_IMAGE := true diff --git a/core/config.mk b/core/config.mk index 6825155dbe..f318e1d3d3 100644 --- a/core/config.mk +++ b/core/config.mk @@ -1171,7 +1171,9 @@ dont_bother_goals := out \ onod odmimage-nodeps \ systemotherimage-nodeps \ ramdisk-nodeps \ + ramdisk_debug-nodeps \ bootimage-nodeps \ + bootimage_debug-nodeps \ recoveryimage-nodeps \ vbmetaimage-nodeps \ product-graph dump-products diff --git a/core/envsetup.mk b/core/envsetup.mk index f4be2c73f0..5131598a94 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -225,6 +225,7 @@ TARGET_COPY_OUT_DATA := data TARGET_COPY_OUT_ASAN := $(TARGET_COPY_OUT_DATA)/asan TARGET_COPY_OUT_OEM := oem TARGET_COPY_OUT_RAMDISK := ramdisk +TARGET_COPY_OUT_DEBUG_RAMDISK := debug_ramdisk TARGET_COPY_OUT_ROOT := root TARGET_COPY_OUT_RECOVERY := recovery # The directory used for optional partitions depend on the BoardConfig, so @@ -840,6 +841,7 @@ TARGET_OUT_COVERAGE := $(PRODUCT_OUT)/coverage TARGET_RAMDISK_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_RAMDISK) TARGET_RAMDISK_OUT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED) +TARGET_DEBUG_RAMDISK_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_DEBUG_RAMDISK) TARGET_ROOT_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ROOT) TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin diff --git a/core/main.mk b/core/main.mk index 590bfcc7ff..af26705370 100644 --- a/core/main.mk +++ b/core/main.mk @@ -1429,6 +1429,9 @@ endif .PHONY: ramdisk ramdisk: $(INSTALLED_RAMDISK_TARGET) +.PHONY: ramdisk_debug +ramdisk_debug: $(INSTALLED_DEBUG_RAMDISK_TARGET) + .PHONY: systemtarball systemtarball: $(INSTALLED_SYSTEMTARBALL_TARGET) @@ -1475,6 +1478,9 @@ superimage_empty: $(INSTALLED_SUPERIMAGE_EMPTY_TARGET) .PHONY: bootimage bootimage: $(INSTALLED_BOOTIMAGE_TARGET) +.PHONY: bootimage_debug +bootimage_debug: $(INSTALLED_DEBUG_BOOTIMAGE_TARGET) + .PHONY: vbmetaimage vbmetaimage: $(INSTALLED_VBMETAIMAGE_TARGET) @@ -1487,6 +1493,8 @@ droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \ $(INSTALLED_SYSTEMIMAGE_TARGET) \ $(INSTALLED_RAMDISK_TARGET) \ $(INSTALLED_BOOTIMAGE_TARGET) \ + $(INSTALLED_DEBUG_RAMDISK_TARGET) \ + $(INSTALLED_DEBUG_BOOTIMAGE_TARGET) \ $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_VBMETAIMAGE_TARGET) \ $(INSTALLED_USERDATAIMAGE_TARGET) \ @@ -1511,6 +1519,8 @@ droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \ $(INSTALLED_FILES_JSON_SYSTEMOTHER) \ $(INSTALLED_FILES_FILE_RAMDISK) \ $(INSTALLED_FILES_JSON_RAMDISK) \ + $(INSTALLED_FILES_FILE_DEBUG_RAMDISK) \ + $(INSTALLED_FILES_JSON_DEBUG_RAMDISK) \ $(INSTALLED_FILES_FILE_ROOT) \ $(INSTALLED_FILES_JSON_ROOT) \ $(INSTALLED_FILES_FILE_RECOVERY) \ @@ -1631,6 +1641,10 @@ else # TARGET_BUILD_APPS $(call dist-for-goals, droidcore, \ $(INSTALLED_FILES_FILE_RAMDISK) \ $(INSTALLED_FILES_JSON_RAMDISK) \ + $(INSTALLED_FILES_FILE_DEBUG_RAMDISK) \ + $(INSTALLED_FILES_JSON_DEBUG_RAMDISK) \ + $(INSTALLED_DEBUG_RAMDISK_TARGET) \ + $(INSTALLED_DEBUG_BOOTIMAGE_TARGET) \ ) endif