Android新增自定义分区

前言

最近测试又看我太闲了给我找了点事情做,工厂测试模式的数据需要保存,且恢复出场设置不会被恢复,这让我下意识想到新增一个分区,之前做MTK平台的时候有类似的FAQ,就很简单的新增了个,所以自信慢慢,拍着胸脯就答应了。可是这一次是全志A50平台,之前完全没有做过,也没有类似的文档支持,所以经过将近一周的磕磕绊绊,终于解决了此问题。在此记录一下!不想听废话的直接看如下 patch进行修改就可以了。想知道个大概就可以看看我的思路,这李说的是全志A50的,看看能不能找到一点灵感,表达能力不够,还多包涵!

下面还有RK3326 Q的新增分区方法 有需要的可以参考一下,我觉得下面的正宗点

参考思路 A50新增自定义分区

我们知道。Android是基于linux内核开发的一个系统,所以很多东西就是继承自linux的,记得刚拿到新电脑装服务器的时候,系统装在固态硬盘中。但是我们的代码比较大,上百个G,你固态硬盘的容量肯定不够,此刻就需要一个机械硬盘。在linux上我们在硬件接好固态硬盘的时候,需要去给他挂载到某个目录下,每次开机后都需要挂载,除非你在开机的时候就给他写入了(Ubunutu开机挂载硬盘)。 这时候我会想到Android 中的init.rc;init进程解析的init.rc会去花式创建各种目录结构并挂载。

Steps1

那么我们第一步,应该去在根目录(/)下创建一个可供system_app读写的目录。给他分配相应的空间,存放测试数据,在第一步中我有提到init.rc中mkdir,并且去挂载。我们可以去找找init.rc里面有没有类似的例子。你想…蓝牙wifi mac地址保存在哪才会恢复出场设置不会被恢复
init.rc 我这里使用的是init.sun8iw15p1.rc 目录是device/common/softwinner/venus-common/中

on init //在init阶段
    ....
    #add by tuliyuan for add a new dir
    mkdir /vtechfs system system  //这一段话的意思就是创建一个用户组为system的文件夹vtechfs
    ....
on fs         //在挂载阶段 这些init.rc中的各种状态可以参考 https://www.jianshu.com/p/cb73a88b0eed 这个地址的大佬对这些命令的解析
    mount_all /vendor/etc/fstab.sun8iw15p1      //这里我们看到是用的这个表去挂载 注意看步骤2
    swapon_all /vendor/etc/fstab.sun8iw15p1

    restorecon_recursive /persist

    #restorecon_recursive /vtech  //注意这一行,我先给他注释掉 
on late-fs
    # gpu
    insmod /vendor/modules/mali.ko

on post-fs-data
    # Set indication (checked by vold) that we have finished this action
    setprop vold.post_fs_data_done 1
on boot  //在启动阶段
    chown system system /sys/kernel/debug/sync/sw_sync
    chmod 0660 /sys/kernel/debug/sync/sw_sync
    
#add by tuliyuan
    #chown system system /vtech       //注意这一行,我先给他注释掉 
Steps2

在步骤一这样操作之后这样我们会在/目录下生成一个vtech文件夹,但是光有这个文件夹是不行的,这个文件夹没有空间,没有大小我们没办法去读写数据。这样我们需要分配一块空间给到vtech这个文件夹,并给他挂载到vtech目录下,即新增块设备,并挂载到vtech目录下

# Android fstab file.
#<src>                                         <mnt_point>  <type>  <mnt_flags and options>  <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK

#/dev/block/by-name/system               /system      ext4    ro,barrier=1      wait
#/dev/block/by-name/vendor               /vendor      ext4    ro,barrier=1      wait
/dev/block/by-name/cache                /cache       ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=panic wait,check,formattable
/dev/block/by-name/UDISK                /data        f2fs    noatime,nosuid,nodev,discard                                                               wait,check,formattable,encryptable=/dev/block/by-name/metadata,quota
/dev/block/by-name/boot                 /boot        emmc    defaults                                                                                  defaults
/dev/block/by-name/recovery             /recovery    emmc    defaults                                                                                  defaults
/dev/block/by-name/misc                 /misc        emmc    defaults                                                                                  defaults
/dev/block/by-name/frp                  /persistent  emmc    defaults                                                                                  defaults
/dev/block/zram0                        none         swap    defaults                                                                                  zramsize=75%
/devices/platform/soc/sdc0/mmc_host/mmc*            auto           auto    defaults                                                                voldmanaged=extsd:auto
/devices/platform/soc/usbc0/usb*                       auto    auto    defaults    voldmanaged=usb:auto
/devices/platform/soc/5101000.ehci0-controller/usb*    auto    auto    defaults    voldmanaged=usb:auto
/devices/platform/soc/5200000.ehci1-controller/usb*    auto    auto    defaults    voldmanaged=usb:auto
/devices/platform/soc/5101000.ohci0-controller/usb*    auto    auto    defaults    voldmanaged=usb:auto
/devices/platform/soc/5200000.ohci1-controller/usb*    auto    auto    defaults    voldmanaged=usb:auto
#add by tuliyuan for vtech factory
#将块设备vtechfs以ext4的格式挂载到/vtech目录下
/dev/block/by-name/vtechfs        /vtech    ext4    noatime,nosuid,nodev,	   defaults
Steps3

到这里是不是有点奇怪,那我的dev/block/by-name/vtechfs这个块设备哪里来的。是怎么创建的。这里这个东西目录结构是不是有点熟悉。是没有新建分区的文档,但是有修改分区大小的文档,这些资料肯定都是查阅的,我用的是这个。你可以看到在fstab.sun8iw15p1中的很多类似frp,boot,vendor等这些块设备,在这里都有定义,我们尝试一下新增一个自己的。
lichee/tools/pack/chips/sun8iw15p1/configs/a1/sys_partition.fex

;---------------------------------------------------------------------------------------------------
; 说明: 脚本中的字符串区分大小写,用户可以修改"="后面的数值,但是不要修改前面的字符串
;---------------------------------------------------------------------------------------------------


;---------------------------------------------------------------------------------------------------
;                                   固件下载参数配置
;---------------------------------------------------------------------------------------------------
;***************************************************************************************************
;    mbr的大小, 以Kbyte为单位
;***************************************************************************************************
[mbr]
size = 16384

;***************************************************************************************************
;                                              分区配置
;
;
;  partition 定义范例:
;    [partition]                ;  //表示是一个分区
;    name        = USERFS2      ; //分区名称
;    size        = 16384        ; //分区大小 单位: 扇区.分区表示个数最多2^31 * 512 = 2T
;    downloadfile = "123.fex"   ; //下载文件的路径和名称,可以使用相对路径,相对是指相对于image.cfg文件所在分区。也可以使用绝对路径
;    keydata     = 1            ; //私有数据分区,重新量产数据将不丢失
;    encrypt     = 1            ; //采用加密方式烧录,将提供数据加密,但损失烧录速度
;    user_type   = ?            ; //私有用法
;    verify      = 1            ; //要求量产完成后校验是否正确
;
; 注:1、name唯一, 不允许同名
;     2、name最大12个字符
;     3、size = 0, 将创建一个无大小的空分区
;     4、为了安全和效率考虑,分区大小最好保证为16M字节的整数倍
;***************************************************************************************************
[partition_start]
;------------------------------>mmcblk0p2/nand0p2
[partition]
    name         = bootloader
    size         = 65536
    downloadfile = "boot-resource.fex"
    user_type    = 0x8000

;------------------------------>mmcblk0p3/nand0p3
[partition]
    name         = env
    size         = 32768
    downloadfile = "env.fex"
    user_type    = 0x8000

;------------------------------>mmcblk0p4/nand0p4
[partition]
    name         = boot
    size         = 65536
    downloadfile = "boot.fex"
    user_type    = 0x8000

;------------------------------>mmcblk0p5/nand0p5
[partition]
    name         = system
    size         = 2868192
    downloadfile = "system.fex"
    user_type    = 0x8000

;------------------------------>mmcblk0p6/nand0p6
[partition]
    name         = vendor
    size         = 491520
    downloadfile = "vendor.fex"
    user_type    = 0x8000

;------------------------------>mmcblk0p7/nand0p7
[partition]
    name         = misc
    size         = 32768
    user_type    = 0x8000

;------------------------------>mmcblk0p8/nand0p8
[partition]
    name         = recovery
    size         = 65536
    downloadfile = "recovery.fex"
    user_type    = 0x8000

;------------------------------>mmcblk0p9/nand0p9
[partition]
    name         = cache
    size         = 1048576
    user_type    = 0x8000

;------------------------------>store encryptable
;------------------------------>mmcblk0p10/nand0p10
[partition]
    name         = metadata
    size         = 32768
    user_type    = 0x8000

;------------------------------>data image private
;------------------------------>mmcblk0p11/nand0p11
[partition]
    name         = private
    size         = 32768
    ro           = 0
    user_type    = 0x8000

;------------------------------>frp
;------------------------------>mmcblk0p12/nand0p12
[partition]
    name         = frp
    size         = 1024
    ro           = 0
    user_type    = 0x8000
    keydata      = 0x8000

;------------------------------>empty
;------------------------------>mmcblk0p13/nand0p13
[partition]
    name         = empty
    size         = 31744
    ro           = 0
    user_type    = 0x8000

;------------------------------>device tree overlay
;------------------------------>mmcblk0p14/nand0p14
[partition]
    name         = dto
    size         = 32768
    user_type    = 0x8000

;------------------------------>media_data
;------------------------------>mmcblk0p15/nand0p15
[partition]
    name         = media_data
    size         = 32768
    user_type    = 0x8000
;add by tuliyuan for new block device
;------------------------------>mmcblk0p16/nand0p16
[partition]
    name         = vtechfs              -->块设备名称
    downloadfile = "vtechfs.fex"  -->块设备对应的img
    size         = 65536          -->块设备大小
    user_type    = 0x8000   -->块设备类型

;------------------------------>UDISK
;------------------------------>mmcblk0p1/nand0p1
[partition]
    name         = UDISK
    user_type    = 0x8100

然后重新pack一下,你会发现无法pack成功~报错信息为

ERROR:  unable to open file vtechfs.fex
ERROR: update mbr file fail
ERROR: update_mbr failed
/home/sn0553/software/project/vtech_aw/sp01/android

Steps4

当然。我们没有vtechfs.fex文件。那这个文件怎么来的,我们知道,全志用的刷机工具是PhoenixSuit;我们通常在make -j8 完了之后,还要pack一下生成很多fex文件供我们烧录使用。那这个pack命令怎么来的?device/softwinner/common/vendorsetup.sh有个function pack();我们是用的这个进行pack的 这个也是我无意间发现的,既然是全志的 那就去device/softwinner看看有没有什么特别的就好了。果然给我找到了! 通过跟踪,我们发现他最终使用的是lichee/tools/pack/pack这个脚本进行的打包fex文件! 我们搜索一下sys_partition.fex中的system.fex吧。果然在这里面搜索到了lichee/tools/pack/pack

