RK3568 新增分区

android 11

Posted by LXG on October 29, 2025

编译时生成parameter.txt

编译模板文件


rk3568_android_11$ cat device/rockchip/common/scripts/parameter_tools/parameter.in 
FIRMWARE_VER: ${_firmware_version}
MACHINE_MODEL: ${_machine_model}
MACHINE_ID: ${_machine_id}
MANUFACTURER: ${_manufacturer}
MAGIC: ${_magic}
ATAG: ${_atag}
MACHINE: ${_machine}
CHECK_MASK: ${_check_mask}
PWR_HLD: ${_pwr_hld}
TYPE: ${_type}
CMDLINE:mtdparts=rk29xxnand:${_partition_list}

编译后生成的文件


rk3568_android_11$ cat ./out/target/product/rk3568_r/parameter.txt
FIRMWARE_VER: 11.0
MACHINE_MODEL: K5SAM
MACHINE_ID: 007
MANUFACTURER: WIF
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: rk3568_r
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00002000(security),0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtbo),0x00000800@0x0000c000(vbmeta),0x00014000@0x0000c800(boot),0x00037000@0x00020800(recovery),0x000c0000@0x00057800(backup),0x000c0000@0x00117800(cache),0x00008000@0x001d7800(metadata),0x00000800@0x001df800(baseparameter),0x00614000@0x001e0000(super),-@0x007f4000(userdata:grow)

新增分区

RK3568 Anroid12新增自定义分区

cache.img编译路径, 可参考此路径新增分区


┌─────────────────────────────────────────────┐
 device/<vendor>/<board>/BoardConfig.mk      
 - BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE=ext4    
 - BOARD_CACHEIMAGE_PARTITION_SIZE=52428800  
 - BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE=ext4  
 - BOARD_PRIVATEIMAGE_PARTITION_SIZE=52428800
└───────────────┬─────────────────────────────┘
                
                
┌─────────────────────────────────────────────┐
 build/make/core/board_config.mk             
 - 读取 BoardConfig.mk                        
 - 设置 BUILDING_CACHE_IMAGE=true/false       
 - 设置 BUILDING_PRIVATE_IMAGE=true/false     
 - .KATI_READONLY 锁定只读变量                
└───────────────┬─────────────────────────────┘
                
                
┌─────────────────────────────────────────────┐
 build/make/core/product.mk                   
 - 定义 PRODUCT_BUILD_CACHE_IMAGE             
 - 定义 PRODUCT_BUILD_PRIVATE_IMAGE           
 - _product_single_value_vars += PRODUCT_...  
   确保每个产品只构建一次分区镜像             
