当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/327598/

相关文章:

  • 开题报告-在线问卷调查系统
  • 开题报告-衣服穿搭推荐系统
  • OrbbecSDK @ Ubuntu 20.04 面向人体骨架识别
  • 语音处理新手福音:FSMN-VAD控制台开箱即用
  • ANIMATEDIFF PRO商业应用:电商产品动态海报自动生成实战案例
  • Clawdbot运维监控:Node.js实现服务健康检查
  • arm64 x64交叉编译环境搭建:完整指南
  • 开题报告学生读书笔记共享平台设计
  • SGLang内存管理技巧,避免OOM全靠这招
  • Lingyuxiu MXJ创作引擎实操手册:生成性能压测与QPS/延迟指标分析
  • Jimeng LoRA快速上手:LoRA版本回滚机制与历史快照保存/恢复操作指南
  • 从零到上线只需三步|基于GTE的中文语义匹配服务镜像发布
  • StructBERT中文匹配系统应用案例:客服工单意图识别与聚类落地实践
  • Qwen3-TTS-12Hz-1.7B-VoiceDesign保姆级教程:WebUI首次加载与缓存优化
  • java 输入与结构
  • Java毕设项目:基于BS的小区家政服务预约平台的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 如何解决移动端软键盘弹出后页面布局错乱/按钮被遮挡的问题
  • 如何解决IE浏览器不支持ES6+语法报SCRIPT1002: 语法错误问题
  • 交换机专题:什么是ALS(激光器自动关断)
  • 如何解决微信小程序分包加载失败/页面跳转分包页面白屏问题
  • 从零开始学虚拟化:性能优化全指南(资源分配 + 存储网络 + 监控)
  • NPM1304的主要几个功能
  • 孩子们这么多天我只落下了一天(其实全勤
  • 超3.5万个网站遭入侵:恶意脚本将用户重定向至赌博平台
  • 服装企业选择ERP软件时应该关注哪些核心因素?
  • 寒假集训1——暴力和枚举
  • 记一次博客险些火葬场事件
  • HarmonyOS 应用开发环境搭建与 DevEco Studio 配置
  • Nginx 反向代理配置 React 前端与 Python 后端
  • [嵌入式系统-183]:运动控制的插补是什么意思?