function do_pack_android()
{
	local link_real=$(get_realpath ${ANDROID_IMAGE_OUT} ./)

	printf "packing for android\n"

	if [ -z "${ANDROID_IMAGE_OUT}" ] ; then
		pack_error "please specify ANDROID_IMAGE_OUT env"
		exit 1
	fi

	ln -sf ${link_real}/boot.img boot.fex
	ln -sf ${link_real}/system.img system.fex
	ln -sf ${link_real}/recovery.img recovery.fex
	#add by tuliyuan for add a new partition
	ln -s ${LICHEE_OUT}/vtechfs.ext4  vtechfs.fex
	#add end 

	if [ -f ${ANDROID_IMAGE_OUT}/verity_block.img ] ; then
		cp -f ${ANDROID_IMAGE_OUT}/verity_block.img verity_block.fex
	fi

	if [ -f ${ANDROID_IMAGE_OUT}/userdata.img ] ; then
		ln -sf ${link_real}/userdata.img userdata.fex
	fi

        if [ -f ${ANDROID_IMAGE_OUT}/vendor.img ] ; then
                ln -sf ${link_real}/vendor.img vendor.fex
        fi

	if [ "x${PACK_SIG}" = "xsig" ] ; then
		echo "signature sunxi mbr"
		signature sunxi_mbr.fex dlinfo.fex
		echo "signature over"
	elif [ "x${PACK_SECURE}" = "xsecure" ] ; then
		echo "secure"
		do_android_signature
	elif [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
		echo "prev_refurbish"
		do_android_signature
	else
		echo "normal"
	fi
}

我们看到他把out目录下的system.img 映射成system.fex文件,这就是fex文件的由来,我们需要那我们该怎么编译一个fex文件呢?我们求助,在朋友的点拨下,找到了这个全志V40 分区
这里有详细描述。于是我进行了一番参考之后。有了如下内容

Steps5

/lichee/tools/build/mkcmd.sh

function mkrootfs()
{
	mk_info "build rootfs ..."

	if [ ${LICHEE_PLATFORM} = "linux" ] ; then

		if [ "x$PACK_TINY_ANDROID" = "xtrue" ]; then
			mk_tinyandroid $1
		elif [ ${SKIP_BR} -ne 0 ]; then
			mk_defroot $1
		else
			if [ "x$PACK_BSPTEST" = "xtrue" ];then
				if [ -d ${LICHEE_BR_OUT}/target ];then
 					rm -rf ${ROOTFS}/target/*
				fi
				if [ -d ${LICHEE_SATA_DIR}/linux/target ];then
					mk_info "copy SATA rootfs"
					cp -a ${LICHEE_SATA_DIR}/linux/target ${LICHEE_BR_OUT}/target/
				fi
			fi

			# buildroot-201611 just not using this
			if [ -z `echo $LICHEE_BR_DIR | grep "201611"` ]; then
				make O=${LICHEE_BR_OUT} -C ${LICHEE_BR_DIR} \
					BR2_TOOLCHAIN_EXTERNAL_PATH=${LICHEE_TOOLCHAIN_PATH} \
					BR2_TOOLCHAIN_EXTERNAL_PREFIX=${LICHEE_CROSS_COMPILER} \
					BR2_JLEVEL=${LICHEE_JLEVEL} target-post-image
			fi

			[ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1

			cp ${LICHEE_BR_OUT}/images/rootfs.ext4 ${LICHEE_PLAT_OUT}

			if [ -f "${LICHEE_BR_OUT}/images/rootfs.squashfs" ]; then
				cp ${LICHEE_BR_OUT}/images/rootfs.squashfs ${LICHEE_PLAT_OUT}
			fi
		fi
	elif [ ${LICHEE_PLATFORM} = "dragonboard" ] ; then
		# buildroot-201611 not supporting dragonboard, i am just say sorry,
		# pls add it, but i just done nothing else
		if [ -d ${LICHEE_TOP_DIR}/buildroot/target ]; then
			echo "Regenerating dragonboard Rootfs..."
			(
			cd ${LICHEE_TOP_DIR}/buildroot/target/${LICHEE_PLATFORM}; \
				if [ ! -d "./rootfs" ]; then \
					echo "extract dragonboard rootfs.tar.gz"; \
					tar zxf ../common/rootfs/rootfs.tar.gz; \
				fi
			)
			prepare_dragonboard_toolchain
			mkdir -p ${LICHEE_TOP_DIR}/buildroot/target/${LICHEE_PLATFORM}/rootfs/lib/modules
			rm -rf ${LICHEE_TOP_DIR}/buildroot/target/${LICHEE_PLATFORM}/rootfs/lib/modules/*
			cp -rf ${LICHEE_KERN_DIR}/output/lib/modules/* \
				${LICHEE_TOP_DIR}/buildroot/target/${LICHEE_PLATFORM}/rootfs/lib/modules/
			(cd ${LICHEE_TOP_DIR}/buildroot/target/common/scripts; ./build.sh)
					[  $? -ne 0 ] && mk_error "build rootfs Failed" && return 1
			cp ${LICHEE_TOP_DIR}/buildroot/target/${LICHEE_PLATFORM}/rootfs.ext4 ${LICHEE_PLAT_OUT}
		fi
	else
#add by tuliyuan for custom partition
#add start
        mk_info "tuliyuan mk_tinyandroid LICHEE_PLAT_OUT $LICHEE_PLAT_OUT "
    #//这里是要压缩的成分区的地方
	VTECH_FS_PATH=${LICHEE_TOOLS_DIR}/product/configs/a1/vtech/
	NR_SIZE=`du -sm ${VTECH_FS_PATH} | awk '{print $1}'`
	# 配置的分区大小 至少32M
	NEW_NR_SIZE=$(((($NR_SIZE+32)/16)*16)) 

	echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
	${LICHEE_TOOLS_DIR}/build/bin/make_ext4fs -l \
		$NEW_NR_SIZE"M" ${LICHEE_PLAT_OUT}/vtechfs.ext4 ${VTECH_FS_PATH}
	fsck.ext4 -y ${LICHEE_PLAT_OUT}/vtechfs.ext4 > /dev/null
       

#add end
		mk_info "skip make rootfs for ${LICHEE_PLATFORM}"
	fi

	mk_info "build rootfs OK."
}

这里配置了以后我们先让mkcmd.sh脚本走一下编译一下lichee

root@abc:~/software/project/vtech_aw/sp01$ ls -l
drwxr-xr-x 31 sn0553 sn0553   4096 9月  22 12:17 android
lrwxrwxrwx  1 sn0553 sn0553     32 5月   7 18:27 compile.sh -> customize/tools/build/compile.sh
drwxr-xr-x  5 sn0553 sn0553   4096 5月   7 19:27 customize
drwxr-xr-x  8 sn0553 sn0553   4096 9月  22 09:44 lichee
drwxr-xr-x  4 sn0553 sn0553   4096 5月   7 18:28 modem
root@abc:~/software/project/vtech_aw/sp01$ cd lichee
root@abc:~/software/project/vtech_aw/sp01/lichee$ rm -rf linux-4.9/.config
root@abc:~/software/project/vtech_aw/sp01/lichee$ ./build.sh

生成对应的vtechfs.fex文件.

Steps6

如此这般加上上面的pack,我们就添加分区成功并且挂载了。剩下的selinux 权限,无非就是file.te 里面自定义type,file_context里面把vtech目录指向自定义的type,然后system_app.te里面加入读写权限就可以了。然后我们开机。adb shell ;在看看ls -lZ 查看目录对应的用户组和安全权限,我用户组之前一直为root 。后面在init.rc中的on boot的时候 再chown system system /vtech就可以了。 但是我们发现security context仍旧不是我们定义的,vtechfs 这原因就是selinux加载在分区挂载之前,所以我们需要重新分配这个目录的security context

init.rc

on fs
    restorecon_recursive /vtech
 on boot 
    chown system system /vtech

一切大功告成,如下为patch补丁包!

A50新增分区Patch

 From 1faa986a7af21dbf94e0ad780f43f41dc390bb68 Mon Sep 17 00:00:00 2001
From: "liyuan.tu" <975150240@qq.com>
Date: Tue, 22 Sep 2020 14:25:48 +0800
Subject: [PATCH] =?UTF-8?q?[VTECH]=20[Partition]=201.=E6=96=B0=E5=A2=9Evte?=
 =?UTF-8?q?chfs=E5=88=86=E5=8C=BA=20=E6=8C=82=E8=BD=BD=E7=82=B9=E4=B8=BA/v?=
 =?UTF-8?q?tech?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit


diff --git a/android/device/softwinner/common/sepolicy/vendor/attributes b/android/device/softwinner/common/sepolicy/vendor/attributes
new file mode 100644
index 0000000000..bfb26350bc
--- /dev/null
+++ b/android/device/softwinner/common/sepolicy/vendor/attributes
@@ -0,0 +1 @@
+attribute vtech_file_type;
diff --git a/android/device/softwinner/common/sepolicy/vendor/file.te b/android/device/softwinner/common/sepolicy/vendor/file.te
new file mode 100644
index 0000000000..42d00028e2
--- /dev/null
+++ b/android/device/softwinner/common/sepolicy/vendor/file.te
@@ -0,0 +1 @@
+type vtechfs, vtech_file_type, file_type;
diff --git a/android/device/softwinner/common/sepolicy/vendor/file_contexts b/android/device/softwinner/common/sepolicy/vendor/file_contexts
index acf4365ad2..b97ac891c9 100755
--- a/android/device/softwinner/common/sepolicy/vendor/file_contexts
+++ b/android/device/softwinner/common/sepolicy/vendor/file_contexts
@@ -88,3 +88,6 @@
 
 # awbms
 /system/bin/awbms           u:object_r:shell_exec:s0
+
+#add by tuliyuan for vtechfs 
+/vtech(/.*)?                u:object_r:vtechfs:s0
diff --git a/android/device/softwinner/common/sepolicy/vendor/init.te b/android/device/softwinner/common/sepolicy/vendor/init.te
index 5656277162..6562a31016 100755
--- a/android/device/softwinner/common/sepolicy/vendor/init.te
+++ b/android/device/softwinner/common/sepolicy/vendor/init.te
@@ -22,5 +22,7 @@ allow init sysfs:file create;
 allow init sysfs_zram:dir { write add_name };
 allow init sysfs_zram:file create;
 allow init debugfs:dir mounton;
+#============= init ==============
+allow init vtechfs:dir create;
 #allow init rootfs:file create;
 
diff --git a/android/device/softwinner/common/sepolicy/vendor/shell.te b/android/device/softwinner/common/sepolicy/vendor/shell.te
index c5999f8c1b..51663aa8a7 100755
--- a/android/device/softwinner/common/sepolicy/vendor/shell.te
+++ b/android/device/softwinner/common/sepolicy/vendor/shell.te
@@ -6,4 +6,6 @@ allow shell sysfs_zram:file { read getattr open };
 allow shell hal_memtrack_default:binder call;
 allow shell untrusted_app_25:process { getsched setsched };
 allow shell untrusted_app:process { getsched setsched };
+allow shell vtechfs:file { open read write rw_file_perms create };
+allow shell vtechfs:dir { add_name search create read write rw_file_perms };
 set_prop(shell, system_prop)
diff --git a/android/device/softwinner/common/sepolicy/vendor/system_app.te b/android/device/softwinner/common/sepolicy/vendor/system_app.te
index 2759ddf680..8fa6ec7111 100644
--- a/android/device/softwinner/common/sepolicy/vendor/system_app.te
+++ b/android/device/softwinner/common/sepolicy/vendor/system_app.te
@@ -7,5 +7,8 @@ allow system_app device:chr_file { ioctl open read write };
 allow system_app installd_service:service_manager find;
 allow system_app netd_service:service_manager find;
 allow system_app wificond:binder call;
+#============= system_app ==============
+allow system_app vtechfs:dir { add_name create_dir_perms create_dir_perms create_file_perms write read getattr };
+allow system_app vtechfs:file { open create read write getattr};
 
 
diff --git a/android/device/softwinner/common/sepolicy/vendor/vtechfs.te b/android/device/softwinner/common/sepolicy/vendor/vtechfs.te
new file mode 100644
index 0000000000..1f4f89ad81
--- /dev/null
+++ b/android/device/softwinner/common/sepolicy/vendor/vtechfs.te
@@ -0,0 +1,2 @@
+#============= vtechfs ==============
+allow vtechfs rootfs:filesystem associate;
diff --git a/android/device/softwinner/venus-a1/fstab.sun8iw15p1 b/android/device/softwinner/venus-a1/fstab.sun8iw15p1
index 4a430009bd..1e9642c506 100644
--- a/android/device/softwinner/venus-a1/fstab.sun8iw15p1
+++ b/android/device/softwinner/venus-a1/fstab.sun8iw15p1
@@ -18,3 +18,5 @@
 /devices/platform/soc/5200000.ehci1-controller/usb*    auto    auto    defaults    voldmanaged=usb:auto
 /devices/platform/soc/5101000.ohci0-controller/usb*    auto    auto    defaults    voldmanaged=usb:auto
 /devices/platform/soc/5200000.ohci1-controller/usb*    auto    auto    defaults    voldmanaged=usb:auto
+#add by tuliyuan for vtech factory
+/dev/block/by-name/vtechfs        /vtech    ext4    noatime,nosuid,nodev,	   defaults
diff --git a/android/device/softwinner/venus-common/init.sun8iw15p1.rc b/android/device/softwinner/venus-common/init.sun8iw15p1.rc
index a75c41e1af..89c7671131 100755
--- a/android/device/softwinner/venus-common/init.sun8iw15p1.rc
+++ b/android/device/softwinner/venus-common/init.sun8iw15p1.rc
@@ -16,6 +16,13 @@ on init
     mkdir /oem 0550 system system
     export PATH /vendor/xbin:/sbin:/system/sbin:/system/bin:/system/xbin:/vendor/bin
 
+    #add by tuliyuan 
+    mkdir /vtech 777 system system
+
+    #wait /dev/block/by-name/vtechfs
+    #mount ext4 /dev/block/by-name/vtechfs /vtech rw nosuid nodev utf8,context=u:object_r:vtechfs:s0
+    
+
 on early-fs
     wait /dev/block/by-name/media_data
     mount vfat /dev/block/by-name/media_data /oem ro nosuid nodev utf8,context=u:object_r:oemfs:s0
@@ -23,8 +30,10 @@ on early-fs
 on fs
     mount_all /vendor/etc/fstab.sun8iw15p1
     swapon_all /vendor/etc/fstab.sun8iw15p1
+
     restorecon_recursive /persist
 
+    restorecon_recursive /vtech
 on late-fs
     # gpu
     insmod /vendor/modules/mali.ko
@@ -35,14 +44,15 @@ on post-fs-data
 on boot
     chown system system /sys/kernel/debug/sync/sw_sync
     chmod 0660 /sys/kernel/debug/sync/sw_sync
-
+    
+#add by tuliyuan
+    chown system system /vtech
 on post-fs-data
     # mkdir for optee
     mkdir /data/tee 0770 system system
     # create file for audio dump data
     mkdir /data/audio_d 0777 audio audio
     restorecon_recursive /data/tee
-
 on charger
     chown system system /dev/alarm
     chmod 0660 /dev/alarm
diff --git a/lichee/buildroot/scripts/mkcmd.sh b/lichee/buildroot/scripts/mkcmd.sh
index 6df50921cc..99ee6b315a 100755
--- a/lichee/buildroot/scripts/mkcmd.sh
+++ b/lichee/buildroot/scripts/mkcmd.sh
@@ -456,7 +456,6 @@ function mk_tinyandroid()
 	mkdir -p ${ROOTFS}/lib/modules
 	cp -rf ${LICHEE_KERN_DIR}/output/lib/modules/* \
 		${ROOTFS}/lib/modules/
-
 	if [ "x$PACK_BSPTEST" = "xtrue" ];then
 		if [ -d ${ROOTFS}/target ];then
 			rm -rf ${ROOTFS}/target/*
@@ -479,7 +478,6 @@ function mk_tinyandroid()
 function mkrootfs()
 {
     mk_info "build rootfs ..."
-
     if [ ${LICHEE_PLATFORM} = "linux" ] ; then
         if [ "x$PACK_TINY_ANDROID" = "xtrue" ]; then
             mk_tinyandroid $1
@@ -523,7 +521,7 @@ function mkrootfs()
         (cd ${LICHEE_BR_DIR}/target/dragonboard; ./build.sh)
         cp ${LICHEE_BR_DIR}/target/dragonboard/rootfs.ext4 ${LICHEE_PLAT_OUT}
     else
-        mk_info "skip make rootfs for ${LICHEE_PLATFORM}"
+	mk_info "skip make rootfs for ${LICHEE_PLATFORM}"
     fi
 
     mk_info "build rootfs OK."
diff --git a/lichee/tools/build/mkcmd.sh b/lichee/tools/build/mkcmd.sh
index 02fd3dc01d..f1d2d0ef98 100755
--- a/lichee/tools/build/mkcmd.sh
+++ b/lichee/tools/build/mkcmd.sh
@@ -748,6 +748,21 @@ function mkrootfs()
 			cp ${LICHEE_TOP_DIR}/buildroot/target/${LICHEE_PLATFORM}/rootfs.ext4 ${LICHEE_PLAT_OUT}
 		fi
 	else
+#add by tuliyuan for custom partition
+#add start
+        mk_info "tuliyuan mk_tinyandroid LICHEE_PLAT_OUT $LICHEE_PLAT_OUT "
+
+	VTECH_FS_PATH=${LICHEE_TOOLS_DIR}/product/configs/a1/vtech/
+	NR_SIZE=`du -sm ${VTECH_FS_PATH} | awk '{print $1}'`
+	NEW_NR_SIZE=$(((($NR_SIZE+32)/16)*16))
+
+	echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
+	${LICHEE_TOOLS_DIR}/build/bin/make_ext4fs -l \
+		$NEW_NR_SIZE"M" ${LICHEE_PLAT_OUT}/vtechfs.ext4 ${VTECH_FS_PATH}
+	fsck.ext4 -y ${LICHEE_PLAT_OUT}/vtechfs.ext4 > /dev/null
+       
+
+#add end
 		mk_info "skip make rootfs for ${LICHEE_PLATFORM}"
 	fi
 
diff --git a/lichee/tools/pack/chips/sun8iw15p1/configs/a1/sys_partition.fex b/lichee/tools/pack/chips/sun8iw15p1/configs/a1/sys_partition.fex
index 53bb6b4450..670cd61bc0 100755
--- a/lichee/tools/pack/chips/sun8iw15p1/configs/a1/sys_partition.fex
+++ b/lichee/tools/pack/chips/sun8iw15p1/configs/a1/sys_partition.fex
@@ -132,6 +132,13 @@ size = 16384
     size         = 32768
     user_type    = 0x8000
 
+;------------------------------>mmcblk0p16/nand0p16
+[partition]
+    name         = vtechfs
+    downloadfile = "vtechfs.fex"
+    size         = 65536
+    user_type    = 0x8000
+
 ;------------------------------>UDISK
 ;------------------------------>mmcblk0p1/nand0p1
 [partition]
diff --git a/lichee/tools/pack/chips/sun8iw15p1/configs/a1/vtech/madsd b/lichee/tools/pack/chips/sun8iw15p1/configs/a1/vtech/madsd
new file mode 100644
index 0000000000..1f40f85ba8
--- /dev/null
+++ b/lichee/tools/pack/chips/sun8iw15p1/configs/a1/vtech/madsd
@@ -0,0 +1,6 @@
+asd ad,l;
+
+sf mdmafm 
+fldsmfioaasfi jdois
+fmsadlf ajksdf
+
diff --git a/lichee/tools/pack/pack b/lichee/tools/pack/pack
index 8d20a7d9e4..bb8c7d9859 100755
--- a/lichee/tools/pack/pack
+++ b/lichee/tools/pack/pack
@@ -935,6 +935,9 @@ function do_pack_android()
 	ln -sf ${link_real}/boot.img boot.fex
 	ln -sf ${link_real}/system.img system.fex
 	ln -sf ${link_real}/recovery.img recovery.fex
+	#add by tuliyuan for add a new partition
+	ln -s ${LICHEE_OUT}/vtechfs.ext4  vtechfs.fex
+	#add end 
 
 	if [ -f ${ANDROID_IMAGE_OUT}/verity_block.img ] ; then
 		cp -f ${ANDROID_IMAGE_OUT}/verity_block.img verity_block.fex
-- 
2.17.1

附录

顺便来个app读写的代码工具类,没有优化过。ResultUtils.java

package abcdefg.

import android.util.Log;

import abcdefg.TestList;//包名码住,这个类是测试项的一个汇总 做个参考就好了


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;


public class ResultUtils {
    private static ResultUtils INSTANCE = null;
    private final String TAG = "ResultUtils";
    //文件保存路径
    public static final String FILE_PATH = "/vtech/factory_result";
    public static final int RESULT_DEFAULT = -1;
    public static final int RESULT_SUCCESS = 1;
    public static final int RESULT_FAILED = 0;

    private LinkedHashMap<String, Integer> mResult = new LinkedHashMap<>();


    /**
     * 获取本地缓存的测试结果表
     *
     * @return 一个有序的hashmap表
     */

    public LinkedHashMap<String, Integer> getResult() {
        File file = new File(FILE_PATH);
        //初始化,文件不存在,则为第一次刷机测试,创建文件,并写入默认值.
        if (!file.exists()) {
            Log.d(TAG, "getResult 文件不存在!开始创建,并设置默认值!");
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < TestList.getCount(); i++) {
                // Log.d("ResultUtils"," put string "+TestList.get(i).getClass().getSimpleName());
                mResult.put(TestList.get(i).getClass().getSimpleName(), ResultUtils.RESULT_DEFAULT);
            }
            writeFileData(map2string(mResult));
        }
        return mResult;
    }


    public static ResultUtils getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new ResultUtils();
        }
        return INSTANCE;
    }

    /**
     * 初始化,我放在application类中
     * 文件不存在 则创建文件。并添加默认值。
     * 文件存在 则给本地的测试结果hasmap表赋值
     */
    public void init() {
        Log.d(TAG, "init ... ");
        File file = new File(FILE_PATH);
        //初始化,文件不存在,则为第一次刷机测试,创建文件,并写入默认值.
        if (!file.exists()) {
            Log.d(TAG, "init 文件不存在!开始创建,并设置默认值!");
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < TestList.getCount(); i++) {
                // Log.d("ResultUtils"," put string "+TestList.get(i).getClass().getSimpleName());
                mResult.put(TestList.get(i).getClass().getSimpleName(), ResultUtils.RESULT_DEFAULT);
            }
            writeFileData(map2string(mResult));
        } else {//文件存在。已进行过测试,读取配置
            Log.d(TAG, "init 文件存在! 开始读取测试结果");
            mResult = getStringToMap(readStringFromFile());
        }
    }

    /**
     * 向文本中写入数据
     *
     * @param content 是String 类型的 由hashmap转换而来
     */

    public void writeFileData(String content) {
        Log.d(TAG, " 将在 " + FILE_PATH + "此文件中写入内容: " + content);
        try {
            File file = new File(FILE_PATH);
            FileOutputStream fos = new FileOutputStream(file);
            //将要写入的字符串转换为byte数组
            byte[] bytes = content.getBytes();
            fos.write(bytes);//将byte数组写入文件
            fos.close();//关闭文件输出流

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取文本中的数据
     *
     * @return 返回的是String类型的数据流
     */

    public String readStringFromFile() {
        String content = "";
        File file = new File(FILE_PATH);
        if (!file.exists()) {
            Log.d(TAG, "readStringFromFile 文件不存在!");
            content = "";
            return content;
        }

        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            int length = fileInputStream.available();
            byte[] bytes = new byte[length];
            fileInputStream.read(bytes);

            content = new String(bytes, "UTF-8");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.d(TAG, "readStringFromFile  content is " + content);
        return content;
    }

    /**
     * string转为map
     *
     * @param str 传入参数String
     * @return 返回参数LinkedHashMap
     */

    public LinkedHashMap<String, Integer> getStringToMap(String str) {
        //根据逗号截取字符串数组
        String[] str1 = str.split(",");
        //创建Map对象
        mResult.clear();
        // LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        //循环加入map集合

        for (int i = 0; i < str1.length; i++) {
            //根据":"截取字符串数组

            String[] str2 = str1[i].split(":");
            //str2[0]为KEY,str2[1]为值
            Log.d(TAG, " str2[0] " + str2[0] + " value is " + Integer.valueOf(str2[1]));
            mResult.put(str2[0], Integer.valueOf(str2[1]));
        }
        Log.d(TAG, "getStringToMap  content is " + mResult.toString());
        return mResult;
    }

    /**
     * map转换为string
     *
     * @param map 传入参数HashMap
     * @return 返回参数 String
     */
    private String map2string(HashMap<String, Integer> map) {


        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < TestList.getCount(); i++) {
            // 参数值为空,则不参与签名 这个方法trim()是去空格
            if ((String.valueOf(map.get(TestList.get(i).getClass().getSimpleName()))).trim().length() > 0) {
                sb.append(TestList.get(i).getClass().getSimpleName()).append(":").append(String.valueOf(map.get(TestList.get(i).getClass().getSimpleName())).trim());
            }
            if (i != TestList.getCount() - 1) {
                sb.append(",");
            }
        }
        return sb.toString();
    }

    /**
     * 更新数据,并全部重新写入文本
     *
     * @param key   测试项
     * @param value 测试项对应的结果
     */
    public void updateItem(String key, int value) {
        mResult.replace(key, value);
        Log.d(TAG, " updateItem 在更新数据之后, 维护的测试结果为: " + mResult.toString());
        writeFileData(map2string(mResult));
    }
}

参考 RK3326 Q 新增自定义分区

From ad112446914b3b8437bb0641cd1f5f01e2372f1d Mon Sep 17 00:00:00 2001
From: "liyuan.tu" <975150240@qq.com>
Date: Fri, 22 Jan 2021 17:55:54 +0800
Subject: [PATCH] =?UTF-8?q?[VTECH=5FVCS800]=20[Parition]=201.=E6=96=B0?=
 =?UTF-8?q?=E5=A2=9E=E8=87=AA=E5=AE=9A=E4=B9=89vtech=E5=88=86=E5=8C=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit


diff --git a/build/make/core/Makefile b/build/make/core/Makefile
index bac49d186e..026a82116d 100755
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -1386,6 +1386,11 @@ $(if $(filter $(2),cache),\
     $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
     $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1))
 )