└───────────────┬─────────────────────────────┘
                
                
┌─────────────────────────────────────────────┐
 build/make/core/Makefile                     
 - INTERNAL_CACHEIMAGE_FILES                  
   = $(filter $(TARGET_OUT_CACHE)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
 - INTERNAL_PRIVATEIMAGE_FILES                
   = $(filter $(TARGET_OUT_PRIVATE)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
 - INSTALLED_CACHEIMAGE_TARGET = out/target/product/<device>/cache.img
 - INSTALLED_PRIVATEIMAGE_TARGET = out/target/product/<device>/private.img
 - 定义 build-cacheimage-target / build-privateimage-target
   - mkdir -p 临时目录                         
   - 生成 *_image_info.txt                     
   - 调用 build_image 脚本打包 ext4/f2fs      
   - assert-max-image-size 校验大小           
└───────────────┬─────────────────────────────┘
                
                
┌─────────────────────────────────────────────┐
 build/make/tools/releasetools/build_image.py 
 - 读取 cache_image_info.txt / private_image_info.txt
 - 遍历 INTERNAL_*_FILES 列表                 
   - 设置权限和 selinux context               
   - 复制文件到临时打包目录                   
 - 按指定文件系统打包为 ext4 / f2fs          
 - 输出最终镜像到 $(PRODUCT_OUT)/<name>.img  
└───────────────┬─────────────────────────────┘
                
                
┌─────────────────────────────────────────────┐
 out/target/product/<device>/                
 - cache.img                                 
 - private.img                               
 - 中间目录: obj/PACKAGING/cache/ / private/ 
 - *_image_info.txt                           
└─────────────────────────────────────────────┘

build/make/core/Makefile


define generate-image-prop-dictionary
# lixiaogang add start
$(if $(filter $(2),private),\
    $(if $(BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "private_fs_type=$(BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
    $(if $(BOARD_PRIVATEIMAGE_PARTITION_SIZE),$(hide) echo "private_size=$(BOARD_PRIVATEIMAGE_PARTITION_SIZE)" >> $(1))
    $(hide) echo "private_selinux_fc=$(SELINUX_FC)" >> $(1)
)
# lixiaogang add end

# lixiaogang add start
ifdef BUILDING_PRIVATE_IMAGE
  PROP_DICTIONARY_IMAGES += private
endif
# lixiaogang add end

# 得到需要打包进 private 分区的文件列表
# lixiaogang add start
# -----------------------------------------------------------------
# private partition image
ifdef BUILDING_PRIVATE_IMAGE
INTERNAL_PRIVATEIMAGE_FILES := \
    $(filter $(TARGET_OUT_PRIVATE)/%,$(ALL_DEFAULT_INSTALLED_MODULES))

privateimage_intermediates := \
    $(call intermediates-dir-for,PACKAGING,private)
BUILT_PRIVATEIMAGE_TARGET := $(PRODUCT_OUT)/private.img

# 构建 private 镜像的函数

define build-privateimage-target
  $(call pretty,"Target private fs image: $(INSTALLED_PRIVATEIMAGE_TARGET)")
  # 创建 private 分区输出目录

  @mkdir -p $(TARGET_OUT_PRIVATE)
  @mkdir -p $(privateimage_intermediates) && rm -rf $(privateimage_intermediates)/private_image_info.txt
  $(call generate-image-prop-dictionary, $(privateimage_intermediates)/private_image_info.txt,private,skip_fsck=true)
  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
      $(BUILD_IMAGE) \
          $(TARGET_OUT_PRIVATE) $(privateimage_intermediates)/private_image_info.txt \
          $(INSTALLED_PRIVATEIMAGE_TARGET) $(TARGET_OUT)
  # 检查生成的 private.img 是否超过分区大小,防止写入失败

  $(call assert-max-image-size,$(INSTALLED_PRIVATEIMAGE_TARGET),$(BOARD_PRIVATEIMAGE_PARTITION_SIZE))
endef

# 执行 build-privateimage-target 函数生成镜像
# We just build this directly to the install location.
INSTALLED_PRIVATEIMAGE_TARGET := $(BUILT_PRIVATEIMAGE_TARGET)
$(INSTALLED_PRIVATEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_PRIVATEIMAGE_FILES)
    $(build-privateimage-target)

.PHONY: privateimage-nodeps
privateimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
    $(build-privateimage-target)

else # BUILDING_PRIVATE_IMAGE
# we need to ignore the broken private link when doing the rsync
IGNORE_PRIVATE_LINK := --exclude=private
endif
# lixiaogang add end

# lixiaogang add INSTALLED_PRIVATEIMAGE_TARGET
# Depending on the various images guarantees that the underlying
# directories are up-to-date.
$(BUILT_TARGET_FILES_PACKAGE): \
	    $(INSTALLED_RAMDISK_TARGET) \
	    $(INSTALLED_BOOTIMAGE_TARGET) \
	    $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \
	    $(INSTALLED_RADIOIMAGE_TARGET) \
	    $(INSTALLED_RECOVERYIMAGE_TARGET) \
	    $(INSTALLED_USERDATAIMAGE_TARGET) \
	    $(INSTALLED_CACHEIMAGE_TARGET) \
	    $(INSTALLED_PRIVATEIMAGE_TARGET) \

build/make/core/board_config.mk


# _board_strip_readonly_list 是 Android build 系统用来清理只读变量的列表
# 将 private 分区相关变量加入列表,防止被其他 makefile 覆盖
# lixiaogang add BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE BOARD_PRIVATEIMAGE_PARTITION_SIZE
# File system variables
_board_strip_readonly_list += \
  BOARD_FLASH_BLOCK_SIZE \
  BOARD_BOOTIMAGE_PARTITION_SIZE \
  BOARD_RECOVERYIMAGE_PARTITION_SIZE \
  BOARD_SYSTEMIMAGE_PARTITION_SIZE \
  BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE \
  BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE \
  BOARD_USERDATAIMAGE_PARTITION_SIZE \
  BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE \
  BOARD_CACHEIMAGE_PARTITION_SIZE \
  BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE \
  BOARD_PRIVATEIMAGE_PARTITION_SIZE \
  BOARD_VENDORIMAGE_PARTITION_SIZE \
  BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE \
  BOARD_PRODUCTIMAGE_PARTITION_SIZE \
  BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE \
  BOARD_SYSTEM_EXTIMAGE_PARTITION_SIZE \
  BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE \
  BOARD_ODMIMAGE_PARTITION_SIZE \
  BOARD_ODMIMAGE_FILE_SYSTEM_TYPE \

# 判断是否需要构建 private 分区镜像  
# lixiaogang add start
# Are we building a private image
BUILDING_PRIVATE_IMAGE :=
ifeq ($(PRODUCT_BUILD_PRIVATE_IMAGE),)
  # 只要 BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE 定义了,就默认构建 private 镜像
  ifdef BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE
    BUILDING_PRIVATE_IMAGE := true
  endif
# 如果 PRODUCT_BUILD_PRIVATE_IMAGE 显式设置为 true
else ifeq ($(PRODUCT_BUILD_PRIVATE_IMAGE),true)
  BUILDING_PRIVATE_IMAGE := true
  ifndef BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE
    $(error PRODUCT_BUILD_PRIVATE_IMAGE set to true, but BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE not defined)
  endif
endif
.KATI_READONLY := BUILDING_PRIVATE_IMAGE
# lixiaogang add end

build/make/core/config.mk


# lixiaogang add privateimage-nodeps
# These goals don't need to collect and include Android.mks/CleanSpec.mks
# in the source tree.
# dont_bother_goals 列表中的目标在构建时不需要收集和包含
# Android.mks / CleanSpec.mks 文件(即不需要完整依赖树)
# 这些目标通常是“nodeps”类型,主要用于快速构建或增量构建
dont_bother_goals := out \
    snod systemimage-nodeps \
    userdataimage-nodeps \
    cacheimage-nodeps \
    bptimage-nodeps \
    vnod vendorimage-nodeps \
    pnod productimage-nodeps \
    senod systemextimage-nodeps \
    onod odmimage-nodeps \
    systemotherimage-nodeps \
    ramdisk-nodeps \
    ramdisk_debug-nodeps \
    ramdisk_test_harness-nodeps \
    bootimage-nodeps \
    bootimage_debug-nodeps \
    bootimage_test_harness-nodeps \
    recoveryimage-nodeps \
    vbmetaimage-nodeps \
    product-graph dump-products \
    privateimage-nodeps

build/make/core/envsetup.mk


# 定义 private 分区的输出目录
# $(PRODUCT_OUT) 是当前产品的输出根目录(如 out/target/product/<device>)
# TARGET_OUT_PRIVATE 指向 private 分区的输出目录
# lixiaogang add start
TARGET_OUT_PRIVATE := $(PRODUCT_OUT)/private
.KATI_READONLY := TARGET_OUT_PRIVATE
# lixiaogang add end

build/make/core/main.mk


# droidcore 目标是 Android 编译系统的核心打包目标
# 它会构建各类分区镜像并打包到最终的 ROM 格式中
# lixiaogang add INSTALLED_PRIVATEIMAGE_TARGET
# Build files and then package it into the rom formats
.PHONY: droidcore
droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
    $(INSTALLED_SYSTEMIMAGE_TARGET) \
    $(INSTALLED_RAMDISK_TARGET) \
    $(INSTALLED_BOOTIMAGE_TARGET) \
    $(INSTALLED_RADIOIMAGE_TARGET) \
    $(INSTALLED_DEBUG_RAMDISK_TARGET) \
    $(INSTALLED_DEBUG_BOOTIMAGE_TARGET) \
    $(INSTALLED_RECOVERYIMAGE_TARGET) \
    $(INSTALLED_VBMETAIMAGE_TARGET) \
    $(INSTALLED_USERDATAIMAGE_TARGET) \
    $(INSTALLED_CACHEIMAGE_TARGET) \
    $(INSTALLED_PRIVATEIMAGE_TARGET) \

# 定义单独构建 privateimage 的伪目标
# 方便在不构建整个 droidcore 时单独生成 private.img
# lixiaogang add start
.PHONY: privateimage
privateimage: $(INSTALLED_PRIVATEIMAGE_TARGET)
# lixiaogang add end

build/make/core/product.mk


# _product_single_value_vars 列表用于记录“单值变量”,
# 即每个产品只会有一个值,不允许在 product makefile 中被覆盖。
# 这些变量控制当前产品是否构建对应分区的镜像。
# lixiaogang add PRODUCT_BUILD_PRIVATE_IMAGE
# Controls for whether different partitions are built for the current product.
_product_single_value_vars += PRODUCT_BUILD_SYSTEM_IMAGE
_product_single_value_vars += PRODUCT_BUILD_SYSTEM_OTHER_IMAGE
_product_single_value_vars += PRODUCT_BUILD_VENDOR_IMAGE
_product_single_value_vars += PRODUCT_BUILD_PRODUCT_IMAGE
_product_single_value_vars += PRODUCT_BUILD_SYSTEM_EXT_IMAGE
_product_single_value_vars += PRODUCT_BUILD_ODM_IMAGE
_product_single_value_vars += PRODUCT_BUILD_CACHE_IMAGE
_product_single_value_vars += PRODUCT_BUILD_PRIVATE_IMAGE

build/make/tools/releasetools/build_image.py


def ImagePropFromGlobalDict(glob_dict, mount_point):
  """Build an image property dictionary from the global dictionary.
  
    elif mount_point == "private":
    # lixiaogang add
    copy_prop("private_fs_type", "fs_type")
    copy_prop("private_size", "partition_size")
    copy_prop("private_selinux_fc", "selinux_fc")

def main(argv):

    elif image_filename == "cache.img":
      mount_point = "cache"
    # lixiaogang add
    elif image_filename == "private.img":
      mount_point = "private"

device/rockchip/common/BoardConfig.mk


# lixiaogang add start
BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE ?= ext4
# lixiaogang add end

  # lixiaogang add
  BOARD_PRIVATEIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt private)

  # lixiaogang add
  BOARD_PRIVATEIMAGE_PARTITION_SIZE := 52428800

device/rockchip/common/build/rockchip/RebuildParameter.mk



# lixiaogang add start
partition_list := $(partition_list),private:$(BOARD_PRIVATEIMAGE_PARTITION_SIZE)
# lixiaogang add end


device/rockchip/common/init.rk30board.rc


on post-fs-data
    # lixiaogang add
    chown system system /private
    chmod 0771 /private
    restorecon_recursive /private

device/rockchip/common/scripts/fstab_tools/fstab.in


/dev/block/by-name/private          /private              ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard                wait,check

缩进格式错误导致的编译脚本不生效问题修改


diff --git a/build/make/core/Makefile b/build/make/core/Makefile
index 61814133b9..b4ffa78da6 100644
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -3081,11 +3081,11 @@ endef
 # We just build this directly to the install location.
 INSTALLED_PRIVATEIMAGE_TARGET := $(BUILT_PRIVATEIMAGE_TARGET)
 $(INSTALLED_PRIVATEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_PRIVATEIMAGE_FILES)
-    $(build-privateimage-target)
+       $(build-privateimage-target)
 
 .PHONY: privateimage-nodeps
 privateimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
-    $(build-privateimage-target)
+       $(build-privateimage-target)
 
 else # BUILDING_PRIVATE_IMAGE
 # we need to ignore the broken private link when doing the rsync