news 2026/3/2 19:23:09

Android动态分区实战:从BoardConfig.mk到super分区的完整配置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android动态分区实战:从BoardConfig.mk到super分区的完整配置指南

1. 动态分区基础概念

动态分区是Android 10引入的重要特性,它彻底改变了传统Android系统的分区管理方式。简单来说,动态分区允许系统在OTA更新时动态调整分区大小,而不再需要预先为每个分区分配固定空间。这就像给你的手机存储空间装上了"弹性伸缩"功能,系统可以根据实际需求灵活调配空间。

传统分区方案中,每个分区(如system、vendor等)都有固定大小。这会导致两个典型问题:一是分区空间可能浪费(比如system分区有大量闲置空间但vendor分区已满),二是OTA更新时可能因为空间不足而失败。动态分区通过引入super分区解决了这些问题,它将多个分区合并到一个大的存储池中,由系统动态管理。

动态分区的核心组件包括:

  • super分区:所有动态分区的容器,相当于一个"超级大仓库"
  • 分区组:逻辑上的分区集合,用于限制组内分区总大小
  • 元数据:记录分区布局和属性的信息

2. BoardConfig.mk关键配置

BoardConfig.mk是动态分区配置的核心文件,位于device/<厂商>/<设备名>/目录下。下面我们详细解析关键配置项:

2.1 基础开关配置

首先需要启用动态分区功能:

# 启用动态分区 PRODUCT_USE_DYNAMIC_PARTITIONS := true # 如果是升级现有设备到动态分区,还需要设置 PRODUCT_RETROFIT_DYNAMIC_PARTITIONS := true

2.2 super分区设置

super分区是整个动态分区的基础,需要指定其总大小:

# super分区总大小(单位:字节) BOARD_SUPER_PARTITION_SIZE := 12884901888 # 12GB # 元数据存储设备(通常是system分区) BOARD_SUPER_PARTITION_METADATA_DEVICE := system

2.3 分区组配置

动态分区通过分组管理,每个组有大小限制和包含的分区列表:

# 定义分区组 BOARD_SUPER_PARTITION_GROUPS := my_dynamic_partitions # 设置组大小 BOARD_MY_DYNAMIC_PARTITIONS_SIZE := 6442450944 # 6GB # 组内包含的分区 BOARD_MY_DYNAMIC_PARTITIONS_PARTITION_LIST := system vendor product

对于更复杂的设备,可以定义多个分区组:

BOARD_SUPER_PARTITION_GROUPS := group_a group_b BOARD_GROUP_A_SIZE := 4831838208 BOARD_GROUP_A_PARTITION_LIST := system product_services BOARD_GROUP_B_SIZE := 1610612736 BOARD_GROUP_B_PARTITION_LIST := vendor product odm

3. 动态分区实战配置

3.1 新设备配置流程

对于全新支持动态分区的设备,配置步骤如下:

  1. 创建super分区:在分区表中添加super分区,移除system/vendor等独立分区
  2. 设置分区对齐:确保super分区与I/O请求大小对齐
# 检查设备最小I/O大小 cat /sys/block/sda/queue/minimum_io_size # 检查分区对齐偏移 cat /sys/block/sda/sda17/alignment_offset
  1. 配置device.mk
PRODUCT_USE_DYNAMIC_PARTITIONS := true
  1. 配置BoardConfig.mk:如前面章节所示设置分区组和大小

3.2 现有设备升级配置

将现有设备升级到动态分区需要额外配置:

# 指定用于存储动态分区的块设备 BOARD_SUPER_PARTITION_BLOCK_DEVICES := system vendor # 设置每个块设备的大小 BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE := 3221225472 # 3GB BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE := 1073741824 # 1GB # 计算super分区总大小 BOARD_SUPER_PARTITION_SIZE := 4294967296 # 4GB

4. 分区大小优化技巧

动态分区的一个主要优势是可以优化存储空间使用:

  1. 启用块级去重:减少重复数据占用空间
BOARD_EXT4_SHARE_DUP_BLOCKS := true
  1. 自动最小化分区:构建系统会自动计算最小所需空间
# 系统会自动计算最小分区大小 # 不需要设置BOARD_SYSTEMIMAGE_PARTITION_SIZE
  1. 手动保留空间(非必要不建议):
# 为product分区保留50MB空间 BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE := 52428800
  1. 大小计算原则
  • A/B设备:组大小 ≤ (BOARD_SUPER_PARTITION_SIZE / 2) - 4MB
  • 非A/B设备:组大小 ≤ BOARD_SUPER_PARTITION_SIZE - 4MB

5. 常见问题解决

5.1 编译错误排查

  1. 分区大小超出限制
Error: Dynamic partition size is too large

解决方案:检查分区组大小计算,确保留有足够开销(建议4MB)

  1. 冲突配置