+$(if $(filter $(2),vtech),\
+    $(if $(BOARD_VTECHIMAGE_PARTITION_SIZE),$(hide) echo "vtech_size=$(BOARD_VTECHIMAGE_PARTITION_SIZE)" >> $(1))
+    $(if $(BOARD_VTECHIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vtech_fs_type=$(BOARD_VTECHIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
+)
+
 $(if $(filter $(2),vendor),\
     $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
     $(if $(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT),$(hide) echo "vendor_extfs_inode_count=$(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT)" >> $(1))
@@ -1443,6 +1448,8 @@ $(if $(filter $(2),oem),\
     $(if $(BOARD_OEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "oem_extfs_inode_count=$(BOARD_OEMIMAGE_EXTFS_INODE_COUNT)" >> $(1))
     $(if $(BOARD_OEMIMAGE_EXTFS_RSV_PCT),$(hide) echo "oem_extfs_rsv_pct=$(BOARD_OEMIMAGE_EXTFS_RSV_PCT)" >> $(1))
 )
+
+
 $(hide) echo "ext_mkuserimg=$(notdir $(MKEXTUSERIMG))" >> $(1)
 
 $(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1))
@@ -2641,6 +2648,42 @@ else # BUILDING_CACHE_IMAGE
 IGNORE_CACHE_LINK := --exclude=cache
 endif # BUILDING_CACHE_IMAGE
 
+#add for  vtech fs
+BOARD_VTECHIMAGE_FILE_SYSTEM_TYPE := ext4
+ifdef BOARD_VTECHIMAGE_FILE_SYSTEM_TYPE
+INTERNAL_VTECHIMAGE_FILES := \
+    $(filter $(TARGET_OUT_VTECH)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
+
+vtechimage_intermediates := \
+    $(call intermediates-dir-for,PACKAGING,vtech)
+BUILT_VTECHIMAGE_TARGET := $(PRODUCT_OUT)/vtech.img
+
+define build-vtechimage-target
+  $(call pretty,"Target vtech fs image: $(INSTALLED_VTECHIMAGE_TARGET)")
+  @mkdir -p $(TARGET_OUT_VTECH)
+  @mkdir -p $(vtechimage_intermediates) && rm -rf $(vtechimage_intermediates)/vtech_image_info.txt
+  $(call generate-image-prop-dictionary, $(vtechimage_intermediates)/vtech_image_info.txt,vtech,skip_fsck=true)
+  $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
+      build/make/tools/releasetools/build_image.py \
+      $(TARGET_OUT_VTECH) $(vtechimage_intermediates)/vtech_image_info.txt $(INSTALLED_VTECHIMAGE_TARGET) $(TARGET_OUT)
+  $(hide) $(call assert-max-image-size,$(INSTALLED_VTECHIMAGE_TARGET),$(BOARD_VTECHIMAGE_PARTITION_SIZE))
+endef
+
+# We just build this directly to the install location.
+INSTALLED_VTECHIMAGE_TARGET := $(BUILT_VTECHIMAGE_TARGET)
+$(INSTALLED_VTECHIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VTECHIMAGE_FILES) $(BUILD_IMAGE_SRCS)
+	$(build-vtechimage-target)
+
+.PHONY: vtechimage-nodeps
+vtechimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
+	$(build-vtechimage-target)
+
+else # BOARD_VTECHIMAGE_FILE_SYSTEM_TYPE
+# we need to ignore the broken vtech link when doing the rsync
+IGNORE_VTECH_LINK := --exclude=vtech
+
+endif
+
 # -----------------------------------------------------------------
 # system_other partition image
 ifdef BUILDING_SYSTEM_OTHER_IMAGE
@@ -3838,6 +3881,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \
 	    $(INSTALLED_USERDATAIMAGE_TARGET) \
 	    $(INSTALLED_CACHEIMAGE_TARGET) \
 	    $(INSTALLED_VENDORIMAGE_TARGET) \
+	    $(INSTALLED_VTECHIMAGE_TARGET) \
 	    $(INSTALLED_PRODUCTIMAGE_TARGET) \
 	    $(INSTALLED_PRODUCT_SERVICESIMAGE_TARGET) \
 	    $(INSTALLED_VBMETAIMAGE_TARGET) \
diff --git a/build/make/core/config.mk b/build/make/core/config.mk
index b59862ee2a..44ff422d3a 100644
--- a/build/make/core/config.mk
+++ b/build/make/core/config.mk
@@ -1156,6 +1156,7 @@ dont_bother_goals := out \
     psnod productservicesimage-nodeps \
     onod odmimage-nodeps \
     systemotherimage-nodeps \
+    vtechimage-nodeps \
     ramdisk-nodeps \
     ramdisk_debug-nodeps \
     bootimage-nodeps \
diff --git a/build/make/core/envsetup.mk b/build/make/core/envsetup.mk
index 5131598a94..30a82665e0 100644
--- a/build/make/core/envsetup.mk
+++ b/build/make/core/envsetup.mk
@@ -599,6 +599,8 @@ endif
 TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
 .KATI_READONLY := TARGET_OUT_CACHE
 
+TARGET_OUT_VTECH := $(PRODUCT_OUT)/vtech
+
 TARGET_OUT_VENDOR := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)
 .KATI_READONLY := TARGET_OUT_VENDOR
 ifneq ($(filter address,$(SANITIZE_TARGET)),)
diff --git a/build/make/core/main.mk b/build/make/core/main.mk
index 7465743d88..6a53fd7097 100644
--- a/build/make/core/main.mk
+++ b/build/make/core/main.mk
@@ -1587,6 +1587,9 @@ bptimage: $(INSTALLED_BPTIMAGE_TARGET)
 .PHONY: vendorimage
 vendorimage: $(INSTALLED_VENDORIMAGE_TARGET)
 
+.PHONY: vtechimage
+vtechimage: $(INSTALLED_VTECHIMAGE_TARGET)
+
 .PHONY: productimage
 productimage: $(INSTALLED_PRODUCTIMAGE_TARGET)
 
@@ -1628,6 +1631,7 @@ droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
     $(INSTALLED_CACHEIMAGE_TARGET) \
     $(INSTALLED_BPTIMAGE_TARGET) \
     $(INSTALLED_VENDORIMAGE_TARGET) \
+    $(INSTALLED_VTECHIMAGE_TARGET) \
     $(INSTALLED_ODMIMAGE_TARGET) \
     $(INSTALLED_SUPERIMAGE_EMPTY_TARGET) \
     $(INSTALLED_PRODUCTIMAGE_TARGET) \
diff --git a/build/make/tools/releasetools/build_image.py b/build/make/tools/releasetools/build_image.py
index 4136ed432e..428769ba44 100755
--- a/build/make/tools/releasetools/build_image.py
+++ b/build/make/tools/releasetools/build_image.py
@@ -597,6 +597,9 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):
   elif mount_point == "cache":
     copy_prop("cache_fs_type", "fs_type")
     copy_prop("cache_size", "partition_size")
+  elif mount_point == "vtech":
+    copy_prop("vtech_fs_type", "fs_type")
+    copy_prop("vtech_size", "partition_size")
   elif mount_point == "vendor":
     copy_prop("avb_vendor_hashtree_enable", "avb_hashtree_enable")
     copy_prop("avb_vendor_add_hashtree_footer_args",
@@ -769,6 +772,8 @@ def main(argv):
       mount_point = "oem"
     elif image_filename == "product.img":
       mount_point = "product"
+    elif image_filename == "vtech.img":
+      mount_point = "vtech"
     elif image_filename == "product_services.img":
       mount_point = "product_services"
     else:
diff --git a/device/rockchip/common/BoardConfig.mk b/device/rockchip/common/BoardConfig.mk
index 7006707622..c760df33a8 100755
--- a/device/rockchip/common/BoardConfig.mk
+++ b/device/rockchip/common/BoardConfig.mk
@@ -119,7 +119,7 @@ ifeq ($(strip $(USE_DEFAULT_PARAMETER)), true)
   BOARD_BOOTIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt boot)
   BOARD_DTBOIMG_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt dtbo)
   BOARD_RECOVERYIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt recovery)
-
+  BOARD_VTECHIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt vtech)
   #$(info Calculated BOARD_SYSTEMIMAGE_PARTITION_SIZE=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE) use $(TARGET_DEVICE_DIR)/parameter.txt)
 else
   ifeq ($(PRODUCT_USE_DYNAMIC_PARTITIONS), true)
@@ -138,6 +138,7 @@ else
   endif
 endif
 
+
 # GPU configration
 TARGET_BOARD_PLATFORM_GPU ?= mali-t760
 BOARD_USE_LCDC_COMPOSER ?= false
@@ -248,7 +249,7 @@ TARGET_ROCHCHIP_RECOVERY ?= true
 BOARD_HAS_FLIPPED_SCREEN ?= false
 
 # Auto update package from USB
-RECOVERY_AUTO_USB_UPDATE ?= false
+RECOVERY_AUTO_USB_UPDATE ?= true
 
 # To use bmp as kernel logo, uncomment the line below to use bgra 8888 in recovery
 TARGET_RECOVERY_PIXEL_FORMAT := "RGBX_8888"
diff --git a/device/rockchip/common/init.rk30board.rc b/device/rockchip/common/init.rk30board.rc
index 2d1b7ac1e1..3772d2035f 100755
--- a/device/rockchip/common/init.rk30board.rc
+++ b/device/rockchip/common/init.rk30board.rc
@@ -6,9 +6,11 @@ import /vendor/etc/init/hw/init.${ro.target.product}.rc
 import /vendor/etc/init/hw/init.car.rc
 import /vendor/etc/init/hw/init.optee.rc
 
+
 on post-fs
     restorecon_recursive /mnt/vendor/metadata
 
+
 on post-fs-data
     # AP6476 GPS permission
     chmod 755 /system/bin/glgps
@@ -25,7 +27,10 @@ on post-fs-data
 
     mkdir /data/vendor/logs 0755 root shell
     mkdir /data/vendor/audio 0755 system system
-
+   # mount ext4 /dev/block/by-name/vtech /vtech wait noatime nodiratime nosuid nodev noauto_da_alloc
+    chown system system /vtech
+    chmod 0771 /vtech
+    
 on early-init
     setprop ro.hardware.egl mali
     write /sys/devices/system/cpu/cpufreq/policy0/scaling_governor performance
@@ -39,9 +44,12 @@ on init
     chmod 0666 /dev/teepriv0
     chown system system /sys/system_monitor/system_status
     chmod 0666 /sys/system_monitor/system_status
-
+    
+    	
+    
 on boot
 
+   
     chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_rate
     chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/timer_rate
     chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_slack
diff --git a/device/rockchip/common/scripts/fstab_tools/fstab.in b/device/rockchip/common/scripts/fstab_tools/fstab.in
index 266531ac72..82d4fe11fa 100755
--- a/device/rockchip/common/scripts/fstab_tools/fstab.in
+++ b/device/rockchip/common/scripts/fstab_tools/fstab.in
@@ -19,3 +19,5 @@ ${_block_prefix}product /product  ext4 ro,barrier=1 ${_flags},first_stage_mount
 /dev/block/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,fileencryption=software,quota,formattable,reservedsize=128M,checkpoint=fs
 # for ext4
 #/dev/block/by-name/userdata    /data      ext4    discard,noatime,nosuid,nodev,noauto_da_alloc,data=ordered,user_xattr,barrier=1    wait,formattable,check,fileencryption=software,quota,reservedsize=128M
+#add by tuliyuan
+/dev/block/by-name/vtech        /vtech    ext4    noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard	    wait,check
diff --git a/device/rockchip/common/sepolicy/vendor/device.te b/device/rockchip/common/sepolicy/vendor/device.te
index bfc7713c55..231e24daa8 100755
--- a/device/rockchip/common/sepolicy/vendor/device.te
+++ b/device/rockchip/common/sepolicy/vendor/device.te
@@ -32,3 +32,5 @@ type cec_device, dev_type;
 
 #for hid audio
 type hidraw_device, dev_type;
+#for vtech fs
+type vtech_block_device, dev_type;
diff --git a/device/rockchip/common/sepolicy/vendor/file.te b/device/rockchip/common/sepolicy/vendor/file.te
index b3b5b5b14f..78dbc3f30c 100755
--- a/device/rockchip/common/sepolicy/vendor/file.te
+++ b/device/rockchip/common/sepolicy/vendor/file.te
@@ -50,3 +50,4 @@ type sysfs_mmc, fs_type, sysfs_type;
 # input files
 type idc_file, file_type, vendor_file_type;
 type keylayout_file, file_type, vendor_file_type;
+type vtechfs, file_type, data_file_type;
diff --git a/device/rockchip/common/sepolicy/vendor/file_contexts b/device/rockchip/common/sepolicy/vendor/file_contexts
index 4a35a7638d..0f029833ae 100644
--- a/device/rockchip/common/sepolicy/vendor/file_contexts
+++ b/device/rockchip/common/sepolicy/vendor/file_contexts
@@ -71,7 +71,7 @@
 /dev/block/by-name/security                     u:object_r:security_block_device:s0
 /dev/block/by-name/baseparameter                u:object_r:baseparameter_block_device:s0
 /dev/block/by-name/super                        u:object_r:super_block_device:s0
-
+/dev/block/by-name/vtech  			u:object_r:vtech_block_device:s0
 /sys/devices/platform/fb/graphics/fb[0-9]/cabc                u:object_r:sysfs_fb:s0
 /sys/kernel/debug/mali/gpu_memory                u:object_r:sys_mali:s0
 
@@ -176,3 +176,4 @@
 
 #flash_img
 /system/bin/flash_img.sh u:object_r:install_recovery_exec:s0
+/vtech(/.*)? u:object_r:vtechfs:s0
diff --git a/device/rockchip/common/sepolicy/vendor/fsck.te b/device/rockchip/common/sepolicy/vendor/fsck.te
index 9322f9e2c0..4d461d31f5 100644
--- a/device/rockchip/common/sepolicy/vendor/fsck.te
+++ b/device/rockchip/common/sepolicy/vendor/fsck.te
@@ -1,3 +1,4 @@
 allow fsck e2fsck_oem_block_device:blk_file rw_file_perms;
 allow fsck e2fsck_cache_block_device:blk_file rw_file_perms;
 allow fsck e2fsck_frp_block_device:blk_file rw_file_perms;
+allow fsck vtech_block_device:blk_file rw_file_perms;
diff --git a/device/rockchip/common/sepolicy/vendor/init.te b/device/rockchip/common/sepolicy/vendor/init.te
index fadab5af8c..235c32f9bc 100755
--- a/device/rockchip/common/sepolicy/vendor/init.te
+++ b/device/rockchip/common/sepolicy/vendor/init.te
@@ -55,4 +55,7 @@ allow init baseparameter_block_device:lnk_file { relabelto setattr };
 allow init vendor_file:file { execute open};
 allow init oemfs:dir { mounton };
 allow init mnt_vendor_file:dir { mounton };
+allow init vtech_block_device:lnk_file { relabelto };
+allow init vtech_block_device:blk_file { write };
+allow init vtechfs:dir { create setattr getattr mounton };
 dontaudit init proc:file { write setattr };
diff --git a/device/rockchip/common/sepolicy/vendor/system_app.te b/device/rockchip/common/sepolicy/vendor/system_app.te
index ede1d64c4b..0bdd3ae68d 100644
--- a/device/rockchip/common/sepolicy/vendor/system_app.te
+++ b/device/rockchip/common/sepolicy/vendor/system_app.te
@@ -52,3 +52,5 @@ allow system_app proc_net:file { getattr open read };
 get_prop(system_app,serialno_prop)
 get_prop(system_app, vtech_prop)
 set_prop(system_app, vtech_prop)
+allow system_app vtechfs:dir rw_file_perms;
+allow system_app vtechfs:file rw_file_perms;
diff --git a/device/rockchip/common/sepolicy/vendor/vendor_init.te b/device/rockchip/common/sepolicy/vendor/vendor_init.te
index 3712d5d4e5..56b18df594 100644
--- a/device/rockchip/common/sepolicy/vendor/vendor_init.te
+++ b/device/rockchip/common/sepolicy/vendor/vendor_init.te
@@ -38,3 +38,9 @@ set_prop(vendor_init, dalvik_prop)
 set_prop(vendor_init, vendor_drm_prop)
 set_prop(vendor_init, public_vendor_system_prop)
 set_prop(vendor_init, public_vendor_default_prop)
+
+allow vendor_init vtechfs:dir rw_dir_perms;
+allow vendor_init vtech_block_device:lnk_file { relabelto };
+#============= vendor_init ==============
+allow vendor_init vtechfs:dir { create setattr getattr mounton };
+allow vendor_init sysfs:lnk_file { setattr getattr read open };
diff --git a/device/rockchip/common/sepolicy/vendor/vold.te b/device/rockchip/common/sepolicy/vendor/vold.te
index 53562ff34a..c1b81a0c8b 100644
--- a/device/rockchip/common/sepolicy/vendor/vold.te
+++ b/device/rockchip/common/sepolicy/vendor/vold.te
@@ -10,3 +10,5 @@ allow vold self:capability { setgid setuid };
 allow vold vold_device:blk_file ioctl;
 allow vold vold_exec:file execute_no_trans;
 allow vold self:capability { dac_override dac_read_search };
+allow vold vtechfs:dir { read open write getattr setattr };
+#allow vold vtechfs:dir ioctl;
diff --git a/device/rockchip/rk3326/VTECH_VP02/BoardConfig.mk b/device/rockchip/rk3326/VTECH_VP02/BoardConfig.mk
index 817f37284e..f552e2086a 100755
--- a/device/rockchip/rk3326/VTECH_VP02/BoardConfig.mk
+++ b/device/rockchip/rk3326/VTECH_VP02/BoardConfig.mk
@@ -24,3 +24,5 @@ TARGET_CPU_VARIANT := cortex-a53
 TARGET_CPU_SMP := true
 
 PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-10-go.config rk3326.config
+#add by tuliyuan for default vtech parition
+#BOARD_VTECHIMAGE_PARTITION_SIZE := 52428800
diff --git a/device/rockchip/rk3326/VTECH_VP02/parameter.txt b/device/rockchip/rk3326/VTECH_VP02/parameter.txt
index 494598e87d..888983bcb0 100755
--- a/device/rockchip/rk3326/VTECH_VP02/parameter.txt
+++ b/device/rockchip/rk3326/VTECH_VP02/parameter.txt
@@ -8,4 +8,4 @@ MACHINE: 3326
 CHECK_MASK: 0x80
 PWR_HLD: 0,0,A,0,1
 TYPE: GPT
-CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtb),0x00002000@0x0000c000(dtbo),0x00000800@0x0000e000(vbmeta),0x00010000@0x0000e800(boot),0x00030000@0x0001e800(recovery),0x00038000@0x0004e800(backup),0x00002000@0x00086800(security),0x000c0000@0x00088800(cache),0x00008000@0x00148800(metadata),0x00000400@0x00150800(frp),0x004fe000@0x00150c00(super),-@0x0064ec00(userdata:grow)
+CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtb),0x00002000@0x0000c000(dtbo),0x00000800@0x0000e000(vbmeta),0x00010000@0x0000e800(boot),0x00030000@0x0001e800(recovery),0x00038000@0x0004e800(backup),0x00002000@0x00086800(security),0x000c0000@0x00088800(cache),0x00008000@0x00148800(metadata),0x00000400@0x00150800(frp),0x004fe000@0x00150c00(super),0x00010000@0x0064ec00(vtech),-@0x0065ec00(userdata:grow)
diff --git a/device/rockchip/rk3326/VTECH_VP02/recovery.fstab b/device/rockchip/rk3326/VTECH_VP02/recovery.fstab
index d66d0905b8..cb3d950cde 100755
--- a/device/rockchip/rk3326/VTECH_VP02/recovery.fstab
+++ b/device/rockchip/rk3326/VTECH_VP02/recovery.fstab
@@ -24,3 +24,4 @@
 /dev/block/by-name/baseparamer           /baseparamer         emmc             defaults                  defaults
 /dev/block/by-name/vbmeta                /vbmeta              emmc             defaults                  defaults
 /dev/block/by-name/dtbo                /dtbo              emmc             defaults                  defaults
+/dev/block/by-name/vtech               /vtech                 ext4             defaults	   defaults
diff --git a/mkimage.sh b/mkimage.sh
index 134a836cc5..3ffd5a82e9 100755
--- a/mkimage.sh
+++ b/mkimage.sh
@@ -82,6 +82,9 @@ BOARD_DTBO_IMG=$OUT/dtbo.img
 fi
 cp -a $BOARD_DTBO_IMG $IMAGE_PATH/dtbo.img
 echo "done."
+# add by tuliyuan for vtech.img
+echo -n "create vtech.img.... "
+cp -av $OUT/vtech.img $IMAGE_PATH/vtech.img
 
 echo "create boot.img.... "
 if [ "$BOARD_AVB_ENABLE" = "true" ]; then
diff --git a/system/core/rootdir/Android.mk b/system/core/rootdir/Android.mk
index 7ff1588b23..e1c24e5b5e 100644
--- a/system/core/rootdir/Android.mk
+++ b/system/core/rootdir/Android.mk
@@ -121,7 +121,7 @@ endif
 ifdef BOARD_USES_METADATA_PARTITION
   LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/metadata
 endif
-
+LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/vtech
 # For /odm partition.
 LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/odm
 # For Treble Generic System Image (GSI), system-as-root GSI needs to work on
diff --git a/system/sepolicy/prebuilts/api/29.0/public/domain.te b/system/sepolicy/prebuilts/api/29.0/public/domain.te
index 5f2b8ba694..7ed1ddb5df 100755
--- a/system/sepolicy/prebuilts/api/29.0/public/domain.te
+++ b/system/sepolicy/prebuilts/api/29.0/public/domain.te
@@ -838,6 +838,7 @@ full_treble_only(`
     -appdomain # TODO(b/34980020) remove exemption for appdomain
     -data_between_core_and_vendor_violators
     -init
+    -vold
     -vold_prepare_subdirs
     } {
       data_file_type
diff --git a/system/sepolicy/public/domain.te b/system/sepolicy/public/domain.te
index 5f2b8ba694..7ed1ddb5df 100755
--- a/system/sepolicy/public/domain.te
+++ b/system/sepolicy/public/domain.te
@@ -838,6 +838,7 @@ full_treble_only(`
     -appdomain # TODO(b/34980020) remove exemption for appdomain
     -data_between_core_and_vendor_violators
     -init
+    -vold
     -vold_prepare_subdirs
     } {
       data_file_type
-- 
2.17.1

Android 11 RK 3568新增分区

commit 51849e99cfaa66ea290611a6e8943e16e0f90909
Author: tuly <975150240@qq.com>
Date:   Mon Dec 5 15:58:06 2022 +0800

    [all] [New Partition] 1.新增分区Fos. 2.增加shell环境对fos的读写权限

diff --git a/build/make/core/Makefile b/build/make/core/Makefile
index eb82c5c96a..ce51222543 100755
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -1722,6 +1722,13 @@ $(if $(filter $(2),cache),\
     $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1))
     $(hide) echo "cache_selinux_fc=$(SELINUX_FC)" >> $(1)
 )
+# add tuliyuan  fos parition --start
+ $(if $(filter $(2),fos),\
+    $(if $(BOARD_FOSIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "fos_fs_type=$(BOARD_FOSIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
+    $(if $(BOARD_FOSIMAGE_PARTITION_SIZE),$(hide) echo "fos_size=$(BOARD_FOSIMAGE_PARTITION_SIZE)" >> $(1))
+    $(hide) echo "fos_selinux_fc=$(SELINUX_FC)" >> $(1)
+)
+# add tuliyuan fos parition --end
 $(if $(filter $(2),vendor),\
     $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
     $(if $(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT),$(hide) echo "vendor_extfs_inode_count=$(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT)" >> $(1))
@@ -1867,6 +1874,11 @@ PROP_DICTIONARY_IMAGES := oem
 ifdef BUILDING_CACHE_IMAGE
   PROP_DICTIONARY_IMAGES += cache
 endif
+#add tuliyuan fos parition --start
+ifdef BUILDING_FOS_IMAGE
+  PROP_DICTIONARY_IMAGES += fos
+endif
+#add tuliyuan fos parition --end
 ifdef BUILDING_SYSTEM_IMAGE
   PROP_DICTIONARY_IMAGES += system
 endif
@@ -3034,6 +3046,45 @@ else # BUILDING_CACHE_IMAGE
 IGNORE_CACHE_LINK := --exclude=cache
 endif # BUILDING_CACHE_IMAGE
 
+
+#tuliyuan add parition --end
+# -----------------------------------------------------------------
+# fos partition image
+ifdef BUILDING_FOS_IMAGE
+INTERNAL_FOSIMAGE_FILES := \
+    $(filter $(TARGET_OUT_FOS)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
+
+fosimage_intermediates := \
+    $(call intermediates-dir-for,PACKAGING,fos)
+BUILT_FOSIMAGE_TARGET := $(PRODUCT_OUT)/fos.img
+
+define build-fosimage-target
+  $(call pretty,"Target fos fs image: $(INSTALLED_FOSIMAGE_TARGET)")
+  @mkdir -p $(TARGET_OUT_FOS)
+  @mkdir -p $(fosimage_intermediates) && rm -rf $(fosimage_intermediates)/fos_image_info.txt
+  $(call generate-image-prop-dictionary, $(fosimage_intermediates)/fos_image_info.txt,fos,skip_fsck=true)
+  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
+      $(BUILD_IMAGE) \
+          $(TARGET_OUT_FOS) $(fosimage_intermediates)/fos_image_info.txt \
+          $(INSTALLED_FOSIMAGE_TARGET) $(TARGET_OUT)
+  $(call assert-max-image-size,$(INSTALLED_FOSIMAGE_TARGET),$(BOARD_FOSIMAGE_PARTITION_SIZE))
+endef
+
+# We just build this directly to the install location.
+INSTALLED_FOSIMAGE_TARGET := $(BUILT_FOSIMAGE_TARGET)
+$(INSTALLED_FOSIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_FOSIMAGE_FILES)
+	$(build-fosimage-target)
+
+.PHONY: fosimage-nodeps
+fosimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
+	$(build-fosimage-target)
+	
+else # BUILDING_FOS_IMAGE
+# we need to ignore the broken fos link when doing the rsync
+IGNORE_FOS_LINK := --exclude=fos
+endif
+#tuliyuan add parition --end
+
 # -----------------------------------------------------------------
 # system_other partition image
 ifdef BUILDING_SYSTEM_OTHER_IMAGE
@@ -4586,6 +4637,7 @@ endif
 
 # Depending on the various images guarantees that the underlying
 # directories are up-to-date.
+#tuliyuan add  $(INSTALLED_FOSIMAGE_TARGET) for parition
 $(BUILT_TARGET_FILES_PACKAGE): \
 	    $(INSTALLED_RAMDISK_TARGET) \
 	    $(INSTALLED_BOOTIMAGE_TARGET) \
@@ -4594,6 +4646,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \
 	    $(INSTALLED_RECOVERYIMAGE_TARGET) \
 	    $(INSTALLED_USERDATAIMAGE_TARGET) \
 	    $(INSTALLED_CACHEIMAGE_TARGET) \
+	    $(INSTALLED_FOSIMAGE_TARGET) \
 	    $(INSTALLED_VENDORIMAGE_TARGET) \
 	    $(INSTALLED_PRODUCTIMAGE_TARGET) \
 	    $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) \
diff --git a/build/make/core/board_config.mk b/build/make/core/board_config.mk
index 86162b6f37..871dba63c2 100755
--- a/build/make/core/board_config.mk
+++ b/build/make/core/board_config.mk
@@ -54,6 +54,7 @@ _board_strip_readonly_list := \
   WITH_DEXPREOPT \
 
 # File system variables
+#add tuliyuan fos parition add BOARD_FOSIMAGE_PARTITION_SIZE BOARD_FOSIMAGE_FILE_SYSTEM_TYPE
 _board_strip_readonly_list += \
   BOARD_FLASH_BLOCK_SIZE \
   BOARD_BOOTIMAGE_PARTITION_SIZE \
@@ -64,6 +65,8 @@ _board_strip_readonly_list += \
   BOARD_USERDATAIMAGE_PARTITION_SIZE \
   BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE \
   BOARD_CACHEIMAGE_PARTITION_SIZE \
+  BOARD_FOSIMAGE_FILE_SYSTEM_TYPE \
+  BOARD_FOSIMAGE_PARTITION_SIZE \
   BOARD_VENDORIMAGE_PARTITION_SIZE \
   BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE \
   BOARD_PRODUCTIMAGE_PARTITION_SIZE \
@@ -330,6 +333,22 @@ else ifeq ($(PRODUCT_BUILD_CACHE_IMAGE),true)
 endif
 .KATI_READONLY := BUILDING_CACHE_IMAGE
 
+#add tuliyuan add fos parition --start
+# Are we building a fos image
+BUILDING_FOS_IMAGE :=
+ifeq ($(PRODUCT_BUILD_FOS_IMAGE),)
+  ifdef BOARD_FOSIMAGE_FILE_SYSTEM_TYPE
+    BUILDING_FOS_IMAGE := true
+  endif
+else ifeq ($(PRODUCT_BUILD_FOS_IMAGE),true)
+  BUILDING_FOS_IMAGE := true
+  ifndef BOARD_FOSIMAGE_FILE_SYSTEM_TYPE
+    $(error PRODUCT_BUILD_FOS_IMAGE set to true, but BOARD_FOSIMAGE_FILE_SYSTEM_TYPE not defined)
+  endif
+endif
+.KATI_READONLY := BUILDING_FOS_IMAGE
+#add tuliyuan add fos parition --end
+
 # Are we building a boot image
 BUILDING_BOOT_IMAGE :=
 ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
diff --git a/build/make/core/config.mk b/build/make/core/config.mk
index 90eea5ba99..2e973a7fea 100755
--- a/build/make/core/config.mk
+++ b/build/make/core/config.mk
@@ -1209,10 +1209,12 @@ endif
 
 # These goals don't need to collect and include Android.mks/CleanSpec.mks
 # in the source tree.
+#add tuliyuan add parition fosimage-nodeps
 dont_bother_goals := out \
     snod systemimage-nodeps \
     userdataimage-nodeps \
     cacheimage-nodeps \
+    fosimage-nodeps \
     bptimage-nodeps \
     vnod vendorimage-nodeps \
     pnod productimage-nodeps \
diff --git a/build/make/core/envsetup.mk b/build/make/core/envsetup.mk
index f4650f99f3..2a82001f95 100755
--- a/build/make/core/envsetup.mk
+++ b/build/make/core/envsetup.mk
@@ -581,7 +581,10 @@ $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA
 
 TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
 .KATI_READONLY := TARGET_OUT_CACHE
-
+#add tuliyuan add parition --start
+TARGET_OUT_FOS := $(PRODUCT_OUT)/fos
+.KATI_READONLY := TARGET_OUT_FOS
+#add tuliyuan add parition --end
 TARGET_OUT_VENDOR := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)
 .KATI_READONLY := TARGET_OUT_VENDOR
 ifneq ($(filter address,$(SANITIZE_TARGET)),)
diff --git a/build/make/core/main.mk b/build/make/core/main.mk
index 85b5841a9b..73ec8b4fe1 100755
--- a/build/make/core/main.mk
+++ b/build/make/core/main.mk
@@ -1406,6 +1406,11 @@ endif
 .PHONY: cacheimage
 cacheimage: $(INSTALLED_CACHEIMAGE_TARGET)
 
+#add tuliyuan add parition --start
+.PHONY: fosimage
+fosimage: $(INSTALLED_FOSIMAGE_TARGET)
+#add tuliyuan add parition --end
+
 .PHONY: bptimage
 bptimage: $(INSTALLED_BPTIMAGE_TARGET)
 
@@ -1449,6 +1454,7 @@ vbmetaimage: $(INSTALLED_VBMETAIMAGE_TARGET)
 auxiliary: $(INSTALLED_AUX_TARGETS)
 
 # Build files and then package it into the rom formats
+#add tuliyuan add $(INSTALLED_FOSIMAGE_TARGET) \
 .PHONY: droidcore
 droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
     $(INSTALLED_SYSTEMIMAGE_TARGET) \
@@ -1461,6 +1467,7 @@ droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
     $(INSTALLED_VBMETAIMAGE_TARGET) \
     $(INSTALLED_USERDATAIMAGE_TARGET) \
     $(INSTALLED_CACHEIMAGE_TARGET) \
+    $(INSTALLED_FOSIMAGE_TARGET) \
     $(INSTALLED_BPTIMAGE_TARGET) \
     $(INSTALLED_VENDORIMAGE_TARGET) \
     $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \
diff --git a/build/make/core/product.mk b/build/make/core/product.mk
index f8ba5936f8..3174da7912 100755
--- a/build/make/core/product.mk
+++ b/build/make/core/product.mk
@@ -375,6 +375,8 @@ _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
+#add tuliyuan fos parition
+_product_single_value_vars += PRODUCT_BUILD_FOS_IMAGE
 _product_single_value_vars += PRODUCT_BUILD_RAMDISK_IMAGE
 _product_single_value_vars += PRODUCT_BUILD_USERDATA_IMAGE
 _product_single_value_vars += PRODUCT_BUILD_RECOVERY_IMAGE
diff --git a/build/make/tools/releasetools/build_image.py b/build/make/tools/releasetools/build_image.py
index 8cf074147e..c62bc558fa 100755
--- a/build/make/tools/releasetools/build_image.py
+++ b/build/make/tools/releasetools/build_image.py
@@ -614,6 +614,12 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):
     copy_prop("cache_fs_type", "fs_type")
     copy_prop("cache_size", "partition_size")
     copy_prop("cache_selinux_fc", "selinux_fc")
+    #add tuliyuan add fos parition --start
+  elif mount_point == "fos":
+    copy_prop("fos_fs_type", "fs_type")
+    copy_prop("fos_size", "partition_size")
+    copy_prop("fos_selinux_fc", "selinux_fc")
+     #add tuliyuan add fos parition --end
   elif mount_point == "vendor":
     copy_prop("avb_vendor_hashtree_enable", "avb_hashtree_enable")
     copy_prop("avb_vendor_add_hashtree_footer_args",
@@ -787,6 +793,10 @@ def main(argv):
       mount_point = "data"
     elif image_filename == "cache.img":
       mount_point = "cache"
+    #add tuliyuan add fos parition --start
+    elif image_filename == "fos.img":
+      mount_point = "fos"
+     #add tuliyuan add fos parition --end
     elif image_filename == "vendor.img":
       mount_point = "vendor"
     elif image_filename == "odm.img":
diff --git a/device/rockchip/common/BoardConfig.mk b/device/rockchip/common/BoardConfig.mk
index e03c54f6a0..b41a56396c 100755
--- a/device/rockchip/common/BoardConfig.mk
+++ b/device/rockchip/common/BoardConfig.mk
@@ -139,6 +139,7 @@ DEVICE_MANIFEST_FILE ?= device/rockchip/common/manifest.xml
 DEVICE_MATRIX_FILE   ?= device/rockchip/common/compatibility_matrix.xml
 
 #Calculate partition size from parameter.txt
+#add by tuliyuan for fos partition BOARD_FOSIMAGE_PARTITION_SIZE
 USE_DEFAULT_PARAMETER := $(shell test -f $(TARGET_DEVICE_DIR)/parameter.txt && echo true)
 ifeq ($(strip $(USE_DEFAULT_PARAMETER)), true)
   ifeq ($(PRODUCT_USE_DYNAMIC_PARTITIONS), true)
@@ -153,6 +154,7 @@ ifeq ($(strip $(USE_DEFAULT_PARAMETER)), true)
   BOARD_BOOTIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt boot)
   BOARD_DTBOIMG_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt dtbo)
   BOARD_RECOVERYIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt recovery)
+  BOARD_FOSIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt fos)
   # Header V3, add vendor_boot
   ifeq (1,$(strip $(shell expr $(BOARD_BOOT_HEADER_VERSION) \>= 3)))
     BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE := $(shell python device/rockchip/common/get_partition_size.py $(TARGET_DEVICE_DIR)/parameter.txt vendor_boot)
@@ -289,7 +291,10 @@ RECOVERY_UPDATEIMG_RSA_CHECK ?= false
 
 # use ext4 cache for OTA
 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE ?= ext4
-
+# add tuliyuan add fos parition --start
+BOARD_FOSIMAGE_FILE_SYSTEM_TYPE ?= ext4
+BOARD_FOSIMAGE_PARTITION_SIZE := 52428800
+# add tuliyuan add fos parition --end
 TARGET_USES_MKE2FS ?= true
 
 RECOVERY_BOARD_ID ?= false
diff --git a/device/rockchip/common/build/rockchip/RebuildParameter.mk b/device/rockchip/common/build/rockchip/RebuildParameter.mk
index e1ccb55748..3688c02a82 100755
--- a/device/rockchip/common/build/rockchip/RebuildParameter.mk
+++ b/device/rockchip/common/build/rockchip/RebuildParameter.mk
@@ -35,7 +35,9 @@ endif
 ifeq ($(strip $(BOARD_SUPER_PARTITION_GROUPS)),rockchip_dynamic_partitions)
 partition_list := $(partition_list),super:$(BOARD_SUPER_PARTITION_SIZE)
 endif # BOARD_USE_DYNAMIC_PARTITIONS
-
+#add tuliyuan add fos parition --start
+partition_list := $(partition_list),fos:$(BOARD_FOSIMAGE_PARTITION_SIZE)
+#add tuliyuan --end
 intermediates := $(call intermediates-dir-for,FAKE,rockchip_parameter)
 rebuild_parameter := $(intermediates)/parameter.txt
 
diff --git a/device/rockchip/common/init.rk30board.rc b/device/rockchip/common/init.rk30board.rc
index db25dcb36e..40d9f67fab 100755
--- a/device/rockchip/common/init.rk30board.rc
+++ b/device/rockchip/common/init.rk30board.rc
@@ -17,6 +17,12 @@ on post-fs-data
     mkdir /data/vendor/logs 0755 root shell
     mkdir /data/vendor/audio 0755 system system
 
