Android P环境,mkfs.erofs is required firstly. Let’s build vendor.img with erofs format.
build process for vendor with ext4 看下vendor image with ext4过程:
core/main.mk:1111:vendorimage: $(INSTALLED_VENDORIMAGE_TARGET) 
 
INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET)  $(INSTALLED_VENDORIMAGE_TARGET) : $(INTERNAL_USERIMAGES_DEPS)  $(INTERNAL_VENDORIMAGE_FILES)  $(INSTALLED_FILES_FILE_VENDOR)  $(BUILD_IMAGE_SRCS)  $(DEPMOD)  $(BOARD_VENDOR_KERNEL_MODULES)         $(build-vendorimage-target) 
 
BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT) /vendor.img define  build-vendorimage-target  $(call  pretty,"Target vendor fs image: $(INSTALLED_VENDORIMAGE_TARGET) ")    @mkdir -p $(TARGET_OUT_VENDOR)    @mkdir -p $(vendorimage_intermediates)  && rm -rf $(vendorimage_intermediates) /vendor_image_info.txt   $(call  generate-userimage-prop-dictionary, $(vendorimage_intermediates) /vendor_image_info.txt, skip_fsck=true)    $(if  $(BOARD_VENDOR_KERNEL_MODULES) , \      $(call  build-image-kernel-modules,$(BOARD_VENDOR_KERNEL_MODULES) ,$(TARGET_OUT_VENDOR) ,vendor/,$(call  intermediates-dir -for,PACKAGING,depmod_vendor) ))  $(hide)  PATH=$(foreach  p,$(INTERNAL_USERIMAGES_BINARY_PATHS) ,$(p) :) $$PATH \       build/make/tools/releasetools/build_image.py \       $(TARGET_OUT_VENDOR)  $(vendorimage_intermediates) /vendor_image_info.txt $(INSTALLED_VENDORIMAGE_TARGET)  $(TARGET_OUT)    $(hide)  $(call  assert-max-image-size,$(INSTALLED_VENDORIMAGE_TARGET) ,$(BOARD_VENDORIMAGE_PARTITION_SIZE) )  endef 
 
制作img的工具:
ifeq  ($(INTERNAL_USERIMAGES_USE_EXT) ,true)INTERNAL_USERIMAGES_DEPS := $(SIMG2IMG)  INTERNAL_USERIMAGES_DEPS += $(MKEXTUSERIMG)  $(MAKE_EXT4FS)  $(E2FSCK)  ifeq  ($(TARGET_USERIMAGES_USE_F2FS) ,true)INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG)  $(MAKE_F2FS)  endif endif 
 
工具定义:
./core/config.mk:668:MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg_mke2fs.sh 
 
