From 94ad5bb5efbb509751a41087af0ea41c3e349f08 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 4 Mar 2022 10:57:58 -0800 Subject: [PATCH] build_image: Remove mkerofsimage.sh. These wrapper scripts are difficult to maintain and there's not really any value add. The argument strings don't match and every new build flag has to be connected in an extra place. Bug: 222715577 Test: make with EROFS enabled Change-Id: Ie0e51cc30aa08b004d5d8345a2a2d885e193ffa9 --- core/Makefile | 3 +- core/config.mk | 1 - tools/releasetools/Android.bp | 4 +- tools/releasetools/build_image.py | 74 +++++++++++++++++++++---------- 4 files changed, 54 insertions(+), 28 deletions(-) diff --git a/core/Makefile b/core/Makefile index f7b55e6a65..b8fdf45641 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1691,7 +1691,7 @@ ifneq ($(filter \ $(BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE) \ $(BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE) \ ,erofs),) -INTERNAL_USERIMAGES_DEPS += $(MKEROFSUSERIMG) +INTERNAL_USERIMAGES_DEPS += $(MKEROFS) BOARD_EROFS_COMPRESSOR ?= "lz4hc,9" endif @@ -4657,7 +4657,6 @@ INTERNAL_OTATOOLS_MODULES := \ mke2fs \ mke2fs.conf \ mkfs.erofs \ - mkerofsimage.sh \ mkf2fsuserimg.sh \ mksquashfs \ mksquashfsimage.sh \ diff --git a/core/config.mk b/core/config.mk index 21ab707cfa..935bdb84de 100644 --- a/core/config.mk +++ b/core/config.mk @@ -598,7 +598,6 @@ FS_GET_STATS := $(HOST_OUT_EXECUTABLES)/fs_get_stats$(HOST_EXECUTABLE_SUFFIX) MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg_mke2fs MKE2FS_CONF := system/extras/ext4_utils/mke2fs.conf MKEROFS := $(HOST_OUT_EXECUTABLES)/mkfs.erofs -MKEROFSUSERIMG := $(HOST_OUT_EXECUTABLES)/mkerofsimage.sh MKSQUASHFSUSERIMG := $(HOST_OUT_EXECUTABLES)/mksquashfsimage.sh MKF2FSUSERIMG := $(HOST_OUT_EXECUTABLES)/mkf2fsuserimg.sh SIMG2IMG := $(HOST_OUT_EXECUTABLES)/simg2img$(HOST_EXECUTABLE_SUFFIX) diff --git a/tools/releasetools/Android.bp b/tools/releasetools/Android.bp index 25483f3838..90adcaa9e5 100644 --- a/tools/releasetools/Android.bp +++ b/tools/releasetools/Android.bp @@ -56,7 +56,9 @@ python_defaults { required: [ "blk_alloc_to_base_fs", "e2fsck", - "mkerofsimage.sh", + "fsck.erofs", + "img2simg", + "mkfs.erofs", "mkuserimg_mke2fs", "simg2img", "tune2fs", diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index dbd2c6f201..e33b5815cb 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -268,18 +268,19 @@ def BuildImageMkfs(in_dir, prop_dict, out_file, target_out, fs_config): """ build_command = [] fs_type = prop_dict.get("fs_type", "") - run_e2fsck = False + run_fsck = None needs_projid = prop_dict.get("needs_projid", 0) needs_casefold = prop_dict.get("needs_casefold", 0) needs_compress = prop_dict.get("needs_compress", 0) disable_sparse = "disable_sparse" in prop_dict + manual_sparse = False if fs_type.startswith("ext"): build_command = [prop_dict["ext_mkuserimg"]] if "extfs_sparse_flag" in prop_dict and not disable_sparse: build_command.append(prop_dict["extfs_sparse_flag"]) - run_e2fsck = True + run_e2fsck = RunE2fsck build_command.extend([in_dir, out_file, fs_type, prop_dict["mount_point"]]) build_command.append(prop_dict["image_size"]) @@ -320,17 +321,8 @@ def BuildImageMkfs(in_dir, prop_dict, out_file, target_out, fs_config): if "selinux_fc" in prop_dict: build_command.append(prop_dict["selinux_fc"]) elif fs_type.startswith("erofs"): - build_command = ["mkerofsimage.sh"] - build_command.extend([in_dir, out_file]) - if "erofs_sparse_flag" in prop_dict and not disable_sparse: - build_command.extend([prop_dict["erofs_sparse_flag"]]) - build_command.extend(["-m", prop_dict["mount_point"]]) - if target_out: - build_command.extend(["-d", target_out]) - if fs_config: - build_command.extend(["-C", fs_config]) - if "selinux_fc" in prop_dict: - build_command.extend(["-c", prop_dict["selinux_fc"]]) + build_command = ["mkfs.erofs"] + compressor = None if "erofs_default_compressor" in prop_dict: compressor = prop_dict["erofs_default_compressor"] @@ -338,16 +330,30 @@ def BuildImageMkfs(in_dir, prop_dict, out_file, target_out, fs_config): compressor = prop_dict["erofs_compressor"] if compressor: build_command.extend(["-z", compressor]) + + build_command.extend(["--mount-point", prop_dict["mount_point"]]) + if target_out: + build_command.extend(["--product-out", target_out]) + if fs_config: + build_command.extend(["--fs-config-file", fs_config]) + if "selinux_fc" in prop_dict: + build_command.extend(["--file-contexts", prop_dict["selinux_fc"]]) if "timestamp" in prop_dict: build_command.extend(["-T", str(prop_dict["timestamp"])]) if "uuid" in prop_dict: build_command.extend(["-U", prop_dict["uuid"]]) if "block_list" in prop_dict: - build_command.extend(["-B", prop_dict["block_list"]]) + build_command.extend(["--block-list-file", prop_dict["block_list"]]) if "erofs_pcluster_size" in prop_dict: - build_command.extend(["-P", prop_dict["erofs_pcluster_size"]]) + build_command.extend(["-C", prop_dict["erofs_pcluster_size"]]) if "erofs_share_dup_blocks" in prop_dict: - build_command.extend(["-k", "4096"]) + build_command.extend(["--chunksize", "4096"]) + + build_command.extend([out_file, in_dir]) + if "erofs_sparse_flag" in prop_dict and not disable_sparse: + manual_sparse = True + + run_fsck = RunErofsFsck elif fs_type.startswith("squash"): build_command = ["mksquashfsimage.sh"] build_command.extend([in_dir, out_file]) @@ -436,18 +442,38 @@ def BuildImageMkfs(in_dir, prop_dict, out_file, target_out, fs_config): int(prop_dict["partition_size"]) // BYTES_IN_MB)) raise - if run_e2fsck and prop_dict.get("skip_fsck") != "true": - unsparse_image = UnsparseImage(out_file, replace=False) + if run_fsck and prop_dict.get("skip_fsck") != "true": + run_fsck(out_file) - # Run e2fsck on the inflated image file - e2fsck_command = ["e2fsck", "-f", "-n", unsparse_image] - try: - common.RunAndCheckOutput(e2fsck_command) - finally: - os.remove(unsparse_image) + if manual_sparse: + temp_file = out_file + ".sparse" + img2simg_argv = ["img2simg", out_file, temp_file] + common.RunAndCheckOutput(img2simg_argv) + os.rename(temp_file, out_file) return mkfs_output + +def RunE2fsck(out_file): + unsparse_image = UnsparseImage(out_file, replace=False) + + # Run e2fsck on the inflated image file + e2fsck_command = ["e2fsck", "-f", "-n", unsparse_image] + try: + common.RunAndCheckOutput(e2fsck_command) + finally: + os.remove(unsparse_image) + + +def RunErofsFsck(out_file): + fsck_command = ["fsck.erofs", "--extract", out_file] + try: + common.RunAndCheckOutput(fsck_command) + except: + print("Check failed for EROFS image {}".format(out_file)) + raise + + def BuildImage(in_dir, prop_dict, out_file, target_out=None): """Builds an image for the files under in_dir and writes it to out_file.