+on post-fs
+    #remount fos selinux perms
+    chown system system /fos
+    chmod 0771 /fos
+    restorecon_recursive /fos
+
 on early-init
     write /sys/devices/system/cpu/cpufreq/policy0/scaling_governor performance
     write /sys/class/devfreq/dmc/governor performance
diff --git a/device/rockchip/common/scripts/fstab_tools/fstab.in b/device/rockchip/common/scripts/fstab_tools/fstab.in
index 10c3d2ee85..d1e0c2eddb 100755
--- a/device/rockchip/common/scripts/fstab_tools/fstab.in
+++ b/device/rockchip/common/scripts/fstab_tools/fstab.in
@@ -10,6 +10,8 @@ ${_block_prefix}system_ext /system_ext  ext4 ro,barrier=1 ${_flags},first_stage_
 /dev/block/by-name/metadata /metadata ext4 nodev,noatime,nosuid,discard,sync wait,formattable,first_stage_mount,check
 /dev/block/by-name/misc         /misc               emmc      defaults     defaults
 /dev/block/by-name/cache          /cache              ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard                wait,check
+#add tuliyuan add for fos parition
+/dev/block/by-name/fos          /fos              ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard                wait,check
 
 /devices/platform/*usb*   auto vfat defaults      voldmanaged=usb:auto
 
diff --git a/device/rockchip/common/sepolicy/vendor/device.te b/device/rockchip/common/sepolicy/vendor/device.te
index a3b4c8a34c..630f3ca2b2 100755
--- a/device/rockchip/common/sepolicy/vendor/device.te
+++ b/device/rockchip/common/sepolicy/vendor/device.te
@@ -33,3 +33,5 @@ type cec_device, dev_type;
 
 #for hid audio
 type hidraw_device, dev_type;
+#add tuliyuan add fos parition block device
+type fos_block_device, dev_type;
diff --git a/device/rockchip/common/sepolicy/vendor/file.te b/device/rockchip/common/sepolicy/vendor/file.te
index 464180c68b..ed68bb6d84 100755
--- a/device/rockchip/common/sepolicy/vendor/file.te
+++ b/device/rockchip/common/sepolicy/vendor/file.te
@@ -53,3 +53,5 @@ type sysfs_mmc, fs_type, sysfs_type;
 # input files
 type idc_file, file_type, vendor_file_type;
 type keylayout_file, file_type, vendor_file_type;
+# tuliyuan add fos partition
+type fos_data_file_type, file_type, mlstrustedobject;;
diff --git a/device/rockchip/common/sepolicy/vendor/file_contexts b/device/rockchip/common/sepolicy/vendor/file_contexts
index e0a46b296e..939d13fbfe 100755
--- a/device/rockchip/common/sepolicy/vendor/file_contexts
+++ b/device/rockchip/common/sepolicy/vendor/file_contexts
@@ -80,6 +80,8 @@
 /dev/block/by-name/baseparameter                u:object_r:baseparameter_block_device:s0
 /dev/block/by-name/super                        u:object_r:super_block_device:s0
 
+#add by tuliyuan for add fos partition
+/dev/block/by-name/fos  			u:object_r:fos_block_device:s0
 # for A/B
 /dev/block/by-name/boot_[ab]                    u:object_r:boot_block_device:s0
 /dev/block/by-name/uboot_[ab]                   u:object_r:uboot_block_device:s0
@@ -220,4 +222,5 @@
 
 #flash_img
 /vendor/bin/flash_img.sh u:object_r:vendor_install_recovery_exec:s0
-
+#add by tuliyuan for partition
+/fos(/.*)?   u:object_r:fos_data_file_type:s0
diff --git a/device/rockchip/common/sepolicy/vendor/fsck.te b/device/rockchip/common/sepolicy/vendor/fsck.te
index 77ed0b109c..68223596ee 100755
--- a/device/rockchip/common/sepolicy/vendor/fsck.te
+++ b/device/rockchip/common/sepolicy/vendor/fsck.te
@@ -2,3 +2,6 @@ allow fsck e2fsck_oem_block_device:blk_file rw_file_perms;
 allow fsck e2fsck_cache_block_device:blk_file rw_file_perms;
 allow fsck e2fsck_frp_block_device:blk_file rw_file_perms;
 allow fsck sysfs_dm:dir { search };
+#add tuliyuan add fos partition --start
+allow fsck fos_block_device:blk_file rw_file_perms;
+#add tuliyuan add fos partition --end
diff --git a/device/rockchip/common/sepolicy/vendor/init.te b/device/rockchip/common/sepolicy/vendor/init.te
index e614ec7fa3..5e5f7f58a3 100755
--- a/device/rockchip/common/sepolicy/vendor/init.te
+++ b/device/rockchip/common/sepolicy/vendor/init.te
@@ -61,3 +61,8 @@ set_prop(init, vendor_system_public_prop)
 r_dir_file(init, nativetest_data_file)
 rw_rockchip_graphic_device(init)
 set_prop(init, debug_prop)
+#add tuliyuan add fos partition --start
+allow init fos_block_device:lnk_file { relabelto };
+allow init fos_block_device:blk_file { write };
+allow init fos_data_file_type:dir { create setattr getattr mounton };
+#add tuliyuan add fos partition --end
diff --git a/device/rockchip/common/sepolicy/vendor/shell.te b/device/rockchip/common/sepolicy/vendor/shell.te
index 8abffee5dd..f9ecf36ad8 100755
--- a/device/rockchip/common/sepolicy/vendor/shell.te
+++ b/device/rockchip/common/sepolicy/vendor/shell.te
@@ -46,3 +46,7 @@ allow shell gpu_data_file:file rw_file_perms;
 allow shell metadata_file:file r_file_perms;
 
 rw_rockchip_graphic_device(shell)
+#add by tuliyuan for add fos parition --start
+allow vendor_init fos_data_file_type:dir rw_dir_perms;
+allow vendor_init fos_data_file_type:file rw_file_perms;
+#add by tuliyuan for add fos parition --end
diff --git a/device/rockchip/common/sepolicy/vendor/vendor_init.te b/device/rockchip/common/sepolicy/vendor/vendor_init.te
index d1f9511520..c6aff7cce5 100755
--- a/device/rockchip/common/sepolicy/vendor/vendor_init.te
+++ b/device/rockchip/common/sepolicy/vendor/vendor_init.te
@@ -35,3 +35,9 @@ set_prop(vendor_init, vendor_boot_complete_prop)
 get_prop(vendor_init, public_vendor_default_prop)
 get_prop(vendor_init, vendor_system_public_prop)
 get_prop(vendor_init, vendor_drm_prop)
+#tuliyuan add for fos partition --start
+allow vendor_init fos_block_device:lnk_file { relabelto };
+allow vendor_init fos_data_file_type:dir rw_dir_perms;
+allow vendor_init fos_data_file_type:file rw_file_perms;
+allow vendor_init fos_data_file_type:dir { mounton };
+#tuliyuan add for fos partition --end
diff --git a/device/rockchip/common/sepolicy/vendor/vold.te b/device/rockchip/common/sepolicy/vendor/vold.te
index 647b1ea54e..981964646e 100755
--- a/device/rockchip/common/sepolicy/vendor/vold.te
+++ b/device/rockchip/common/sepolicy/vendor/vold.te
@@ -11,3 +11,8 @@ allow vold vold_device:blk_file ioctl;
 allow vold vold_exec:file execute_no_trans;
 allow vold self:capability { dac_override dac_read_search };
 allow vold sysfs_mmc:file rw_file_perms;
+#tuliyuan add fos partition --start
+#avc: denied { ioctl } for path="/fos" dev="dm-0" ino=25 ioctlcmd=0x5879 scontext=u:r:vold:s0 tcontext=u:object_r:fos_data_file_type:s0 tclass=dir permissive=0
+allow vold fos_data_file_type:dir { read open write getattr setattr };
+allow vold fos_block_device:blk_file getattr;
+#tuliyuan add fos partition --end
diff --git a/device/rockchip/rk356x/rk3568_r/recovery.fstab b/device/rockchip/rk356x/rk3568_r/recovery.fstab
index 08567914fd..3e6b3e0f0f 100755
--- a/device/rockchip/rk356x/rk3568_r/recovery.fstab
+++ b/device/rockchip/rk356x/rk3568_r/recovery.fstab
@@ -27,3 +27,5 @@
 /dev/block/by-name/vbmeta                /vbmeta              emmc             defaults                  defaults
 /dev/block/by-name/dtbo                /dtbo              emmc             defaults                  defaults
 /dev/block/by-name/vendor_boot           /vendor_boot                emmc             defaults                  defaults
+#add bytuliyuan for add new parition
+/dev/block/by-name/fos                   /fos                 ext4             defaults	   defaults
diff --git a/mkimage.sh b/mkimage.sh
index 2aa485a797..fadf0b72d9 100755
--- a/mkimage.sh
+++ b/mkimage.sh
@@ -92,6 +92,187 @@ fi
 cp -a $BOARD_DTBO_IMG $IMAGE_PATH/dtbo.img
 echo "done."
 
+# add by tuliyuan for FOS.img
+echo -n "create fos.img.... "
+cp -av $OUT/fos.img $IMAGE_PATH/fos.img
+echo "done."
+
+echo "create resource.img..."
+if [ -f "kernel/resource.img" ]; then
+    cp -a kernel/resource.img $IMAGE_PATH/resource.img
+    echo "done."
+fi
+
+copy_images_from_out boot.img
+copy_images_from_out boot-debug.img
+copy_images_from_out vendor_boot.img
+copy_images_from_out vendor_boot-debug.img
+copy_images_from_out recovery.img
+copy_images_from_out super.img
+
+if [ ! "$PRODUCT_USE_DYNAMIC_PARTITIONS" = "true" ]; then
+copy_images_from_out system.img
+copy_images_from_out system_ext.img
+copy_images_from_out vendor.img
+copy_images_from_out odm.img
+copy_images_from_out product.img
+fi
+
+echo "create vbmeta.img..."
+if [ "$BOARD_AVB_ENABLE" = "true" ]; then
+cp -a $OUT/vbmeta.img $IMAGE_PATH/vbmeta.img
+else
+echo "BOARD_AVB_ENABLE is false, use default vbmeta.img"
+cp -a device/rockchip/common/vbmeta.img $IMAGE_PATH/vbmeta.img
+fi
+
+echo -n "create misc.img.... "
+cp -a rkst/Image/misc.img $IMAGE_PATH/misc.img
+cp -a rkst/Image/pcba_small_misc.img $IMAGE_PATH/pcba_small_misc.img
+cp -a rkst/Image/pcba_whole_misc.img $IMAGE_PATH/pcba_whole_misc.img
+echo "done."
+
+if [ -f $UBOOT_PATH/uboot.img ]
+then
+	echo "create uboot.img..."
+	cp -a $UBOOT_PATH/uboot.img $IMAGE_PATH/uboot.img
+else
+	echo "$UBOOT_PATH/uboot.img not fount! Please make it from $UBOOT_PATH first!"
+fi
+
+if [ -f $UBOOT_PATH/trust_nand.img ]
+then
+        echo "create trust.img..."
+        cp -a $UBOOT_PATH/trust_nand.img $IMAGE_PATH/trust.img
+elif [ -f $UBOOT_PATH/trust_with_ta.img ]
+then
+        echo "create trust.img..."
+        cp -a $UBOOT_PATH/trust_with_ta.img $IMAGE_PATH/trust.img
+elif [ -f $UBOOT_PATH/trust.img ]
+then
+        echo "create trust.img..."
+        cp -a $UBOOT_PATH/trust.img $IMAGE_PATH/trust.img
+else    
+        echo "$UBOOT_PATH/trust.img not fount! Please make it from $UBOOT_PATH first!"
+fi
+
+if [ "$HIGH_RELIABLE_RECOVERY_OTA" = "true" ]; then
+	if [ -f $UBOOT_PATH/uboot_ro.img ]
+	then
+		echo -n "HIGH_RELIABLE_RECOVERY_OTA is true. create uboot_ro.img..."
+		cp -a $UBOOT_PATH/uboot_ro.img $IMAGE_PATH/uboot_ro.img
+		cp -a $IMAGE_PATH/trust.img $IMAGE_PATH/trust_ro.img
+		echo "done."
+	else
+		echo "$UBOOT_PATH/uboot_ro.img not fount! Please make it from $UBOOT_PATH first!"
+	fi
+fi
+
+if [ -f $UBOOT_PATH/*_loader_*.bin ]
+then
+        echo "create loader..."
+        cp -a $UBOOT_PATH/*_loader_*.bin $IMAGE_PATH/MiniLoaderAll.bin
+else
+	if [ -f $UBOOT_PATH/*loader*.bin ]; then
+		echo "create loader..."
+		cp -a $UBOOT_PATH/*loader*.bin $IMAGE_PATH/MiniLoaderAll.bin
+	elif [ "$TARGET_PRODUCT" == "px3" -a -f $UBOOT_PATH/RKPX3Loader_miniall.bin ]; then
+        echo "create loader..."
+        cp -a $UBOOT_PATH/RKPX3Loader_miniall.bin $IMAGE_PATH/MiniLoaderAll.bin
+	else
+        echo "$UBOOT_PATH/*MiniLoaderAll_*.bin not fount! Please make it from $UBOOT_PATH first!"
+	fi
+fi
+
+if [ -f $FLASH_CONFIG_FILE ]
+then
+    echo "create config.cfg..."
+    cp -a $FLASH_CONFIG_FILE $IMAGE_PATH/config.cfg
+else
+    echo "$FLASH_CONFIG_FILE not fount!"
+fi
+
+if [ -f $PARAMETER ]
+then
+				if [ "$HIGH_RELIABLE_RECOVERY_OTA" = "true" ]; then
+	        echo -n "create parameter...HIGH_RELIABLE_RECOVERY_OTA is ture. "
+	        echo -n "create parameter from hrr..."
+	        if [ -f $PARAMETER ]; then
+						cp -a ${TARGET_DEVICE_DIR}/parameter_hrr.txt $IMAGE_PATH/parameter.txt
+						echo "done."
+	        else
+						echo "${TARGET_DEVICE_DIR}/parameter_hrr.txt not fount! Please make it from ${TARGET_DEVICE_DIR} first!"
+	        fi
+	      else
+					echo -n "create parameter..."
+	        cp -a $PARAMETER $IMAGE_PATH/parameter.txt
+	        echo "done."
+	      fi
+else
+    if [ -f $OUT/parameter.txt ]; then
+        cp -a $OUT/parameter.txt $IMAGE_PATH/parameter.txt
+    else
+        echo "$PARAMETER not fount!"
+    fi
+fi
+
+SHARED_LIBRARIES_DIR=out/host/linux-x86/lib64
+JAVA_LIBRARIES_DIR=out/host/linux-x86/framework
+OTA_KEY_DIR=build/target/product/security
+
+if [ $TARGET == $BOOT_OTA ]; then
+    echo "create update_loader.zip.."
+    python build/tools/releasetools/package_loader_zip.py  $IMAGE_PATH/MiniLoaderAll.bin  $IMAGE_PATH/update_loader_unsigned.zip
+    java -Djava.library.path=$SHARED_LIBRARIES_DIR -jar $JAVA_LIBRARIES_DIR/signapk.jar -w $OTA_KEY_DIR/testkey.x509.pem $OTA_KEY_DIR/testkey.pk8 $IMAGE_PATH/update_loader_unsigned.zip $IMAGE_PATH/update_loader.zip
+    rm $IMAGE_PATH/update_loader_unsigned.zip
+    echo "done."
+fi
+
+if [ "$TARGET_BASE_PARAMETER_IMAGE"x != ""x ]
+then
+    if [ -f $TARGET_BASE_PARAMETER_IMAGE ]
+    then
+        echo -n "create baseparameter..."
+        cp -a $TARGET_BASE_PARAMETER_IMAGE $IMAGE_PATH/baseparameter.img
+        echo "done."
+    else
+        echo "$TARGET_BASE_PARAMETER_IMAGE not fount!"
+    fi
+fi
+
+if [ $TARGET == $BOOT_OTA ]
+then
+if [ "$PRODUCT_USE_DYNAMIC_PARTITIONS" = "true" ]; then
+    cp -rf  $OUT/obj/PACKAGING/super.img_intermediates/super.img  $IMAGE_PATH/
+fi
+echo -n "create system.img boot.img oem.img vendor.img dtbo.img vbmeta.img for OTA..."
+cp -rf  $OUT/obj/PACKAGING/target_files_intermediates/*-target_files*/IMAGES/*.img  $IMAGE_PATH/
+rm -rf  $IMAGE_PATH/cache.img
+rm -rf  $IMAGE_PATH/recovery-two-step.img
+if [ "$PRODUCT_USE_DYNAMIC_PARTITIONS" = "true" ]; then
+    rm -rf  $IMAGE_PATH/super_empty.img
+fi
+if [ "$BOARD_AVB_ENABLE" = "true" ]; then
+    echo "AVB Enable"
+    cp -rf  $OUT/obj/PACKAGING/target_files_intermediates/*-target_files*/VENDOR/etc/recovery.img  $IMAGE_PATH/
+fi
+echo "done."
+fi
+
+IS_EBOOK=`get_build_var BUILD_WITH_RK_EBOOK`
+ebook_logo_tool=rkbin/tools/bmp2gray16
+if [ $IS_EBOOK == "true" ]; then
+    if [ -f ${TARGET_DEVICE_DIR}/waveform.img ]; then
+        cp ${TARGET_DEVICE_DIR}/waveform.img $IMAGE_PATH/
+    fi
+    if [ -f $ebook_logo_tool ]; then
+        EINK_LOGO_PATH=${TARGET_DEVICE_DIR}/eink_logo/
+        echo -n "create logo.img for uboot/charging/kernel logo"
+        $ebook_logo_tool --uboot-logo $EINK_LOGO_PATH/uboot_logo/uboot.bmp --kernel-logo $EINK_LOGO_PATH/kernel_logo/kernel.bmp --charge-logo $EINK_LOGO_PATH/uboot_logo/battery_0.bmp $EINK_LOGO_PATH/uboot_logo/battery_1.bmp $EINK_LOGO_PATH/uboot_logo/battery_2.bmp $EINK_LOGO_PATH/uboot_logo/battery_3.bmp $EINK_LOGO_PATH/uboot_logo/battery_4.bmp $EINK_LOGO_PATH/uboot_logo/battery_5.bmp $EINK_LOGO_PATH/uboot_logo/battery_fail.bmp --poweroff-logo $EINK_LOGO_PATH/uboot_logo/poweroff.bmp --output $IMAGE_PATH/logo.img
+    fi
+fi
+
+chmod a+r -R $IMAGE_PATH/
 echo "create resource.img..."
 if [ -f "kernel/resource.img" ]; then
     cp -a kernel/resource.img $IMAGE_PATH/resource.img