Error: BOARD_BUILD_SYSTEM_ROOT_IMAGE cannot be true with dynamic partitions

解决方案:动态分区不能与system-as-root同时启用

5.2 运行时问题

  1. adb remount失败: 动态分区下需要启用overlayfs:
# 在BoardConfig.mk中启用 BOARD_USES_OVERLAYFS := true
  1. 分区挂载失败: 检查fstab配置,确保包含必要标志:
# 示例fstab条目 system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount
  1. AVB验证失败: 动态分区需要使用AVB 2.0,并配置vbmeta分区:
BOARD_AVB_VBMETA_SYSTEM := system BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048

6. 高级配置技巧

6.1 多槽位(A/B)设备配置

对于支持无缝更新的A/B设备,需要特别注意:

# 确保组大小不超过super分区的一半 BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE := 6442450944 # 6GB BOARD_SUPER_PARTITION_SIZE := 12884901888 # 12GB # OTA更新分区列表 AB_OTA_PARTITIONS += system vendor product

6.2 内核命令行配置

动态分区设备需要添加boot_devices参数:

# 示例:根据实际设备路径修改 BOARD_KERNEL_CMDLINE += androidboot.boot_devices=soc/100000.ufshc

6.3 SELinux策略配置

需要为super分区块设备添加标签:

# 在file_contexts中添加 /dev/block/platform/soc/10000\.ufshc/by-name/super u:object_r:super_block_device:s0

7. 调试与验证

7.1 查看动态分区信息

编译完成后,可以检查生成的动态分区信息:

# 查看super.img信息 lpdump super.img # 查看设备上的动态分区 adb shell lpdump /dev/block/by-name/super

7.2 分区使用情况检查

# 启用adb验证 adb enable-verity adb reboot # 查看分区使用情况 adb shell df -h

7.3 构建产物验证

检查生成的super.img是否包含预期分区:

# 解压super.img检查内容 simg2img super.img super.raw.img mkdir super_mount && sudo mount super.raw.img super_mount ls -l super_mount
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/2 6:41:39

DeepSeek-OCR-2部署案例:高校图书馆古籍PDF数字化项目落地纪实

DeepSeek-OCR-2部署案例&#xff1a;高校图书馆古籍PDF数字化项目落地纪实 1. 为什么古籍数字化卡在OCR这一步&#xff1f; 高校图书馆每年要处理上千册明清线装书、民国影印本和手抄善本。这些文献纸张泛黄脆化&#xff0c;版式千差万别——有的带朱砂批注&#xff0c;有的夹…

作者头像 李华
网站建设 2026/2/27 13:23:58

销售合同盖章流程长?数字员工自动走审批+电子盖章,1天搞定

销售合同盖章流程优化方案 传统销售合同盖章流程涉及多部门审批、物理盖章及邮寄&#xff0c;耗时长达数周。通过数字员工&#xff08;RPAAI&#xff09;与电子签章技术结合&#xff0c;可实现全流程自动化&#xff0c;将周期压缩至1天内完成。 自动化审批与电子盖章实施步骤…

作者头像 李华
网站建设 2026/3/1 4:30:06

智能客服实战应用:用IndexTTS-2-LLM快速搭建语音系统

智能客服实战应用&#xff1a;用IndexTTS-2-LLM快速搭建语音系统 1. 为什么智能客服需要“会说话”的语音系统&#xff1f; 你有没有遇到过这样的场景&#xff1a; 客户在电商页面反复刷新&#xff0c;等了30秒才看到一句“正在接入人工客服”&#xff1b; 客服机器人回复文字…

作者头像 李华
网站建设 2026/2/28 10:31:23

MusePublic本地部署避坑指南:显存溢出/黑图/破碎问题全解决

MusePublic本地部署避坑指南&#xff1a;显存溢出/黑图/破碎问题全解决 1. 为什么 MusePublic 部署总“卡在最后一秒” 你是不是也遇到过这些情况&#xff1a; 启动 WebUI 后&#xff0c;点下「开始创作」&#xff0c;进度条走到 80% 就突然卡住&#xff0c;终端报错 CUDA o…

作者头像 李华
网站建设 2026/3/2 5:06:26

小白也能懂的YOLOv12:官版镜像保姆级使用教程

小白也能懂的YOLOv12&#xff1a;官版镜像保姆级使用教程 你有没有试过——刚下载好目标检测模型&#xff0c;还没开始推理&#xff0c;就卡在了“ImportError: No module named torch”&#xff1f;或者明明装好了CUDA&#xff0c;torch.cuda.is_available()却返回False&…

作者头像 李华
网站建设 2026/3/2 8:46:58

HarmonyOS 应用开发环境搭建与 DevEco Studio 配置

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

作者头像 李华