为什么要新增分区?
项目开发中,需要存储一些数据,不想被在系统刷机或者重置的时候被清理掉,一般会根据需求新增自己的persist 分区,oem 分区等.
分区方式
可以是挂载的分区,类似于System.img,有自己目录,通过添加权限让用户可以通过文件系统访问到.
也可以是非挂载的,用于存储文件信息,普通用户看不到相关目录结构.
如何新增
高通平台
1,cp 侧分区表新增分区
partition.xml
<partition label="oem" size_in_kb="4" type="guid 号" bootable="false" readonly="false" filename="" />
<partition label="userdata" size_in_kb="4194304" type="1B81E7E6-F50D-419B-A739-2AEEF8DA3335" bootable="false" readonly="false" filename="userdata.img" sparse="true"/>
lable:分区名,长度小于17字符,否则会导致bootloader无法开机(同事开发经验)
size_in_kb:分区大小,单位是kb
type:UUID https://www.uuidgenerator.net/ 生成,与其他分区uuid 不一致即可
bootable:启动分区为true,非启动分区为false
readonly:是否只读
filename:刷机的镜像文件名,挂载的独立分区,需要设置该名称,对于上面的oem 分区,只是存储文件信息的,则不需要设置.
ps:
1,新增的分区,需要写到userdata 前面,这样减少的分区大小,会自动分配到userdata 上,不需要我们手动修改
2,校验是否生效
编译image_cp.sh.
打包imageout.sh
编译ap,然后刷机
adb shell
ls -alh dev/block/by-name/oem
lrwxrwxrwx 1 root root 21 1970-01-03 01:17 dev/block/by-name/oem -> /dev/block/mmcblk0p81
说明修改生效,/dev/block/mmcblk0p81是实际的文件系统
3,新增镜像刷机文件
参考系统中persist 分区的方案,改成自己的
LA.UM.9.15.R2/device/qcom/common/generate_extra_images.mk
#----------------------------------------------------------------------
# Generate persist image (persist.img)
#----------------------------------------------------------------------
ifneq ($(strip $(BOARD_PERSISTIMAGE_PARTITION_SIZE)),) #分区大小
ifneq ($(strip $(TARGET_NO_KERNEL)),true)
TARGET_OUT_PERSIST := $(PRODUCT_OUT)/persist //分区路径
INTERNAL_PERSISTIMAGE_FILES := \
$(filter $(TARGET_OUT_PERSIST)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
INSTALLED_PERSISTIMAGE_TARGET := $(PRODUCT_OUT)/persist.img //镜像名称
define build-persistimage-target
$(call pretty,"Target persist fs image: $(INSTALLED_PERSISTIMAGE_TARGET)")
@mkdir -p $(TARGET_OUT_PERSIST)
$(hide) PATH=$(HOST_OUT_EXECUTABLES):$${PATH} $(MKEXTUSERIMG) $(TARGET_OUT_PERSIST) $@ ext4 persist $(BOARD_PERSISTIMAGE_PARTITION_SIZE)
$(hide) chmod a+r $@
$(hide) $(call assert-max-image-size,$@,$(BOARD_PERSISTIMAGE_PARTITION_SIZE))
endef
$(INSTALLED_PERSISTIMAGE_TARGET): $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(INTERNAL_PERSISTIMAGE_FILES)
$(build-persistimage-target)
ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_PERSISTIMAGE_TARGET)
ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_PERSISTIMAGE_TARGET)
droidcore: $(INSTALLED_PERSISTIMAGE_TARGET)
.PHONY: persistimage
persistimage: $(INSTALLED_PERSISTIMAGE_TARGET)
endif
endif
上面主要修改点:
1,修改分区大小
BOARD_PERSISTIMAGE_PARTITION_SIZE 参考这个新增自己定义的分区大小,注意定义多少需要减少相应userdata 分区的大小
LA.UM.9.15.R2/device/qcom/项目名/BoardConfig.mk
BOARD_USERDATAIMAGE_PARTITION_SIZE := 53640798208
BOARD_PERSISTIMAGE_PARTITION_SIZE := 33554432
BOARD_PERSISTIMAGE_FILE_SYSTEM_TYPE := ext4
BOARD_METADATAIMAGE_PARTITION_SIZE := 16777216
BOARD_DTBOIMG_PARTITION_SIZE := 0x0800000
BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4
BOARD_FLASH_BLOCK_SIZE := 131072 # (BOARD_KERNEL_PAGESIZE * 64)
2,增加挂载点
a,新增目录
persist 唯一找到的路径,没有确认对不对,后面有空会验证下.
device/generic/common/dummy_arm64/BoardConfig.mk:36:
BOARD_ROOT_EXTRA_SYMLINKS += /mnt/vendor/persist:/persist
格式为<target>:<link_name>, 那么就会新建目录out/target/product/产品名/root/link_name, 然后用新建目录软练级到<target>
既然没有验证,我们就参考系统原生是怎么实现的
如果是根目录system/core/rootdir/Android.mk
ifdef BOARD_USES_METADATA_PARTITION
LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/metadata
endif
# For /odm partition.
LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/odm
通过该命令LOCAL_POST_INSTALL_CMD 创建自己的路径
也可以通过rc 的创建方式
LA.UM.9.15.R2/device/qcom/项目名/init.target.rc
on fs
start hwservicemanager
mount_all --early
chown root system /mnt/vendor/persist
chmod 0771 /mnt/vendor/persist
restorecon_recursive /mnt/vendor/persist
mkdir /mnt/vendor/persist/data 0700 system system
ps:如果需要创建多层目录mkdir -p 就可以了
b,修改分组,读写权限
LA.UM.9.15.R2/device/qcom/项目名/init.target.rc
中想
on fs
start hwservicemanager
mount_all --early
chown root system /mnt/vendor/persist
chmod 0771 /mnt/vendor/persist
3,挂载文件到挂载点
LA.UM.9.15.R2/device/qcom/*/fstab_AB_dynamic_partition.qti
LA.UM.9.15.R2/device/qcom/*/fstab_non_AB_dynamic_partition.qti
#分区路径 挂载点 文件系统类型
/dev/block/bootdevice/by-name/persist /mnt/vendor/persist ext4 noatime,nosuid,nodev,barrier=1 wait
4,生效标签
开机后重新迭代赋予标签
device/qcom/项目名/init.target.rc:69:
on fs
.......
restorecon_recursive /mnt/vendor/persist
......
4,添加Selinux
file_context 中加标签
/dev/block/platform/soc/xxxxx/by-name/partionname u:object_r:vendor_partition_file:s0
(这部分如果是加到最后一行,要注意加回车,不然会报莫名其妙的错误,
IndexError: list index out of range 巨坑)
/partionname(/.*)? u:object_r:vendor_partition_file:s0
/mnt/vendor/partionname(/.*)? u:object_r:vendor_partition_file:s0
这个是参考系统的标准格式
定义文件类型file.te
type vendor_partition_file, file_type, mlstrustedobject;
这个必须是mlstrustedobject,google 对data 分区的数据操作加了限制,所以不能参考系统的类型来写
定义设备类型device.te
type vendor_partition_file,dev_type;
然后就是缺少什么就加什么权限了
以上分区创建完成,接手之前同事的修改,加上我自己的踩的坑经验分享给大家,如有不准确的地方,还望指正.
参考:
https://www.dazhuanlan.com/bianyuan1/topics/1440206