diff --git a/system/core/rootdir/Android.mk b/system/core/rootdir/Android.mk
index a9d0ed08a9..91d51bc853 100755
--- a/system/core/rootdir/Android.mk
+++ b/system/core/rootdir/Android.mk
@@ -125,6 +125,9 @@ ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
 else
   LOCAL_POST_INSTALL_CMD += ; ln -sf /data/cache $(TARGET_ROOT_OUT)/cache
 endif
+#add tuliyuan create fos parition --start
+LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/fos
+#add tuliyuan create fos parition --end
 ifdef BOARD_ROOT_EXTRA_SYMLINKS
 # BOARD_ROOT_EXTRA_SYMLINKS is a list of <target>:<link_name>.
   LOCAL_POST_INSTALL_CMD += $(foreach s, $(BOARD_ROOT_EXTRA_SYMLINKS),\

补充一下

--- a/RKTools/linux/Linux_Pack_Firmware/rockdev/package-file-rk356x
+++ b/RKTools/linux/Linux_Pack_Firmware/rockdev/package-file-rk356x
@@ -13,6 +13,7 @@ vbmeta      Image/vbmeta.img
 recovery    Image/recovery.img
 baseparameter    Image/baseparameter.img
 super      Image/super.img
+fos      Image/fos.img

diff --git a/device/rockchip/common/sepolicy/vendor/init.te b/device/rockchip/common/sepolicy/vendor/init.te
index 5e5f7f58a3..c5826d5fc0 100755
--- a/device/rockchip/common/sepolicy/vendor/init.te
+++ b/device/rockchip/common/sepolicy/vendor/init.te
@@ -63,6 +63,6 @@ rw_rockchip_graphic_device(init)
 set_prop(init, debug_prop)
 #add tuliyuan add fos partition --start
 allow init fos_block_device:lnk_file { relabelto };
-allow init fos_block_device:blk_file { write };
+allow init fos_block_device:blk_file { rw_file_perms };
 allow init fos_data_file_type:dir { create setattr getattr mounton };
 #add tuliyuan add fos partition --end
diff --git a/device/rockchip/common/sepolicy/vendor/vold.te b/device/rockchip/common/sepolicy/vendor/vold.te
index 981964646e..b4c4daba76 100755
--- a/device/rockchip/common/sepolicy/vendor/vold.te
+++ b/device/rockchip/common/sepolicy/vendor/vold.te
@@ -13,6 +13,6 @@ allow vold self:capability { dac_override dac_read_search };
 allow vold sysfs_mmc:file rw_file_perms;
 #tuliyuan add fos partition --start
 #avc: denied { ioctl } for path="/fos" dev="dm-0" ino=25 ioctlcmd=0x5879 scontext=u:r:vold:s0 tcontext=u:object_r:fos_data_file_type:s0 tclass=dir permissive=0
-allow vold fos_data_file_type:dir { read open write getattr setattr };
+allow vold fos_data_file_type:dir { read open write getattr setattr ioctl };
 allow vold fos_block_device:blk_file getattr;
 #tuliyuan add fos partition --end

MTK Android 11 新增分区

1.新增img后无法烧录,原因是弃用了verify boot。这个有朋友解决过这个问题吗?

下面是新增一个不带img的分区修改

commit 105355d0a9c2fe5712b5c5ef88db960634214d09
Author: tuly <tuly@test.com>
Date:   Tue Jun 4 09:55:31 2024 +0800

    [test] [parition] 1.test自定义分区提交

diff --git a/build/make/core/Makefile b/build/make/core/Makefile
index 4d87c4be472..70fff52f08b 100644
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -1746,6 +1746,13 @@ $(if $(filter $(2),cache),\
     $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1))
     $(hide) echo "cache_selinux_fc=$(SELINUX_FC)" >> $(1)
 )
