From 80f63ee9d1e5e6e3666c5dbfe84140d3f1df4ab6 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Thu, 11 Jun 2020 13:03:18 +0200 Subject: [PATCH] Add build support for XZ ramdisks Co-authored-by: Arne Coucheron Change-Id: I61530b6da06e0038970551aa4d12bce02007ae3c --- core/Makefile | 22 ++++++++++++++++++++-- tools/releasetools/common.py | 16 ++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/core/Makefile b/core/Makefile index 7122a7e626..2b0e65d4f0 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1267,6 +1267,21 @@ boototapackage_16k: $(BUILT_BOOT_OTA_PACKAGE_16K) endif +ifeq ($(BOARD_RAMDISK_USE_LZ4),true) +# -l enables the legacy format used by the Linux kernel +COMPRESSION_COMMAND_DEPS := $(LZ4) +COMPRESSION_COMMAND := $(LZ4) -l -12 --favor-decSpeed +RAMDISK_EXT := .lz4 +else ifeq ($(BOARD_RAMDISK_USE_XZ),true) +COMPRESSION_COMMAND_DEPS := $(XZ) +COMPRESSION_COMMAND := $(XZ) -f -c --check=crc32 --lzma2=dict=32MiB +RAMDISK_EXT := .xz +else +COMPRESSION_COMMAND_DEPS := $(GZIP) +COMPRESSION_COMMAND := $(GZIP) +RAMDISK_EXT := .gz +endif + # The value of RAMDISK_NODE_LIST is defined in system/core/rootdir/Android.bp. # This file contains /dev nodes description added to the generic ramdisk @@ -2658,7 +2673,7 @@ endif ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_USES_RECOVERY_AS_BOOT) \ $(BOARD_INCLUDE_RECOVERY_DTBO) $(BOARD_INCLUDE_RECOVERY_ACPIO) \ - $(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT) $(BOARD_RAMDISK_USE_LZ4))) + $(BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT) $(BOARD_RAMDISK_USE_LZ4) $(BOARD_RAMDISK_USE_XZ))) # Named '.dat' so we don't attempt to use imgdiff for patching it. RECOVERY_RESOURCE_ZIP := $(TARGET_OUT_VENDOR)/etc/recovery-resource.dat ALL_DEFAULT_INSTALLED_MODULES += $(RECOVERY_RESOURCE_ZIP) @@ -3615,7 +3630,7 @@ ifneq ($(INSTALLED_BOOTIMAGE_TARGET),) ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) ifneq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) ifneq (,$(filter true,$(BOARD_INCLUDE_RECOVERY_DTBO) $(BOARD_INCLUDE_RECOVERY_ACPIO) \ - $(BOARD_RAMDISK_USE_LZ4))) + $(BOARD_RAMDISK_USE_LZ4) $(BOARD_RAMDISK_USE_XZ))) diff_tool := $(HOST_OUT_EXECUTABLES)/bsdiff else diff_tool := $(HOST_OUT_EXECUTABLES)/imgdiff @@ -5902,6 +5917,9 @@ endif ifeq ($(BOARD_RAMDISK_USE_LZ4),true) echo "lz4_ramdisks=true" >> $@ endif +ifeq ($(BOARD_RAMDISK_USE_XZ),true) + echo "xz_ramdisks=true" >> $@ +endif ifneq ($(INSTALLED_VENDOR_BOOTIMAGE_TARGET),) echo "vendor_boot=true" >> $@ echo "vendor_boot_size=$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)" >> $@ diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index dd24288f25..a5f88f05c2 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -832,11 +832,14 @@ def ExtractFromInputFile(input_file, fn): class RamdiskFormat(object): LZ4 = 1 GZ = 2 + XZ = 3 def GetRamdiskFormat(info_dict): if info_dict.get('lz4_ramdisks') == 'true': ramdisk_format = RamdiskFormat.LZ4 + elif info_dict.get('xz_ramdisks') == 'true': + ramdisk_format = RamdiskFormat.XZ else: ramdisk_format = RamdiskFormat.GZ return ramdisk_format @@ -1694,10 +1697,13 @@ def _MakeRamdisk(sourcedir, fs_config_file=None, if ramdisk_format == RamdiskFormat.LZ4: p2 = Run(["lz4", "-l", "-12", "--favor-decSpeed"], stdin=p1.stdout, stdout=ramdisk_img.file.fileno()) + elif ramdisk_format == RamdiskFormat.XZ: + p2 = Run(["xz", "-f", "-c", "--check=crc32", "--lzma2=dict=32MiB"], stdin=p1.stdout, + stdout=ramdisk_img.file.fileno()) elif ramdisk_format == RamdiskFormat.GZ: p2 = Run(["gzip"], stdin=p1.stdout, stdout=ramdisk_img.file.fileno()) else: - raise ValueError("Only support lz4 or gzip ramdisk format.") + raise ValueError("Only support lz4, xz, or gzip ramdisk format.") p2.wait() p1.wait() @@ -4164,8 +4170,14 @@ def GetBootImageBuildProp(boot_img, ramdisk_format=RamdiskFormat.LZ4): p2 = Run(['gzip', '-d'], stdin=input_stream.fileno(), stdout=output_stream.fileno()) p2.wait() + elif ramdisk_format == RamdiskFormat.XZ: + with open(ramdisk, 'rb') as input_stream: + with open(uncompressed_ramdisk, 'wb') as output_stream: + p2 = Run(['xz', '-d'], stdin=input_stream.fileno(), + stdout=output_stream.fileno()) + p2.wait() else: - logger.error('Only support lz4 or gzip ramdisk format.') + logger.error('Only support lz4, xz, or gzip ramdisk format.') return None abs_uncompressed_ramdisk = os.path.abspath(uncompressed_ramdisk)