用build/make/tools/releasetools/build_image.py去生成:
def  BuildImage (in_dir, prop_dict, out_file, target_out=None  ):  """Build an image to out_file from in_dir with property prop_dict.  
 
  if  image_filename == "system.img" :     mount_point = "system"    elif  image_filename == "system_other.img" :     mount_point = "system_other"    elif  image_filename == "userdata.img" :     mount_point = "data"    elif  image_filename == "cache.img" :     mount_point = "cache"    elif  image_filename == "vendor.img" :     mount_point = "vendor"    elif  image_filename == "oem.img" :     mount_point = "oem"    elif  image_filename == "product.img" :     mount_point = "product"    else :     print ("error: unknown image file name " , image_filename, file=sys.stderr)     sys.exit(1 )   image_properties = ImagePropFromGlobalDict(glob_dict, mount_point) if  not  BuildImage(in_dir, image_properties, out_file, target_out):
 
ok,下来就可以添加了。
add support for erofs image @@ -1095,6 +1095,11 @@ ifneq  ($(filter  $(BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE)  $(BOARD_VENDORIMAGE_FILE_   INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS)  $(MKSQUASHFSUSERIMG)  $(IMG2SIMG)   endif +INTERNAL_USERIMAGES_SPARSE_EROFS_FLAG := -s +ifneq ($(filter  $(BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE)  $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)  $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE) ,erofs) ,)+INTERNAL_USERIMAGES_DEPS += $(MAKE_EROFS)  $(MKEROFSUSERIMG)  $(IMG2SIMG)  +endif  +  INTERNAL_USERIMAGES_BINARY_PATHS := $(sort  $(dir  $(INTERNAL_USERIMAGES_DEPS) ) )  ifeq  (true,$(PRODUCTS.$(INTERNAL_PRODUCT) .PRODUCT_SUPPORTS_VERITY)) @@ -1162,6 +1167,7 @@ $(if  $(BOARD_OEMIMAGE_EXTFS_INODE_COUNT) ,$(hide)  echo "oem_extfs_inode_count=$(B   $(if  $(BOARD_OEMIMAGE_EXTFS_RSV_PCT) ,$(hide)  echo "oem_extfs_rsv_pct=$(BOARD_OEMIMAGE_EXTFS_RSV_PCT) " >> $(1) ) $(if  $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG) ,$(hide)  echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG) " >> $(1) )  $(if  $(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG) ,$(hide)  echo "squashfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG) " >> $(1) ) +$(if  $(INTERNAL_USERIMAGES_SPARSE_EROFS_FLAG) ,$(hide)  echo "erofs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EROFS_FLAG) " >> $(1) ) 
 
build/make/core/config.mk:
 MKF2FSUSERIMG := $(HOST_OUT_EXECUTABLES) /mkf2fsuserimg.sh +MAKE_EROFS := $(HOST_OUT_EXECUTABLES) /mkfs.erofs +MKEROFSUSERIMG := $(HOST_OUT_EXECUTABLES) /mkerofsimage.sh  SIMG2IMG := $(HOST_OUT_EXECUTABLES) /simg2img$(HOST_EXECUTABLE_SUFFIX)  
 
build/make/tools/releasetools/build_image.py:
@@ -597 ,6  +597 ,20  @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None  ):      if  "timestamp"  in  prop_dict:        build_command.extend(["-T" , str (prop_dict["timestamp" ])])      build_command.extend(["-L" , prop_dict["mount_point" ]]) +  elif  fs_type.startswith("erofs" ): +    build_command = ["mkerofsimage.sh" ] +    build_command.extend([in_dir, out_file]) +    if  "erofs_sparse_flag"  in  prop_dict: +      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" ]]) +    if  "erofs_compressor"  in  prop_dict: +      build_command.extend(["-z" , prop_dict["erofs_compressor" ]])    else :      print ("Error: unknown filesystem type '%s'"  % (fs_type))      return  False  @@ -704 ,6  +718 ,7  @@ def ImagePropFromGlobalDict(glob_dict, mount_point ):    common_props = (        "extfs_sparse_flag" ,        "squashfs_sparse_flag" , +      "erofs_sparse_flag" ,        "selinux_fc" , 
 
system/extras添加erofs_utils:
tj@ubuntu:~/work/code/system/extras/erofs_utils$ ls  Android.mk  mkerofsimage.sh  mkfs.erofs 
 
mkerofsimage.sh主要参考ext4,squashfs:
MAKE_EROFS_CMD="mkfs.erofs $OUTPUT_FILE  $SRC_DIR /"  echo  $MAKE_EROFS_CMD $MAKE_EROFS_CMD SPARSE_SUFFIX=".sparse"  if  [ "$SPARSE "  = true  ]; then     img2simg $OUTPUT_FILE  $OUTPUT_FILE$SPARSE_SUFFIX      if  [ $? -ne 0 ]; then          exit  4     fi      mv  $OUTPUT_FILE$SPARSE_SUFFIX  $OUTPUT_FILE  fi 
 
项目启用BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE为erofs, build is ok:
[ 99% 7719/7720] Installed file list: out/.../installed-files-vendor.txt [100% 7720/7720] Target vendor fs image: out/.../vendor.img ... mkfs.erofs out/.../vendor.img out/.../vendor/   c_version:           [0.1   Jul  9 2019 03:24:50]   c_img_path:          [out/.../vendor.img]   c_src_path:          [out/.../vendor]   c_dbg_lvl:           [       0]   c_dry_run:           [       0]   c_alg_name:          [    none]   c_compr_maxsz:       [  921600]   c_compr_lvl:         [       0]   c_compr_boundary:    [     128]   c_compr_ratio_limit: [     100] 
 
QCOM P vendor mount移到了dts下,ext4改为erofs后可以mount ok。
[   11.566421 ] erofs: mounted on /dev/block/platform/soc/7824900. sdhci/by-name/vendor with ... [   11.569767 ] init: [libfs_mgr]__mount(source=/dev/block/platform/soc/7824900. sdhci/by-name/vendor,target=/vendor,type=erofs)=0 : Success 
 
权限问题,待check。
ps: squashfs也是只读文件系统,提个patch给维护人Phillip,半天不回,算了,懒得看了。。。
mkerofsimage.sh参考实现:
#!/bin/bash function  usage  () {cat <<EOT Usage: ${0##*/} SRC_DIR OUTPUT_FILE [-s] [-m MOUNT_POINT] [-d PRODUCT_OUT] [-C FS_CONFIG ] [-c FILE_CONTEXTS] [-z COMPRESSOR] EOT } echo  "in mkerofsimage.sh PATH=$PATH " if  [ $#  -lt 2 ]; then     usage     exit  1 fi SRC_DIR=$1  if  [ ! -d $SRC_DIR  ]; then   echo  "Can not find directory $SRC_DIR !"    exit  2 fi OUTPUT_FILE=$2  shift ; shift SPARSE=false  if  [[ "$1 "  == "-s"  ]]; then     SPARSE=true      shift ; fi MOUNT_POINT= if  [[ "$1 "  == "-m"  ]]; then     MOUNT_POINT=$2      shift ; shift  fi PRODUCT_OUT= if  [[ "$1 "  == "-d"  ]]; then     PRODUCT_OUT=$2      shift ; shift  fi FS_CONFIG= if  [[ "$1 "  == "-C"  ]]; then     FS_CONFIG=$2      shift ; shift  fi FILE_CONTEXTS= if  [[ "$1 "  == "-c"  ]]; then     FILE_CONTEXTS=$2      shift ; shift  fi COMPRESSOR="lz4"  COMPRESSOR_OPT="-Xhc"  if  [[ "$1 "  == "-z"  ]]; then     COMPRESSOR=$2      COMPRESSOR_OPT=     shift ; shift  fi OPT=""  if  [ -n "$MOUNT_POINT "  ]; then   OPT="$OPT  -mount-point $MOUNT_POINT "  fi if  [ -n "$PRODUCT_OUT "  ]; then   OPT="$OPT  -product-out $PRODUCT_OUT "  fi if  [ -n "$FS_CONFIG "  ]; then   OPT="$OPT  -fs-config-file $FS_CONFIG "  fi if  [ -n "$FILE_CONTEXTS "  ]; then   OPT="$OPT  -context-file $FILE_CONTEXTS "  fi MAKE_EROFS_CMD="mkfs.erofs $OUTPUT_FILE  $SRC_DIR /"  echo  $MAKE_EROFS_CMD $MAKE_EROFS_CMD if  [ $? -ne 0 ]; then     exit  4 fi SPARSE_SUFFIX=".sparse"  if  [ "$SPARSE "  = true  ]; then     img2simg $OUTPUT_FILE  $OUTPUT_FILE$SPARSE_SUFFIX      if  [ $? -ne 0 ]; then          exit  4     fi      mv  $OUTPUT_FILE$SPARSE_SUFFIX  $OUTPUT_FILE  fi 
版权声明: 本站所有文章均采用 CC BY-NC-SA 4.0 CN  许可协议。转载请注明原文链接!