+#A:@tuliyuan add test image --START
+$(if $(filter $(2),test),\
+    $(if $(BOARD_TESTIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "test_fs_type=$(BOARD_TESTIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
+    $(if $(BOARD_TESTIMAGE_PARTITION_SIZE),$(hide) echo "test_size=$(BOARD_TESTIMAGE_PARTITION_SIZE)" >> $(1))
+    $(hide) echo "test_selinux_fc=$(SELINUX_FC)" >> $(1)
+)
+#A:@tuliyuan add test image --end
 $(if $(filter $(2),vendor),\
     $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
     $(if $(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT),$(hide) echo "vendor_extfs_inode_count=$(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT)" >> $(1))
@@ -1860,6 +1867,15 @@ $(if $(BOARD_AVB_ENABLE),\
         $(hide) echo "avb_product_key_path=$(BOARD_AVB_PRODUCT_KEY_PATH)" >> $(1)
         $(hide) echo "avb_product_algorithm=$(BOARD_AVB_PRODUCT_ALGORITHM)" >> $(1)
         $(hide) echo "avb_product_rollback_index_location=$(BOARD_AVB_PRODUCT_ROLLBACK_INDEX_LOCATION)" >> $(1)))
+#A:@tuliyuan add test parition --start 		
+#$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_test_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
+#$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_test_add_hashtree_footer_args=$(BOARD_AVB_TEST_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
+#$(if $(BOARD_AVB_ENABLE),\
+#    $(if $(BOARD_AVB_TEST_KEY_PATH),\
+#        $(hide) echo "avb_test_key_path=$(BOARD_AVB_TEST_KEY_PATH)" >> $(1)
+#        $(hide) echo "avb_test_algorithm=$(BOARD_AVB_TEST_ALGORITHM)" >> $(1)
+#        $(hide) echo "avb_test_rollback_index_location=$(BOARD_AVB_TEST_ROLLBACK_INDEX_LOCATION)" >> $(1)))
+##A:@tuliyuan add test parition --start 			
 $(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_system_ext_hashtree_enable=$(BOARD_AVB_ENABLE)" >> $(1))
 $(if $(BOARD_AVB_ENABLE),\
     $(hide) echo "avb_system_ext_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
@@ -1891,6 +1907,11 @@ PROP_DICTIONARY_IMAGES := oem
 ifdef BUILDING_CACHE_IMAGE
   PROP_DICTIONARY_IMAGES += cache
 endif
+#A:@tuliyuan add test parition --start
+ifdef BUILDING_TEST_IMAGE
+  PROP_DICTIONARY_IMAGES += test
+endif
+#A:@tuliyuan add test parition --end
 ifdef BUILDING_SYSTEM_IMAGE
   PROP_DICTIONARY_IMAGES += system
 endif
@@ -3057,7 +3078,6 @@ else # BUILDING_CACHE_IMAGE
 # we need to ignore the broken cache link when doing the rsync
 IGNORE_CACHE_LINK := --exclude=cache
 endif # BUILDING_CACHE_IMAGE
-
 # -----------------------------------------------------------------
 # system_other partition image
 ifdef BUILDING_SYSTEM_OTHER_IMAGE
@@ -3260,6 +3280,130 @@ INSTALLED_PRODUCTIMAGE_TARGET := $(PRODUCT_OUT)/product.img
 $(eval $(call copy-one-file,$(BOARD_PREBUILT_PRODUCTIMAGE),$(INSTALLED_PRODUCTIMAGE_TARGET)))
 endif
 
+#A:@tuliyuan add test parition --start
+# -----------------------------------------------------------------
+# test partition image
+#ifdef BUILDING_TEST_IMAGE
+#INTERNAL_TESTIMAGE_FILES := \
+#    $(filter $(TARGET_OUT_TEST)/%,\
+#      $(ALL_DEFAULT_INSTALLED_MODULES)\
+#      $(ALL_PDK_FUSION_FILES)) \
+#    $(PDK_FUSION_SYMLINK_STAMP)
+#
+## platform.zip depends on $(INTERNAL_TESTIMAGE_FILES).
+#$(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_TESTIMAGE_FILES)
+#
+#INSTALLED_FILES_FILE_TEST := $(PRODUCT_OUT)/installed-files-test.txt
+#INSTALLED_FILES_JSON_TEST := $(INSTALLED_FILES_FILE_TEST:.txt=.json)
+#$(INSTALLED_FILES_FILE_TEST): .KATI_IMPLICIT_OUTPUTS := $(INSTALLED_FILES_JSON_TEST)
+#$(INSTALLED_FILES_FILE_TEST) : $(INTERNAL_TESTIMAGE_FILES) $(FILESLIST) $(FILESLIST_UTIL)
+#	@echo Installed file list: $@
+#	@mkdir -p $(dir $@)
+#	@rm -f $@
+#	$(hide) $(FILESLIST) $(TARGET_OUT_TEST) > $(@:.txt=.json)
+#	$(hide) $(FILESLIST_UTIL) -c $(@:.txt=.json) > $@
+#
+#testimage_intermediates := \
+#    $(call intermediates-dir-for,PACKAGING,test)
+#BUILT_TESTIMAGE_TARGET := $(PRODUCT_OUT)/test.img
+#define build-testimage-target
+#  $(call pretty,"Target test fs image: $(INSTALLED_TESTIMAGE_TARGET)")
+#  @mkdir -p $(TARGET_OUT_TEST)
+#  @mkdir -p $(testimage_intermediates) && rm -rf $(testimage_intermediates)/test_image_info.txt
+#  $(call generate-image-prop-dictionary, $(testimage_intermediates)/test_image_info.txt,test,skip_fsck=true)
+#  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
+#      $(BUILD_IMAGE) \
+#          $(TARGET_OUT_TEST) $(testimage_intermediates)/test_image_info.txt \
+#          $(INSTALLED_TESTIMAGE_TARGET) $(TARGET_OUT)
+#  $(call assert-max-image-size,$(INSTALLED_TESTIMAGE_TARGET),$(BOARD_TESTIMAGE_PARTITION_SIZE))
+#endef
+#
+## We just build this directly to the install location.
+#INSTALLED_TESTIMAGE_TARGET := $(BUILT_TESTIMAGE_TARGET)
+#$(INSTALLED_TESTIMAGE_TARGET): \
+#    $(INTERNAL_USERIMAGES_DEPS) \
+#    $(INTERNAL_TESTIMAGE_FILES) \
+#    $(INSTALLED_FILES_FILE_TEST)
+#	$(build-testimage-target)
+#
+#.PHONY: testimage-nodeps cqnod
+#testimage-nodeps cqnod: | $(INTERNAL_USERIMAGES_DEPS)
+#	$(build-testimage-target)
+#
+#sync: $(INTERNAL_TESTIMAGE_FILES)
+#
+#else ifdef BOARD_PREBUILT_TESTIMAGE
+#INSTALLED_TESTIMAGE_TARGET := $(PRODUCT_OUT)/test.img
+#$(eval $(call copy-one-file,$(BOARD_PREBUILT_TESTIMAGE),$(INSTALLED_TESTIMAGE_TARGET)))
+#endif
+#
+#
+# -----------------------------------------------------------------
+# test image
+#ifdef BOARD_PREBUILT_TESTIMAGE
+#INSTALLED_TESTIMAGE_TARGET := $(PRODUCT_OUT)/test.img
+#
+#ifeq ($(BOARD_AVB_ENABLE),true)
+#$(INSTALLED_TESTIMAGE_TARGET): $(BOARD_PREBUILT_TESTIMAGE) $(AVBTOOL) $(BOARD_AVB_TEST_KEY_PATH)
+#	cp $(BOARD_PREBUILT_TESTIMAGE) $@
+#	$(AVBTOOL) add_hash_footer \
+#	    --image $@ \
+#	    --partition_size $(BOARD_TESTIMG_PARTITION_SIZE) \
+#	    --partition_name test $(INTERNAL_AVB_TEST_SIGNING_ARGS) \
+#	    $(BOARD_AVB_TEST_ADD_HASH_FOOTER_ARGS)
+#else
+#$(INSTALLED_TESTIMAGE_TARGET): $(BOARD_PREBUILT_TESTIMAGE)
+#	cp $(BOARD_PREBUILT_TESTIMAGE) $@
+#endif
+#
+#endif # BOARD_PREBUILT_TESTIMAGE
+
+# Returns a list of image targets corresponding to the given list of partitions. For example, it
+# returns "$(INSTALLED_PRODUCTIMAGE_TARGET)" for "product", or "$(INSTALLED_SYSTEMIMAGE_TARGET)
+# $(INSTALLED_VENDORIMAGE_TARGET)" for "system vendor".
+# (1): list of partitions like "system", "vendor" or "system product system_ext".
+#define images-for-partitions
+#$(strip $(foreach item,$(1),$(INSTALLED_$(call to-upper,$(item))IMAGE_TARGET)))
+#endef
+
+
+ifdef BUILDING_TEST_IMAGE
+#TARGET_OUT_TEST := $(PRODUCT_OUT)/test
+INTERNAL_TESTIMAGE_FILES := \
+    $(filter $(TARGET_OUT_TEST)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
+
+testimage_intermediates := \
+    $(call intermediates-dir-for,PACKAGING,test)
+BUILT_TESTIMAGE_TARGET := $(PRODUCT_OUT)/test.img
+
+define build-testimage-target
+$(warning #########compile test.img#############)
+  $(call pretty,"Target test fs image: $(INSTALLED_TESTIMAGE_TARGET)")
+  @mkdir -p $(TARGET_OUT_TEST)
+  @mkdir -p $(testimage_intermediates) && rm -rf $(testimage_intermediates)/test_image_info.txt
+  $(call generate-image-prop-dictionary, $(testimage_intermediates)/test_image_info.txt,test,skip_fsck=true)
+  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
+      $(BUILD_IMAGE) \
+          $(TARGET_OUT_TEST) $(testimage_intermediates)/test_image_info.txt \
+          $(INSTALLED_TESTIMAGE_TARGET) $(TARGET_OUT)
+  $(call assert-max-image-size,$(INSTALLED_TESTIMAGE_TARGET),$(BOARD_TESTIMAGE_PARTITION_SIZE))
+endef
+
+# We just build this directly to the install location.
+INSTALLED_TESTIMAGE_TARGET := $(BUILT_TESTIMAGE_TARGET)
+$(INSTALLED_TESTIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_TESTIMAGE_FILES)
+	$(build-testimage-target)
+
+.PHONY: testimage-nodeps
+testimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
+	$(build-testimage-target)
+	
+else # BUILDING_TEST_IMAGE
+# we need to ignore the broken test link when doing the rsync
+IGNORE_TEST_LINK := --exclude=test
+endif
+#A:@tuliyuan add test parition --end
+
 # -----------------------------------------------------------------
 # system_ext partition image
 ifdef BUILDING_SYSTEM_EXT_IMAGE
@@ -3505,7 +3649,12 @@ BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS += \
     --prop com.android.build.product.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
     --prop com.android.build.product.os_version:$(PLATFORM_VERSION_LAST_STABLE) \
     --prop com.android.build.product.security_patch:$(PLATFORM_SECURITY_PATCH)
-
+#A:@tuliyuan add test parition --start
+BOARD_AVB_TEST_ADD_HASHTREE_FOOTER_ARGS += \
+    --prop com.android.build.test.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
+    --prop com.android.build.test.os_version:$(PLATFORM_VERSION_LAST_STABLE) \
+    --prop com.android.build.test.security_patch:$(PLATFORM_SECURITY_PATCH)
+#A:@tuliyuan add test parition --end
 BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS += \
     --prop com.android.build.system_ext.fingerprint:$(BUILD_FINGERPRINT_FROM_FILE) \
     --prop com.android.build.system_ext.os_version:$(PLATFORM_VERSION_LAST_STABLE) \
@@ -3555,6 +3704,9 @@ SYSTEM_FOOTER_ARGS := BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS
 VENDOR_FOOTER_ARGS := BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS
 RECOVERY_FOOTER_ARGS := BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS
 PRODUCT_FOOTER_ARGS := BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS
+#A:@tuliyuan add test parition --start
+PRODUCT_FOOTER_ARGS := BOARD_AVB_TEST_ADD_HASHTREE_FOOTER_ARGS
+#A:@tuliyuan add test parition --ebd
 SYSTEM_EXT_FOOTER_ARGS := BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS
 ODM_FOOTER_ARGS := BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS
 
@@ -3725,6 +3877,11 @@ define extract-avb-chain-public-keys
   $(if $(BOARD_AVB_PRODUCT_KEY_PATH),\
     $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_PRODUCT_KEY_PATH) \
       --output $(1)/product.avbpubkey)
+#A:@tuliyuan add test parition --start
+  $(if $(BOARD_AVB_TEST_KEY_PATH),\
+    $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_TEST_KEY_PATH) \
+      --output $(1)/test.avbpubkey)
+#A:@tuliyuan add test parition --end 		 		
   $(if $(BOARD_AVB_SYSTEM_EXT_KEY_PATH),\
     $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_EXT_KEY_PATH) \
       --output $(1)/system_ext.avbpubkey)
@@ -4430,6 +4587,13 @@ ifdef BOARD_AVB_DTBO_KEY_PATH
 	$(hide) echo "avb_dtbo_algorithm=$(BOARD_AVB_DTBO_ALGORITHM)" >> $@
 	$(hide) echo "avb_dtbo_rollback_index_location=$(BOARD_AVB_DTBO_ROLLBACK_INDEX_LOCATION)" >> $@
 endif # BOARD_AVB_DTBO_KEY_PATH
+#A:@tuliyuan add for test parition --start 
+#ifdef BOARD_AVB_TEST_KEY_PATH
+#	$(hide) echo "avb_dtbo_key_path=$(BOARD_AVB_TEST_KEY_PATH)" >> $@
+#	$(hide) echo "avb_dtbo_algorithm=$(BOARD_AVB_TEST_ALGORITHM)" >> $@
+#	$(hide) echo "avb_dtbo_rollback_index_location=$(BOARD_AVB_TEST_ROLLBACK_INDEX_LOCATION)" >> $@
+#endif # BOARD_AVB_DTBO_KEY_PATH
+#A:@tuliyuan add for test parition --end 
 endif # BOARD_AVB_ENABLE
 endif # BOARD_PREBUILT_DTBOIMAGE
 	$(call dump-dynamic-partitions-info,$@)
@@ -4607,6 +4771,9 @@ endif
 
 # Depending on the various images guarantees that the underlying
 # directories are up-to-date.
+# A:@tuliyuan add for test parition for one line  $(INSTALLED_TESTIMAGE_TARGET) \
+# 
+
 $(BUILT_TARGET_FILES_PACKAGE): \
 	    $(INSTALLED_RAMDISK_TARGET) \
 	    $(INSTALLED_BOOTIMAGE_TARGET) \
@@ -4615,6 +4782,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \
 	    $(INSTALLED_RECOVERYIMAGE_TARGET) \
 	    $(INSTALLED_USERDATAIMAGE_TARGET) \
 	    $(INSTALLED_CACHEIMAGE_TARGET) \
+		$(INSTALLED_TESTIMAGE_TARGET) \
 	    $(INSTALLED_VENDORIMAGE_TARGET) \
 	    $(INSTALLED_PRODUCTIMAGE_TARGET) \
 	    $(INSTALLED_SYSTEM_EXTIMAGE_TARGET) \
diff --git a/build/make/core/board_config.mk b/build/make/core/board_config.mk
index 86162b6f37e..c433c700182 100644
--- a/build/make/core/board_config.mk
+++ b/build/make/core/board_config.mk
@@ -54,6 +54,10 @@ _board_strip_readonly_list := \
   WITH_DEXPREOPT \
 
 # File system variables
+#A:@tuliyuan add test parition for two line
+#BOARD_TESTIMAGE_FILE_SYSTEM_TYPE \
+#BOARD_TESTIMAGE_PARTITION_SIZE \
+
 _board_strip_readonly_list += \
   BOARD_FLASH_BLOCK_SIZE \
   BOARD_BOOTIMAGE_PARTITION_SIZE \
@@ -63,7 +67,9 @@ _board_strip_readonly_list += \
   BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE \
   BOARD_USERDATAIMAGE_PARTITION_SIZE \
   BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE \
+  BOARD_TESTIMAGE_FILE_SYSTEM_TYPE \
   BOARD_CACHEIMAGE_PARTITION_SIZE \
+  BOARD_TESTIMAGE_PARTITION_SIZE \
   BOARD_VENDORIMAGE_PARTITION_SIZE \
   BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE \
   BOARD_PRODUCTIMAGE_PARTITION_SIZE \
@@ -330,6 +336,22 @@ else ifeq ($(PRODUCT_BUILD_CACHE_IMAGE),true)
 endif
 .KATI_READONLY := BUILDING_CACHE_IMAGE
 
+#A:@tuliyuan add for test parition --start
+# Are we building a test image
+BUILDING_TEST_IMAGE :=
+ifeq ($(PRODUCT_BUILD_TEST_IMAGE),)
+  ifdef BOARD_TESTIMAGE_FILE_SYSTEM_TYPE
+    BUILDING_TEST_IMAGE := true
+  endif
+else ifeq ($(PRODUCT_BUILD_TEST_IMAGE),true)
+  BUILDING_TEST_IMAGE := true
+  ifndef BOARD_TESTIMAGE_FILE_SYSTEM_TYPE
+    $(error PRODUCT_BUILD_TEST_IMAGE set to true, but BOARD_TESTIMAGE_FILE_SYSTEM_TYPE not defined)
+  endif
+endif
+.KATI_READONLY := BUILDING_TEST_IMAGE
+#A:@tuliyuan add for test parition --end 
+
 # Are we building a boot image
 BUILDING_BOOT_IMAGE :=
 ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
diff --git a/build/make/core/config.mk b/build/make/core/config.mk
index bfdbc468677..73bff00b622 100644
--- a/build/make/core/config.mk
+++ b/build/make/core/config.mk
@@ -291,7 +291,9 @@ ifneq (,$(BUILD_SYSTEM_HCT_TOPDIR))
 $(warning initialize build system extension success for hct)
 endif
 #hct:mingming.wu
-
+#A:@tuly add for custom test system 2024/05/27
+include  $(TOPDIR)vendor/test/proprietary/build/testMain.mk
+#A:@tuly add for custom test system 2024/05/27
 # ---------------------------------------------------------------
 # Define most of the global variables.  These are the ones that
 # are specific to the user's build configuration.
@@ -1217,6 +1219,8 @@ endif
 
 # These goals don't need to collect and include Android.mks/CleanSpec.mks
 # in the source tree.
+# A:@tuliyuan add for test parition for one line
+# testimage-nodeps
 dont_bother_goals := out \
     snod systemimage-nodeps \
     userdataimage-nodeps \
@@ -1226,6 +1230,7 @@ dont_bother_goals := out \
     pnod productimage-nodeps \
     senod systemextimage-nodeps \
     onod odmimage-nodeps \
+    testimage-nodeps \
     systemotherimage-nodeps \
     ramdisk-nodeps \
     ramdisk_debug-nodeps \
diff --git a/build/make/core/envsetup.mk b/build/make/core/envsetup.mk
index f4650f99f3e..57d5f1bd4e7 100644
--- a/build/make/core/envsetup.mk
+++ b/build/make/core/envsetup.mk
@@ -581,6 +581,10 @@ $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA
 
 TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
 .KATI_READONLY := TARGET_OUT_CACHE
+#A:@tuliyuan add for test parition --start
+TARGET_OUT_TEST := $(PRODUCT_OUT)/test
+.KATI_READONLY := TARGET_OUT_TEST
+#A:@tuliyuan add for test parition --end
 
 TARGET_OUT_VENDOR := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)
 .KATI_READONLY := TARGET_OUT_VENDOR
diff --git a/build/make/core/main.mk b/build/make/core/main.mk
index 003790638f2..f5b83daf150 100644
--- a/build/make/core/main.mk
+++ b/build/make/core/main.mk
@@ -1397,6 +1397,10 @@ endif
 
 .PHONY: cacheimage
 cacheimage: $(INSTALLED_CACHEIMAGE_TARGET)
+#A:@tuliyuan add for test parition --start
+.PHONY: testimage
+cacheimage: $(INSTALLED_TESTIMAGE_TARGET)
+#A:@tuliyuan add for test parition --end
 
 .PHONY: bptimage
 bptimage: $(INSTALLED_BPTIMAGE_TARGET)
@@ -1441,6 +1445,9 @@ vbmetaimage: $(INSTALLED_VBMETAIMAGE_TARGET)
 auxiliary: $(INSTALLED_AUX_TARGETS)
 
 # Build files and then package it into the rom formats
+#A:@tuliyuan add test parition for one line 
+#$(INSTALLED_TESTIMAGE_TARGET) \
+
 .PHONY: droidcore
 droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
     $(INSTALLED_SYSTEMIMAGE_TARGET) \
@@ -1453,6 +1460,7 @@ droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
     $(INSTALLED_VBMETAIMAGE_TARGET) \
     $(INSTALLED_USERDATAIMAGE_TARGET) \
     $(INSTALLED_CACHEIMAGE_TARGET) \
+    $(INSTALLED_TESTIMAGE_TARGET) \
     $(INSTALLED_BPTIMAGE_TARGET) \
     $(INSTALLED_VENDORIMAGE_TARGET) \
     $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \
diff --git a/build/make/core/product.mk b/build/make/core/product.mk
index f8ba5936f80..93d4340f049 100644
--- a/build/make/core/product.mk
+++ b/build/make/core/product.mk
@@ -375,6 +375,9 @@ _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
+#A:@tuliyuan add for test parition --START
+_product_single_value_vars += PRODUCT_BUILD_TEST_IMAGE
+#A:@tuliyuan add for test parition --END
 _product_single_value_vars += PRODUCT_BUILD_RAMDISK_IMAGE
 _product_single_value_vars += PRODUCT_BUILD_USERDATA_IMAGE
 _product_single_value_vars += PRODUCT_BUILD_RECOVERY_IMAGE
diff --git a/build/make/tools/releasetools/add_img_to_target_files.py b/build/make/tools/releasetools/add_img_to_target_files.py
index f58b6978a89..17c2fbbf7fd 100644
--- a/build/make/tools/releasetools/add_img_to_target_files.py
+++ b/build/make/tools/releasetools/add_img_to_target_files.py
@@ -313,6 +313,32 @@ def AddDtbo(output_zip):
   img.Write()
   return img.name
 
+#A:@tuliyuan add test parition --start
+def AddConquest(output_zip):
+  """Create an empty test image and store it in output_zip."""
+
+  img = OutputFile(output_zip, OPTIONS.input_tmp, "IMAGES", "test.img")
+  if os.path.exists(img.name):
+    logger.info("test.img already exists; no need to rebuild...")
+    return
+
+  image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, "test")
+  # The build system has to explicitly request for test.img.
+  if "fs_type" not in image_props:
+    return
+
+  logger.info("creating test.img...")
+
+  image_props["timestamp"] = FIXED_FILE_TIMESTAMP
+
+  user_dir = common.MakeTempDir()
+  build_image.BuildImage(user_dir, image_props, img.name)
+
+  common.CheckSize(img.name, "test.img", OPTIONS.info_dict)
+  img.Write()
+
+#A:@tuliyuan add test parition --end
+ 
 def AddCustomImages(output_zip, partition_name):
   """Adds and signs custom images in IMAGES/.
 
@@ -874,7 +900,10 @@ def AddImagesToTargetFiles(filename):
     AddUserdata(output_zip)
     banner("cache")
     AddCache(output_zip)
-
+#A:@tuliyuan add test parition --START
+    banner("test")
+    AddConquest(output_zip)
+#A:@tuliyuan add test parition --END
   if OPTIONS.info_dict.get("board_bpt_enable") == "true":
     banner("partition-table")
     AddPartitionTable(output_zip)
diff --git a/build/make/tools/releasetools/build_image.py b/build/make/tools/releasetools/build_image.py
index 8cf074147e6..949402fd0a0 100755
--- a/build/make/tools/releasetools/build_image.py
+++ b/build/make/tools/releasetools/build_image.py
@@ -614,6 +614,18 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):
     copy_prop("cache_fs_type", "fs_type")
     copy_prop("cache_size", "partition_size")
     copy_prop("cache_selinux_fc", "selinux_fc")
+  #A:@tuliyuan add for test parition --start  
+  elif mount_point == "test":
+    #copy_prop("avb_test_hashtree_enable", "avb_hashtree_enable")
+    #copy_prop("avb_test_add_hashtree_footer_args",
+    #          "avb_add_hashtree_footer_args")
+    #copy_prop("avb_test_key_path", "avb_key_path")
+    #copy_prop("avb_test_algorithm", "avb_algorithm")
+    #copy_prop("avb_test_salt", "avb_salt")
+    copy_prop("test_fs_type", "fs_type")
+    copy_prop("test_size", "partition_size")
+    copy_prop("test_selinux_fc", "selinux_fc")
+  #A:@tuliyuan add for test parition --end
   elif mount_point == "vendor":
     copy_prop("avb_vendor_hashtree_enable", "avb_hashtree_enable")
     copy_prop("avb_vendor_add_hashtree_footer_args",
@@ -787,6 +799,10 @@ def main(argv):
       mount_point = "data"
     elif image_filename == "cache.img":
       mount_point = "cache"
+#A:@tuliyuan add for test parition --start
+    elif image_filename == "test.img":
+      mount_point = "test"     
+#A:@tuliyuan add for test parition --end
     elif image_filename == "vendor.img":
       mount_point = "vendor"
     elif image_filename == "odm.img":
diff --git a/build/make/tools/releasetools/common.py b/build/make/tools/releasetools/common.py
index ae7da2fb64a..01c17276622 100644
--- a/build/make/tools/releasetools/common.py
+++ b/build/make/tools/releasetools/common.py
@@ -675,6 +675,9 @@ def LoadInfoDict(input_file, repacking=False):
   makeint("vendor_size")
   makeint("userdata_size")
   makeint("cache_size")
+  #A:@tuliyuan add for test parition --start 
+  makeint("test_size")
+  #A:@tuliyuan add for test parition --end 
   makeint("recovery_size")
   makeint("fstab_version")
 
diff --git a/device/mediatek/mt6873/init.mt6873.rc b/device/mediatek/mt6873/init.mt6873.rc
index c57fce871d3..7cae13489df 100644
--- a/device/mediatek/mt6873/init.mt6873.rc
+++ b/device/mediatek/mt6873/init.mt6873.rc
@@ -204,7 +204,10 @@ on post-fs
     chown system system /mnt/vendor/protect_s
     chmod 0770 /mnt/vendor/protect_s
     chown root log /proc/ccci_sib
-
+    #A:@tuliyuan add test parition
+    chown system system /test
+    chmod 0770 /test
+    restorecon_recursive /test
 
 on post-fs-data
     write /proc/bootprof "INIT:post-fs-data"
diff --git a/device/mediatek/mt6873/ueventd.mt6873.ufs.rc b/device/mediatek/mt6873/ueventd.mt6873.ufs.rc
index 4549b395faa..ead50719161 100644
--- a/device/mediatek/mt6873/ueventd.mt6873.ufs.rc
+++ b/device/mediatek/mt6873/ueventd.mt6873.ufs.rc
@@ -9,6 +9,7 @@
 /dev/block/by-name/seccfg    0660    root    system
 /dev/block/by-name/proinfo   0660    root    system
 /dev/block/by-name/nvram     0660    root    system
+/dev/block/by-name/test  0660    root    system
 /dev/block/by-name/para      0660    root    system
 /dev/block/by-name/logo      0660    root    system
 /dev/block/by-name/frp       0660    root    system
diff --git a/system/core/libcutils/fs_config.cpp b/system/core/libcutils/fs_config.cpp
index 5805a4d19bd..d25366907a7 100644
--- a/system/core/libcutils/fs_config.cpp
+++ b/system/core/libcutils/fs_config.cpp
@@ -78,6 +78,7 @@ static const struct fs_path_config android_dirs[] = {
     { 00750, AID_ROOT,         AID_SHELL,        0, "data/benchmarktest64" },
     { 00775, AID_ROOT,         AID_ROOT,         0, "data/preloads" },
     { 00771, AID_SYSTEM,       AID_SYSTEM,       0, "data" },
+    { 00771, AID_SYSTEM,       AID_SYSTEM,       0, "test" },
     { 00755, AID_ROOT,         AID_SYSTEM,       0, "mnt" },
     { 00751, AID_ROOT,         AID_SHELL,        0, "product/bin" },
     { 00777, AID_ROOT,         AID_ROOT,         0, "sdcard" },
@@ -139,6 +140,7 @@ static const char* conf[][2] = {
 static const struct fs_path_config android_files[] = {
         // clang-format off
     { 00644, AID_SYSTEM,    AID_SYSTEM,    0, "data/app/*" },
+    { 00770, AID_SYSTEM,    AID_SYSTEM,    0, "test/*" },
     { 00644, AID_SYSTEM,    AID_SYSTEM,    0, "data/app-ephemeral/*" },
     { 00644, AID_SYSTEM,    AID_SYSTEM,    0, "data/app-private/*" },
     { 00644, AID_APP,       AID_APP,       0, "data/data/*" },
diff --git a/system/core/rootdir/Android.mk b/system/core/rootdir/Android.mk
index a9d0ed08a9e..ffb72259d99 100644
--- a/system/core/rootdir/Android.mk
+++ b/system/core/rootdir/Android.mk
@@ -77,7 +77,7 @@ endif
 #
 # create some directories (some are mount points) and symlinks
 LOCAL_POST_INSTALL_CMD := mkdir -p $(addprefix $(TARGET_ROOT_OUT)/, \
-    dev proc sys system data data_mirror odm oem acct config storage mnt apex debug_ramdisk \
+    dev proc sys system data data_mirror odm oem acct config test storage mnt apex debug_ramdisk \
     linkerconfig $(BOARD_ROOT_EXTRA_FOLDERS)); \
     ln -sf /system/bin $(TARGET_ROOT_OUT)/bin; \
     ln -sf /system/etc $(TARGET_ROOT_OUT)/etc; \
@@ -103,6 +103,13 @@ ifdef BOARD_USES_METADATA_PARTITION
   LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/metadata
 endif
 
+#A:@tuliyuan add for test parition --start
+#$(warning ########create dir conqeust $(BOARD_TESTIMAGE_FILE_SYSTEM_TYPE))
+ifdef BOARD_TESTIMAGE_FILE_SYSTEM_TYPE
+$(warning ########create dir conqeust.........$(TARGET_ROOT_OUT)/test)
+  LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/test
+endif
+#A:@tuliyuan add for test parition --end
 # For /odm partition.
 LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/odm
 # For Treble Generic System Image (GSI), system-as-root GSI needs to work on
@@ -125,6 +132,8 @@ ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
 else
   LOCAL_POST_INSTALL_CMD += ; ln -sf /data/cache $(TARGET_ROOT_OUT)/cache
 endif
+
+
 ifdef BOARD_ROOT_EXTRA_SYMLINKS
 # BOARD_ROOT_EXTRA_SYMLINKS is a list of <target>:<link_name>.
   LOCAL_POST_INSTALL_CMD += $(foreach s, $(BOARD_ROOT_EXTRA_SYMLINKS),\
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/e2fs.te b/vendor/test/proprietary/device/sepolicy/basic/non_plat/e2fs.te
new file mode 100644
index 00000000000..e316907d975
--- /dev/null
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/e2fs.te
@@ -0,0 +1 @@
+allow e2fs test_block_device:blk_file rw_file_perms;
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/file_contexts b/vendor/test/proprietary/device/sepolicy/basic/non_plat/file_contexts
index ec4b0ebf568..c981e9ccdb2 100755
--- a/vendor/test/proprietary/device/sepolicy/basic/non_plat/file_contexts
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/file_contexts
@@ -1,6 +1,6 @@
 # test core hal service 
 /(vendor|system/vendor)/bin/hw/vendor\.test\.hardware\.talkie@1\.0-service    u:object_r:hal_talkie_default_exec:s0
-#/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/test    u:object_r:test_block_device:s0
-#/dev/block/by-name/test        u:object_r:test_block_device:s0
+/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/test    u:object_r:test_block_device:s0
+/dev/block/by-name/test        u:object_r:test_block_device:s0
 #/dev/block/platform/bootdevice/by-name/test    u:object_r:test_block_device:s0
 /test(/.*)? 					u:object_r:test_data_file_type:s0
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/init.te b/vendor/test/proprietary/device/sepolicy/basic/non_plat/init.te
index b1977336124..8acf7cb87fe 100755
--- a/vendor/test/proprietary/device/sepolicy/basic/non_plat/init.te
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/init.te
@@ -3,3 +3,4 @@ allow init test_block_device:blk_file relabelto;
 allow init test_block_device:blk_file rw_file_perms;
 allow init test_block_device:dir mounton;
 allow init test_data_file_type:dir { create setattr getattr mounton };
+allow init test_data_file_type:lnk_file { getattr create setattr };
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/mtkbootanimation.te b/vendor/test/proprietary/device/sepolicy/basic/non_plat/mtkbootanimation.te
index 7e26b5d9705..678c5f38a6b 100755
--- a/vendor/test/proprietary/device/sepolicy/basic/non_plat/mtkbootanimation.te
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/mtkbootanimation.te
@@ -1 +1,2 @@
-allow mtkbootanimation test_data_file_type:dir rw_dir_perms;
\ No newline at end of file
+allow mtkbootanimation test_data_file_type:dir rw_dir_perms;
+allow mtkbootanimation test_data_file_type:file rw_file_perms;
\ No newline at end of file
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/priv_app.te b/vendor/test/proprietary/device/sepolicy/basic/non_plat/priv_app.te
index f08fc60093f..295868d1f16 100755
--- a/vendor/test/proprietary/device/sepolicy/basic/non_plat/priv_app.te
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/priv_app.te
@@ -1,2 +1,4 @@
 # test core hal service
 hal_client_domain(priv_app, hal_talkie)
+allow priv_app test_data_file_type:file rw_file_perms;
+allow priv_app test_data_file_type:dir rw_dir_perms;
\ No newline at end of file
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/system_app.te b/vendor/test/proprietary/device/sepolicy/basic/non_plat/system_app.te
index d8346d49c38..6eefeaf678b 100755
--- a/vendor/test/proprietary/device/sepolicy/basic/non_plat/system_app.te
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/system_app.te
@@ -1 +1,3 @@
 hal_client_domain(system_app, hal_talkie)
+allow system_app test_data_file_type:file rw_file_perms;
+allow system_app test_data_file_type:dir rw_dir_perms;
\ No newline at end of file
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/vendor_init.te b/vendor/test/proprietary/device/sepolicy/basic/non_plat/vendor_init.te
index 03c3def4235..4b5a9694ae4 100755
--- a/vendor/test/proprietary/device/sepolicy/basic/non_plat/vendor_init.te
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/vendor_init.te
@@ -1,7 +1,7 @@
 #A:@tuliyuan add for test custom parition
-#allow vendor_init test_block_device:blk_file rw_file_perms;
-#allow vendor_init test_block_device:lnk_file { relabelto };
-#allow vendor_init test_block_device:dir mounton;
+allow vendor_init test_block_device:blk_file rw_file_perms;
+allow vendor_init test_block_device:lnk_file { relabelto };
+allow vendor_init test_block_device:dir mounton;
 allow vendor_init test_data_file_type:dir rw_dir_perms;
 allow vendor_init test_data_file_type:file rw_file_perms;
 allow vendor_init test_data_file_type:dir { mounton };
diff --git a/vendor/test/proprietary/device/sepolicy/basic/non_plat/vold.te b/vendor/test/proprietary/device/sepolicy/basic/non_plat/vold.te
index e66f76c874b..1e5f3ffba6c 100755
--- a/vendor/test/proprietary/device/sepolicy/basic/non_plat/vold.te
+++ b/vendor/test/proprietary/device/sepolicy/basic/non_plat/vold.te
@@ -1,3 +1,3 @@
 #A:@tuliyuan add test parition
 allow vold test_data_file_type:dir { read open write getattr setattr };
-#allow vold test_block_device:blk_file getattr;
+allow vold test_block_device:blk_file getattr;
diff --git a/vendor/mediatek/proprietary/hardware/fstab/mt6873/fstab.in b/vendor/mediatek/proprietary/hardware/fstab/mt6873/fstab.in
index dab65f15e0d..27b68948ccc 100644
--- a/vendor/mediatek/proprietary/hardware/fstab/mt6873/fstab.in
+++ b/vendor/mediatek/proprietary/hardware/fstab/mt6873/fstab.in
@@ -161,6 +161,8 @@ DEVPATH(protect2)   /mnt/vendor/protect_s   ext4   FS_FLAG_COMMIT   FSMGR_FLAG_F
 DEVPATH(nvdata)     /mnt/vendor/nvdata      ext4   FS_FLAG_COMMIT   FSMGR_FLAG_FMT
 DEVPATH(nvcfg)      /mnt/vendor/nvcfg       ext4   FS_FLAG_COMMIT   FSMGR_FLAG_FMT
 
+
+DEVPATH(test)      /test         ext4   FS_FLAG_COMMIT   FSMGR_FLAG_FMT
 #ifdef __PERSIST_PARTITION_SUPPORT
 DEVPATH(persist)    /mnt/vendor/persist     ext4   FS_FLAG_COMMIT  FSMGR_FLAG_FMT
 #endif
diff --git a/vendor/mediatek/proprietary/tools/ptgen/MT6873/partition_table_emmc_ab.csv b/vendor/mediatek/proprietary/tools/ptgen/MT6873/partition_table_emmc_ab.csv
index ab4f3885b94..a89ca9f7c05 100644
--- a/vendor/mediatek/proprietary/tools/ptgen/MT6873/partition_table_emmc_ab.csv
+++ b/vendor/mediatek/proprietary/tools/ptgen/MT6873/partition_table_emmc_ab.csv
@@ -1,84 +1,85 @@
-Partition_Name,Type,Size_KB,,Region,,Group,Reserved,Download,Download_File,OTA_Update,EmptyBoot_Needed,FastBoot_Erase,,FastBoot_Download,,Operation_Type
-,,eng,user,emmc,ufs,,,,,,,eng,user,eng,user,
-preloader,Raw data,512,,EMMC_BOOT1_BOOT2,UFS_LU0_LU1,,N,Y,AUTO,N,N,N,,N,,BOOTLOADERS
-pgpt,Raw data,32,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,Y,N,Y,N,AUTO
-misc,Raw data,512,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-para,Raw data,512,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-expdb,Raw data,20480,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-frp,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-nvcfg,EXT4,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
-nvdata,EXT4,65536,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-eng_system,EXT4,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-eng_vendor,EXT4,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-vbmeta_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,vbmeta.img,Y,N,Y,,Y,,AUTO
-vbmeta_system_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,vbmeta_system.img,Y,N,Y,,Y,,AUTO
-vbmeta_vendor_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,vbmeta_vendor.img,Y,N,Y,,Y,,AUTO
-vbmeta_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
-vbmeta_system_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
-vbmeta_vendor_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
-metadata,Raw data,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,Y,,N,,AUTO
-persist,EXT4,49152,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
-protect1,EXT4,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
-protect2,EXT4,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
-seccfg,Raw data,512,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-otp,Raw data,44032,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-md1img_a,Raw data,204800,,EMMC_USER,UFS_LU2,,N,Y,md1img.img,Y,N,N,,N,,AUTO
-md1dsp_a,Raw data,16384,,EMMC_USER,UFS_LU2,,N,Y,md1dsp.img,Y,N,N,,N,,AUTO
-spmfw_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,spmfw.img,Y,N,N,,N,,AUTO
-mcupmfw_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,mcupmfw.img,Y,N,N,,N,,AUTO
-audio_dsp_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,audio_dsp.img,Y,N,N,,N,,AUTO
-pi_img_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,pi_img.img,Y,N,N,,N,,AUTO
-dpm_a,Raw data,4096,,EMMC_USER,UFS_LU2,,N,Y,dpm.img,Y,N,N,,N,,AUTO
-scp_a,Raw data,6144,,EMMC_USER,UFS_LU2,,N,Y,scp.img,Y,N,Y,,Y,,AUTO
-sspm_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,sspm.img,Y,N,N,,N,,AUTO
-mcupm_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,mcupm.img,Y,N,N,,N,,AUTO
-cam_vpu1_a,Raw data,15360,,EMMC_USER,UFS_LU2,,N,Y,cam_vpu1.img,Y,N,N,,N,,AUTO
-cam_vpu2_a,Raw data,15360,,EMMC_USER,UFS_LU2,,N,Y,cam_vpu2.img,Y,N,N,,N,,AUTO
-cam_vpu3_a,Raw data,15360,,EMMC_USER,UFS_LU2,,N,Y,cam_vpu3.img,Y,N,N,,N,,AUTO
-gz_a,Raw data,32768,,EMMC_USER,UFS_LU2,,N,Y,gz.img,Y,N,N,,N,,AUTO
-lk_a,Raw data,2048,,EMMC_USER,UFS_LU2,,N,Y,lk.img,Y,Y,Y,N,Y,N,AUTO
-boot_a,Raw data,40960,,EMMC_USER,UFS_LU2,,N,Y,boot.img,Y,N,Y,,Y,,AUTO
-vendor_boot_a,Raw data,65536,,EMMC_USER,UFS_LU2,,N,Y,vendor_boot.img,Y,N,Y,,Y,,AUTO
-odmdtbo_a,Raw data,16384,,EMMC_USER,UFS_LU2,,N,Y,odmdtbo.img,Y,N,Y,,Y,,AUTO
-dtbo_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,dtbo.img,Y,N,Y,,Y,,AUTO
-tee_a,Raw data,5120,,EMMC_USER,UFS_LU2,,N,Y,tee.img,Y,Y,N,,N,,AUTO
-odm_a,EXT4,32768,,EMMC_USER,UFS_LU2,main,N,Y,odm.img,Y,N,Y,,Y,,AUTO
-product_a,EXT4,409600,,EMMC_USER,UFS_LU2,main,N,Y,product.img,Y,N,Y,,Y,,AUTO
-vendor_a,EXT4,524288,,EMMC_USER,UFS_LU2,main,N,Y,vendor.img,Y,N,Y,,Y,,AUTO
-system_a,EXT4,3145728,,EMMC_USER,UFS_LU2,main,N,Y,system.img,Y,N,Y,,Y,,AUTO
-sec1,Raw data,2048,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-proinfo,Raw data,3072,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
-efuse,Raw data,512,,EMMC_USER,UFS_LU2,,N,Y,efuse.img,N,N,N,,N,,AUTO
-nvram,Raw data,65536,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,BINREGION
-boot_para,Raw data,26624,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-logo,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,logo.bin,N,Y,Y,N,Y,N,AUTO
-md1img_b,Raw data,204800,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-md1dsp_b,Raw data,16384,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-spmfw_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-mcupmfw_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-audio_dsp_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-pi_img_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-dpm_b,Raw data,4096,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-scp_b,Raw data,6144,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
-sspm_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-mcupm_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-cam_vpu1_b,Raw data,15360,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-cam_vpu2_b,Raw data,15360,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-cam_vpu3_b,Raw data,15360,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-gz_b,Raw data,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-lk_b,Raw data,2048,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,N,Y,N,AUTO
-boot_b,Raw data,40960,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
-vendor_boot_b,Raw data,65536,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,Y,,Y,,AUTO
-odmdtbo_b,Raw data,16384,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
-dtbo_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
-tee_b,Raw data,5120,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
-odm_b,EXT4,32768,,EMMC_USER,UFS_LU2,main,N,N,NONE,Y,N,Y,,Y,,AUTO
-product_b,EXT4,409600,,EMMC_USER,UFS_LU2,main,N,N,NONE,Y,N,Y,,Y,,AUTO
-vendor_b,EXT4,524288,,EMMC_USER,UFS_LU2,main,N,N,NONE,Y,N,Y,,Y,,AUTO
-system_b,EXT4,3145728,,EMMC_USER,UFS_LU2,main,N,Y,system_other.img,Y,N,Y,,Y,,AUTO
-super,Raw data,6291456,,EMMC_USER,UFS_LU2,,N,Y,super.img,Y,N,Y,,Y,,AUTO
-userdata,EXT4,3145728,,EMMC_USER,UFS_LU2,,N,Y,userdata.img,N,N,Y,,Y,,AUTO
-mrdump,Raw data,16384,,EMMC_USER,UFS_LU2,,Y,N,NONE,N,N,N,,N,,RESERVED
-intsd,FAT,0,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
-flashinfo,Raw data,16384,,EMMC_USER,UFS_LU2,,Y,N,NONE,N,N,N,,N,,RESERVED
-sgpt,Raw data,32,,EMMC_USER,UFS_LU2,,Y,N,NONE,N,N,N,,N,,RESERVED
+Partition_Name,Type,Size_KB,,Region,,Group,Reserved,Download,Download_File,OTA_Update,EmptyBoot_Needed,FastBoot_Erase,,FastBoot_Download,,Operation_Type
+,,eng,user,emmc,ufs,,,,,,,eng,user,eng,user,
+preloader,Raw data,512,,EMMC_BOOT1_BOOT2,UFS_LU0_LU1,,N,Y,AUTO,N,N,N,,N,,BOOTLOADERS
+pgpt,Raw data,32,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,Y,N,Y,N,AUTO
+misc,Raw data,512,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+para,Raw data,512,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+expdb,Raw data,20480,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+frp,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+nvcfg,EXT4,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
+nvdata,EXT4,65536,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+eng_system,EXT4,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+eng_vendor,EXT4,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+vbmeta_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,vbmeta.img,Y,N,Y,,Y,,AUTO
+vbmeta_system_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,vbmeta_system.img,Y,N,Y,,Y,,AUTO
+vbmeta_vendor_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,vbmeta_vendor.img,Y,N,Y,,Y,,AUTO
+vbmeta_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
+vbmeta_system_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
+vbmeta_vendor_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
+metadata,Raw data,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,Y,,N,,AUTO
+persist,EXT4,49152,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
+protect1,EXT4,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
+protect2,EXT4,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
+seccfg,Raw data,512,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+otp,Raw data,44032,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+md1img_a,Raw data,204800,,EMMC_USER,UFS_LU2,,N,Y,md1img.img,Y,N,N,,N,,AUTO
+md1dsp_a,Raw data,16384,,EMMC_USER,UFS_LU2,,N,Y,md1dsp.img,Y,N,N,,N,,AUTO
+spmfw_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,spmfw.img,Y,N,N,,N,,AUTO
+mcupmfw_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,mcupmfw.img,Y,N,N,,N,,AUTO
+audio_dsp_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,audio_dsp.img,Y,N,N,,N,,AUTO
+pi_img_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,pi_img.img,Y,N,N,,N,,AUTO
+dpm_a,Raw data,4096,,EMMC_USER,UFS_LU2,,N,Y,dpm.img,Y,N,N,,N,,AUTO
+scp_a,Raw data,6144,,EMMC_USER,UFS_LU2,,N,Y,scp.img,Y,N,Y,,Y,,AUTO
+sspm_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,sspm.img,Y,N,N,,N,,AUTO
+mcupm_a,Raw data,1024,,EMMC_USER,UFS_LU2,,N,Y,mcupm.img,Y,N,N,,N,,AUTO
+cam_vpu1_a,Raw data,15360,,EMMC_USER,UFS_LU2,,N,Y,cam_vpu1.img,Y,N,N,,N,,AUTO
+cam_vpu2_a,Raw data,15360,,EMMC_USER,UFS_LU2,,N,Y,cam_vpu2.img,Y,N,N,,N,,AUTO
+cam_vpu3_a,Raw data,15360,,EMMC_USER,UFS_LU2,,N,Y,cam_vpu3.img,Y,N,N,,N,,AUTO
+gz_a,Raw data,32768,,EMMC_USER,UFS_LU2,,N,Y,gz.img,Y,N,N,,N,,AUTO
+lk_a,Raw data,2048,,EMMC_USER,UFS_LU2,,N,Y,lk.img,Y,Y,Y,N,Y,N,AUTO
+boot_a,Raw data,40960,,EMMC_USER,UFS_LU2,,N,Y,boot.img,Y,N,Y,,Y,,AUTO
+vendor_boot_a,Raw data,65536,,EMMC_USER,UFS_LU2,,N,Y,vendor_boot.img,Y,N,Y,,Y,,AUTO
+odmdtbo_a,Raw data,16384,,EMMC_USER,UFS_LU2,,N,Y,odmdtbo.img,Y,N,Y,,Y,,AUTO
+dtbo_a,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,dtbo.img,Y,N,Y,,Y,,AUTO
+tee_a,Raw data,5120,,EMMC_USER,UFS_LU2,,N,Y,tee.img,Y,Y,N,,N,,AUTO
+odm_a,EXT4,32768,,EMMC_USER,UFS_LU2,main,N,Y,odm.img,Y,N,Y,,Y,,AUTO
+product_a,EXT4,409600,,EMMC_USER,UFS_LU2,main,N,Y,product.img,Y,N,Y,,Y,,AUTO
+vendor_a,EXT4,524288,,EMMC_USER,UFS_LU2,main,N,Y,vendor.img,Y,N,Y,,Y,,AUTO
+system_a,EXT4,3145728,,EMMC_USER,UFS_LU2,main,N,Y,system.img,Y,N,Y,,Y,,AUTO
+sec1,Raw data,2048,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+proinfo,Raw data,3072,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,PROTECTED
+efuse,Raw data,512,,EMMC_USER,UFS_LU2,,N,Y,efuse.img,N,N,N,,N,,AUTO
+nvram,Raw data,65536,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,BINREGION
+boot_para,Raw data,26624,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+logo,Raw data,8192,,EMMC_USER,UFS_LU2,,N,Y,logo.bin,N,Y,Y,N,Y,N,AUTO
+md1img_b,Raw data,204800,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+md1dsp_b,Raw data,16384,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+spmfw_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+mcupmfw_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+audio_dsp_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+pi_img_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+dpm_b,Raw data,4096,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+scp_b,Raw data,6144,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
+sspm_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+mcupm_b,Raw data,1024,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+cam_vpu1_b,Raw data,15360,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+cam_vpu2_b,Raw data,15360,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+cam_vpu3_b,Raw data,15360,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+test,EXT4,512000,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+gz_b,Raw data,32768,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+lk_b,Raw data,2048,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,N,Y,N,AUTO
+boot_b,Raw data,40960,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
+vendor_boot_b,Raw data,65536,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,Y,,Y,,AUTO
+odmdtbo_b,Raw data,16384,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
+dtbo_b,Raw data,8192,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,Y,,Y,,AUTO
+tee_b,Raw data,5120,,EMMC_USER,UFS_LU2,,N,N,NONE,Y,N,N,,N,,AUTO
+odm_b,EXT4,32768,,EMMC_USER,UFS_LU2,main,N,N,NONE,Y,N,Y,,Y,,AUTO
+product_b,EXT4,409600,,EMMC_USER,UFS_LU2,main,N,N,NONE,Y,N,Y,,Y,,AUTO
+vendor_b,EXT4,524288,,EMMC_USER,UFS_LU2,main,N,N,NONE,Y,N,Y,,Y,,AUTO
+system_b,EXT4,3145728,,EMMC_USER,UFS_LU2,main,N,Y,system_other.img,Y,N,Y,,Y,,AUTO
+super,Raw data,6291456,,EMMC_USER,UFS_LU2,,N,Y,super.img,Y,N,Y,,Y,,AUTO
+userdata,EXT4,3145728,,EMMC_USER,UFS_LU2,,N,Y,userdata.img,N,N,Y,,Y,,AUTO
+mrdump,Raw data,16384,,EMMC_USER,UFS_LU2,,Y,N,NONE,N,N,N,,N,,RESERVED
+intsd,FAT,0,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO
+flashinfo,Raw data,16384,,EMMC_USER,UFS_LU2,,Y,N,NONE,N,N,N,,N,,RESERVED
+sgpt,Raw data,32,,EMMC_USER,UFS_LU2,,Y,N,NONE,N,N,N,,N,,RESERVED

获取分区大小和makefile中定义的关系

step 1 获取分区对应的块设备名称

ls -l /dev/block/platform/fe2e0000.mmc/by-name/boot 获取该分区对应的块设备名称

/dev/block/platform/fe2e0000.mmc/by-name/boot -> /dev/block/mmcblk1p7

step 2 获取块设备的大小

cat /proc/partitions | grep mmcblk1p7

 179        7      71680 mmcblk1p7

其中71680就是对应的分区大小,我们71680*1024得到的结果就是BOARD_BOOTIMAGE_PARTITION_SIZE定义的大小

  • 32
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值