android 新增分区

在项目开发中,为了保存不会因系统刷机或重置而丢失的数据,通常需要新增如persist或oem等分区。文章详细介绍了在高通平台上新增挂载和非挂载分区的方法,包括修改partition.xml,生成UUID,调整分区大小,以及通过mkextuserimg和fstab文件进行挂载。此外,还涉及挂载点的创建、权限设置、Selinux标签和文件系统类型的定义。
摘要由CSDN通过智能技术生成

为什么要新增分区?

项目开发中,需要存储一些数据,不想被在系统刷机或者重置的时候被清理掉,一般会根据需求新增自己的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

https://blog.51cto.com/u_15243273/5426754

https://www.icode9.com/content-4-374869.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值