RK Android 10/11/12 系统分区扩展实战新增16M test分区并挂载到/test_dir在嵌入式Android系统开发中随着产品功能的不断扩展原有的分区布局可能无法满足新的存储需求。本文将详细介绍如何在RK Android 10及以上版本中为RK3566_R等设备新增一个16MB的test分区并将其挂载到/test_dir目录下的完整流程。1. 理解Android分区机制Android系统采用独特的分区设计每个分区都有特定的用途和挂载点。在RK平台上分区信息主要通过parameter文件定义而挂载行为则由fstab文件控制。Android 10及以上版本引入了system-as-root设计这意味着根文件系统不再位于ramdisk.img中system.img包含了根文件系统内容必须使用ramdisk来支持dm-linear特性关键分区概念/system包含Android系统核心文件/vendor存放厂商特定的二进制文件和配置/data用户数据存储区域/cache临时缓存区域提示在修改分区前务必备份当前parameter文件和fstab配置错误的修改可能导致设备无法启动。2. 修改分区定义2.1 更新BoardConfig.mk首先需要在产品的BoardConfig.mk中定义新的分区。以rk3566_r为例# device/rockchip/rk356x/rk3566_r/BoardConfig.mk # 在文件末尾添加以下内容 BOARD_WITH_SPECIAL_PARTITIONS : test:16M如果需要添加多个分区可以用逗号分隔BOARD_WITH_SPECIAL_PARTITIONS : test:16M,test1:16M2.2 修改RebuildParameter.mk确保新增的分区会被包含到最终的parameter文件中# device/rockchip/common/build/rockchip/RebuildParameter.mk ifneq ($(strip $(BOARD_WITH_SPECIAL_PARTITIONS)),) partition_list : $(partition_list),$(BOARD_WITH_SPECIAL_PARTITIONS) endif2.3 验证分区表编译完成后可以通过以下命令验证parameter文件是否包含新分区$ grep test out/target/product/rk3566_r/parameter.txt3. 创建文件系统镜像新分区需要包含有效的文件系统才能被挂载。我们将创建一个ext4格式的文件系统镜像。3.1 制作ext4镜像使用make_ext4fs工具创建16MB的镜像文件$ make_ext4fs -l 16M -a test test.img参数说明-l 16M指定镜像大小为16MB-a test设置挂载点为/testtest.img输出镜像文件名3.2 烧写镜像到设备将生成的test.img烧录到设备的test分区$ adb reboot bootloader $ fastboot flash test test.img $ fastboot reboot或者通过RK工具将镜像打包到固件中。4. 配置系统挂载4.1 修改fstab文件找到产品的fstab模板文件通常位于device/rockchip/common/scripts/fstab_tools/fstab.in添加新分区的挂载信息diff --git a/scripts/fstab_tools/fstab.in b/scripts/fstab_tools/fstab.in index 2ec6c265..d823c46d 100755 --- a/scripts/fstab_tools/fstab.in b/scripts/fstab_tools/fstab.in -10,6 10,7 ${_block_prefix}odm /odm ext4 ro,barrier1 ${_flags},first_stage_mount /dev/block/by-name/cache /cache ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check /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/test /test_dir ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check /devices/platform/*usb* auto vfat defaults voldmanagedusb:auto挂载参数说明noatime,nodiratime不更新文件访问时间提高性能nosuid,nodev禁止setuid程序和设备文件增强安全性noauto_da_alloc,discard优化闪存写入和TRIM支持wait,check等待设备就绪并检查文件系统4.2 创建挂载目录在root目录下创建test_dir目录修改Android.mkdiff --git a/rootdir/Android.mk b/rootdir/Android.mk index 24b3999..71297fb 100644 --- a/rootdir/Android.mk b/rootdir/Android.mk -139,6 139,7 LOCAL_POST_INSTALL_CMD ; ln -sf /vendor/odm/overlay $(TARGET_ROOT_OUT)/odm/ov LOCAL_POST_INSTALL_CMD ; ln -sf /vendor/odm/priv-app $(TARGET_ROOT_OUT)/odm/priv-app LOCAL_POST_INSTALL_CMD ; ln -sf /vendor/odm/usr $(TARGET_ROOT_OUT)/odm/usr LOCAL_POST_INSTALL_CMD ; mkdir -p $(TARGET_ROOT_OUT)/test_dir ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE LOCAL_POST_INSTALL_CMD ; mkdir -p $(TARGET_ROOT_OUT)/cache4.3 配置SELinux策略为新目录添加SELinux文件上下文diff --git a/sepolicy/private/file_contexts b/sepolicy/private/file_contexts index d0b1d91..af22da1 100644 --- a/sepolicy/private/file_contexts b/sepolicy/private/file_contexts -1,2 1,3 # file in /system /system/bin/move_widevine_data\.sh u:object_r:move-widevine-data-sh_exec:s0 /test_dir(/.*)? u:object_r:cache_file:s0这里我们将/test_dir及其内容设置为cache_file类型与/cache分区使用相同的安全上下文。5. 验证分区挂载完成上述修改后编译并烧写完整固件到设备。启动后可以通过以下命令验证分区是否正确挂载$ adb shell mount | grep test /dev/block/by-name/test on /test_dir type ext4 (rw,noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard)检查文件系统权限$ adb shell ls -ld /test_dir drwxr-xr-x 2 root root 4096 2023-01-01 00:00 /test_dir测试读写功能$ adb shell touch /test_dir/testfile $ adb shell ls /test_dir testfile6. 高级配置与优化6.1 自动格式化新分区如果希望在首次启动时自动格式化新分区可以修改init.rc脚本on early-fs # 检查test分区是否需要格式化 exec - root -- /system/bin/e2fsck -y /dev/block/by-name/test exec - root -- /system/bin/tune2fs -l /dev/block/by-name/test || /system/bin/mke2fs -t ext4 -b 4096 -m 0 /dev/block/by-name/test6.2 性能优化建议对于频繁读写的小分区可以考虑以下优化调整ext4参数tune2fs -o journal_data_writeback /dev/block/by-name/test tune2fs -O ^has_journal /dev/block/by-name/test启用TRIMfstrim /test_dir调整I/O调度器on boot write /sys/block/mmcblk0/queue/scheduler noop6.3 分区大小调整策略如果需要调整分区大小需考虑以下因素因素建议备注存储内容类型日志类数据可较小媒体类需较大写入频率高频写入需要更多预留空间建议保留10%空闲文件数量大量小文件需要更多inode使用-N参数调整未来扩展预留20-30%空间以备后续需求计算公式分区大小 (平均文件大小 × 文件数量) × 1.37. 常见问题排查7.1 分区未挂载如果分区未自动挂载检查以下方面dmesg日志adb shell dmesg | grep testfstab配置adb shell cat /fstab.${ro.hardware}文件系统完整性adb shell e2fsck -n /dev/block/by-name/test7.2 权限问题遇到权限拒绝时检查SELinux策略adb shell ls -Z /test_dir文件系统挂载选项adb shell mount | grep test_dir目录权限adb shell stat /test_dir7.3 性能问题如果分区性能不佳可以尝试# 禁用atime完全 adb shell mount -o remount,strictatime /test_dir # 调整内核缓存参数 echo 50 /proc/sys/vm/dirty_background_ratio echo 90 /proc/sys/vm/dirty_ratio