需求: 客户有些文件或数据,需要做得恢复出厂设置还存在,故需新增一个分区存储客户数据。
要求:
a) 分区大小为50M
b) 应用层可读可写
c) 恢复出厂设置后不会被清除
d) 不需要打包.img
e) 不影响OTA升级
缺点:
1).通过代码在分区创建目录和文件,会涉及到SeLinux权限的修改 【影响GMS验证】
2).在现有软件版本上,需要格式化下载
环境: MTK Android 13 支持AB分区升级
**
新增分区修改如下:
**
1.新增testdata分区
路径:vendor/mediatek/proprietary/tools/ptgen/MT8188/partition_table_emmc_ab.csv
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,3670016,,EMMC_USER,UFS_LU2,,N,Y,super.img,Y,N,Y,,Y,,AUTO,,"ne(DYNAMIC_PARTITION_SUPPORT,yes) or eq(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS,yes)"
+testdata,EXT4,51200,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO,,
userdata,EXT4,3145728,,EMMC_USER,UFS_LU2,,N,Y,userdata.img,N,N,Y,,Y,,NEEDRESIZE,,
mrdump,Raw data,16384,,EMMC_USER,UFS_LU2,,Y,N,NONE,N,N,N,,N,,RESERVED,,"eq(TARGET_BUILD_VARIANT,user)"
2.在根目录下创建 /testdata 目录
路径:system/core/rootdir/Android.mk
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 storage mnt apex debug_ramdisk testdata \
linkerconfig second_stage_resources postinstall $(BOARD_ROOT_EXTRA_FOLDERS)); \
ln -sf /system/bin $(TARGET_ROOT_OUT)/bin; \
ln -sf /system/etc $(TARGET_ROOT_OUT)/etc; \
3.在fstab中配置testdata分区的挂载规则
3.1路径:vendor/mediatek/proprietary/hardware/fstab/mt8188/fstab.in
@@ -171,6 +171,7 @@ DEVPATH(protect1) /mnt/vendor/protect_f ext4 FS_FLAG_COMMIT FSMGR_FLAG_F
DEVPATH(protect2) /mnt/vendor/protect_s ext4 FS_FLAG_COMMIT FSMGR_FLAG_FMT
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(testdata) /testdata ext4 rw FSMGR_FLAG_FMT
#ifdef __PERSIST_PARTITION_SUPPORT
DEVPATH(persist) /mnt/vendor/persist ext4 FS_FLAG_COMMIT FSMGR_FLAG_FMT
3.2路径:vendor/mediatek/proprietary/hardware/fstab/mt8188/fstab.in.emmc
@@ -171,6 +171,7 @@ DEVPATH(protect1) /mnt/vendor/protect_f ext4 FS_FLAG_COMMIT FSMGR_FLAG_F
DEVPATH(protect2) /mnt/vendor/protect_s ext4 FS_FLAG_COMMIT FSMGR_FLAG_FMT
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(testdata) /testdata ext4 rw wait,check,formattable
DEVPATH(persist) /mnt/vendor/persist ext4 FS_FLAG_COMMIT FSMGR_FLAG_FMT
4.改变/testdata目录的权限
路径:device/mediatek/mt8188/init.mt8188.rc
@@ -332,6 +332,10 @@ on post-fs-data
chmod 0775 /vendor/xbin/MPED
chmod 0666 /dev/gps_emi
+# For testdata partition
+ chown system system /testdata
+ chmod 0777 /testdata
+
# -----------------------
# Add by MTK
# SCP log
路径:device/mediatek/sepolicy/base/vendor/file_contexts
@@ -591,6 +591,7 @@
/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/secro u:object_r:secro_block_device:s0
/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/system u:object_r:system_block_device:s0
/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/userdata u:object_r:userdata_block_device:s0
+/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/testdata u:object_r:metadata_block_device:s0
/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/cache u:object_r:cache_block_device:s0
/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/recovery u:object_r:recovery_block_device:s0
/dev/block/platform/mtk-\b(msdc|ufs)\b\.0/[0-9]+\.\b(msdc0|ufs0)\b/by-name/protect1 u:object_r:protect1_block_device:s0
@@ -682,6 +683,7 @@
/dev/block/by-name/system(_[ab])? u:object_r:system_block_device:s0
/dev/block/by-name/tee([12]|_[ab]) u:object_r:tee_block_device:s0
/dev/block/by-name/userdata u:object_r:userdata_block_device:s0
+/dev/block/by-name/testdata u:object_r:metadata_block_device:s0
/dev/block/by-name/vbmeta(_system|_vendor)?(_[ab])? u:object_r:vbmeta_block_device:s0
/dev/block/by-name/vcp(_[ab])? u:object_r:vcp_device:s0
/dev/block/by-name/vendor(_[ab])? u:object_r:vendor_block_device:s0
6.修改/testdata目录的标签,否则会moun动作会因为selinux权限问题而失败
路径:system/sepolicy/private/file_contexts
@@ -2,6 +2,9 @@
# Root
/ u:object_r:rootfs:s0
+# For testdata
+/testdata u:object_r:metadata_file:s0
+
# Data files
/adb_keys u:object_r:adb_keys_file:s0
/build\.prop u:object_r:rootfs:s0
7.添加对testdata分区读写操作权限
路径:device/mediatek/sepolicy/base/vendor/system_app.te
注:关于SeLinux权限的添加,请根据实际报错的avc添加对应的权限。
+allow system_app unlabeled:dir rw_dir_perms;
+allow system_app unlabeled:file { rw_file_perms };
验证添加的分区是否可以mount可以使用如下指令:
adb shell
mount | grep testdata
验证新增分区问题,目前做了如下实验:
1.添加新分区后,通过adb 在分区中分别创建目录和文件,然后恢复出厂设置,分区中新创建的目录和文件还存在。
2.添加新分区后,通过adb 在分区中分别创建目录和文件,然后固件升级,分区中新创建的目录和文件不存在。
3.添加新分区后,通过adb 在分区中分别创建目录和文件,然后OTA差分包升级,可以升级成功,且分区中新创建的目录和文件还存在。