
1. 动态分区基础与RK平台适配在Android 10及更高版本中动态分区Dynamic Partitions彻底改变了传统的分区管理方式。这个机制允许系统在OTA更新时动态调整分区大小而不再需要预先划分固定的分区空间。对于RK平台的开发者来说理解这个机制尤为重要。动态分区的核心在于super分区它实际上是一个逻辑容器内部包含了system、vendor、product等子分区。在RK3566/RK3568等主流芯片方案中我们需要重点关注以下几个关键配置BOARD_SUPER_PARTITION_SIZE这个参数决定了super分区的总容量。根据我的经验对于RK3566平台建议至少设置为4GB4294967296字节特别是当需要预装大量系统应用时。lpmake工具这是Android提供的动态分区打包工具RK平台对其进行了定制优化。通过这个工具我们可以将多个分区镜像合并成super.img。一个典型的打包命令如下lpmake --device-size4294967296 \ --metadata-size65536 \ --metadata-slots2 \ --outputsuper.img \ --partitionsystem:readonly:2147483648:image/system.img \ --partitionvendor:readonly:1073741824:image/vendor.img \ --partitionproduct:readonly:536870912:image/product.img在RK平台上动态分区的实现有几个特殊之处需要在内核配置中启用CONFIG_DM_VERITY和CONFIG_DM_LINEAR支持必须确保BOARD_BUILD_SYSTEM_ROOT_IMAGE设置为false需要修改BoardConfig.mk中的BOARD_SUPER_PARTITION_BLOCK_DEVICES配置提示在调试动态分区时可以使用adb shell lpdump命令查看当前super分区的实际布局这对验证配置是否正确非常有用。2. 扩展super分区与新增test_dir分区在实际项目中我们经常需要扩展super分区或新增自定义分区。以在RK3566平台上新增一个16MB的test_dir分区为例下面是具体操作步骤首先在BoardConfig.mk中添加分区定义BOARD_WITH_SPECIAL_PARTITIONS : test:16M然后修改RebuildParameter.mk确保新分区被包含到parameter文件中ifneq ($(strip $(BOARD_WITH_SPECIAL_PARTITIONS)),) partition_list : $(partition_list),$(BOARD_WITH_SPECIAL_PARTITIONS) endif接下来是最关键的一步 - 调整super分区大小。假设原super分区为4GB现在需要增加16MB应该这样修改BOARD_SUPER_PARTITION_SIZE : 4328521728 # 原4GB 16MB BOARD_SUPER_PARTITION_GROUPS : rockchip_dynamic_partitions BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_SIZE : 4299169792 BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_PARTITION_LIST : system vendor product test在完成这些修改后需要重新生成super.img。这里有个坑我踩过直接make superimage可能不会包含新分区必须先单独生成test分区镜像make ext4testimage -j83. 分区挂载与fstab配置在system-as-root架构下新增分区的挂载需要特别注意挂载时机。以下是让test_dir分区在启动早期就挂载的关键步骤首先在device/rockchip/common/scripts/fstab_tools/fstab.in中添加挂载点/dev/block/by-name/test /test_dir ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check然后需要为新建目录设置正确的SELinux上下文。修改sepolicy/private/file_contexts/test_dir(/.*)? u:object_r:cache_file:s0在RK平台上还需要处理一个特殊问题早期挂载阶段的依赖关系。我遇到过因为挂载顺序不当导致分区不可用的情况。解决方法是在init.rockchip.rc中添加on early-fs mkdir /test_dir 0755 root root mount_all /vendor/etc/fstab.rockchip对于需要读写权限的分区还需要在init.rockchip.power.rc中添加on property:sys.boot_completed1 chmod 0777 /test_dir4. 文件系统创建与烧录验证新建分区后必须为其创建文件系统才能正常使用。RK平台推荐使用ext4文件系统下面是创建test分区镜像的完整流程首先创建空镜像文件dd if/dev/zero oftest.img bs1M count16然后格式化为ext4mkfs.ext4 -L test test.img调整文件系统参数这对嵌入式设备很重要tune2fs -c -1 -i 0 -o ^has_journal test.img在Android编译系统中可以通过添加PRODUCT_PACKAGES确保镜像被正确打包PRODUCT_PACKAGES \ testimage烧录验证阶段我建议使用RKDevTool的Advanced Function功能单独烧录test分区这样可以快速验证而不需要重刷整个系统。烧录完成后通过以下命令验证adb shell mount | grep test_dir adb shell ls -lZ /test_dir常见问题排查如果挂载失败检查内核日志dmesg | grep test如果权限问题检查SELinux审计日志adb shell cat /proc/kmsg | grep avc如果分区不可见使用adb shell ls -l /dev/block/by-name/确认设备节点5. 系统集成与调试技巧将新分区完全集成到系统中还需要一些额外工作。首先是确保在编译时创建挂载点修改system/core/rootdir/Android.mkLOCAL_POST_INSTALL_CMD ; mkdir -p $(TARGET_ROOT_OUT)/test_dir对于需要存储数据的场景建议在init.rc中添加自动恢复权限的脚本service test_dir_setup /system/bin/test_dir_init.sh class main user root group root oneshot对应的test_dir_init.sh脚本内容#!/system/bin/sh chmod 0777 /test_dir restorecon -R /test_dir调试时的一些实用命令# 查看分区布局 adb shell lpdump # 检查文件系统错误 adb shell e2fsck -f /dev/block/by-name/test # 调整分区大小需要卸载分区 adb shell resize2fs /dev/block/by-name/test性能优化建议对于频繁读写的小文件可以在挂载时添加noauto_da_alloc选项大文件存储场景下建议使用nodiscard挂载选项减少首次挂载时间考虑在fstab中添加commit60参数平衡数据安全与性能6. 实际案例数据采集分区实现去年在一个工业设备项目中我们实现了独立的数据采集分区。这个案例展示了如何将理论应用到实际场景。项目需求独立存储传感器数据避免主系统更新影响数据支持快速擦除数据而不影响系统实现方案在parameter.txt中划分256MB专用分区0x100000000x04000000(data_collect)定制fstab挂载配置/dev/block/by-name/data_collect /data_collect ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check,formattable添加自动初始化脚本if [ ! -f /data_collect/.initialized ]; then dd if/dev/zero of/dev/block/by-name/data_collect bs1M count256 mkfs.ext4 -L data_collect /dev/block/by-name/data_collect touch /data_collect/.initialized fi这个方案成功解决了数据隔离问题即使系统OTA更新也不会影响采集数据。实测写入性能提升了约30%因为避免了系统分区的IO竞争。