Android 12 在 Rockchip 平台上的分区表parametet.txt 自动生成机制解析
📦 Android 12 在 Rockchip 平台上的分区表自动生成机制解析
在基于 Rockchip 平台的 Android 12 项目中,分区表的生成采用了一套自动化构建流程,结合 Makefile 和 Python 脚本动态生成 parameter.txt
,用于镜像打包和烧录。这种机制不仅提升了构建效率,也为定制化部署提供了灵活入口。本文将深入解析该机制的核心组成部分,并说明如何定制分区布局以满足不同设备需求。
🧩 分区表生成的核心流程
整个流程由三部分组成:
1️⃣ parameter.in
:分区表模板输入
路径:device/rockchip/common/scripts/parameter_tools/parameter.in
该文件是分区表的模板,核心字段如下:
CMDLINE:mtdparts=rk29xxnand:${_partition_list}
其中 ${_partition_list}
是一个变量,由构建系统动态生成。该模板还可能包含设备型号、固件版本等元信息。
2️⃣ RebuildParameter.mk
:Makefile 构建逻辑
路径:device/rockchip/common/build/rockchip/RebuildParameter.mk
该 Makefile 脚本负责:
- 判断是否启用 A/B 分区结构(
BOARD_USES_AB_IMAGE
) - 根据
BOARD_BOOT_HEADER_VERSION
决定是否添加vendor_boot
和resource
分区(Header V3) - 拼接分区列表字符串
partition_list
,包括分区名与大小(如boot:16M
) - 最终将
partition_list
传入 Python 脚本进行偏移计算
示例逻辑:
ifeq ($(strip $(BOARD_USES_AB_IMAGE)), true)partition_list := security:4M,uboot_a:4M,trust_a:4M,misc:4Mpartition_list += dtbo_a:8M,vbmeta_a:1M,boot_a:32M
elsepartition_list := security:4M,uboot:4M,trust:4M,misc:4Mpartition_list += dtbo:8M,vbmeta:1M,boot:32M,recovery:32M
endifpartition_list += backup:372M,cache:256M,metadata:16Mifeq ($(strip $(BUILD_WITH_GOOGLE_FRP)), true)partition_list += frp:512K
endif
注意:分区大小单位为
K/M/G
,偏移尚未计算,后续由 Python 脚本完成。
3️⃣ parameter_generator.py
:最终生成器
路径:device/rockchip/common/scripts/parameter_tools/parameter_generator.py
该 Python 脚本负责:
- 读取
parameter.in
模板 - 将
partition_list
中的每个分区转换为size@offset(name)
格式 - 自动计算每个分区的起始地址(offset),并对齐到 512 字节块
- 特殊处理
userdata
分区为grow
类型(动态扩展)
核心函数:
def calculate_blocks(size):# 将 K/M/G 转换为字节,再除以 512 得到块数...def generate_pt(pt_name, pt_size, pt_start):if pt_name == 'userdata':return "-@{:#010x}(userdata:grow)".format(pt_start)part_size = calculate_blocks(pt_size)return "{:#010x}@{:#010x}({})".format(part_size, pt_start, pt_name), pt_start + part_size
最终输出的 parameter.txt
会替换 ${_partition_list}
为完整的分区表字符串。
🧪 实际挂载情况分析(基于 Android 12)
通过 df -h
和 dmesg
可知,系统实际挂载的分区如下:
分区名 | 挂载点 | 用途说明 |
---|---|---|
metadata | /metadata | 加密与动态挂载元数据 |
cache | /cache | OTA 缓存与临时数据 |
oem | /oem | 厂商配置或预装应用 |
userdata | /data | 用户数据主分区 |
super | 动态映射 | 映射出 /system , /vendor , /product 等逻辑卷 |
其余分区如 boot
, vbmeta
, recovery
, misc
, dtbo
, backup
, baseparameter
, frp
等虽未挂载,但在启动流程中仍被 bootloader 或 init 使用,不可随意裁剪。
🛠️ 如何定制分区表
你可以通过以下方式定制分区布局:
✅ 修改分区大小
在 BoardConfig.mk
中设置:
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x200000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x300000
✅ 添加新分区
在 RebuildParameter.mk
中添加:
partition_list += log:16M
并在 fstab
或 init.rc
中挂载 /log
✅ 精简未使用分区
如 backup
, misc
, dtbo
, cache
, oem
等,可根据实际用途裁剪,前提是 bootloader 不依赖。
📘 示例输出(parameter.txt)
CMDLINE:mtdparts=rk29xxnand:\
0x00800000@0x0000c800(boot),\
0x00800000@0x0002c800(recovery),\
0x17400000@0x001e5000(super),\
0x01000000@0x00811400(oem),\
-@0x00911400(userdata:grow)