以"一加 15"为例,手把手教你给 FFF 的配置文件添加新设备
目录
为什么要配置新机型?
FFF 的 SuperBuilder(Super 合成功能)依赖 devices_sizes.json 文件来知道每台设备的:
- super 分区有多大(SuperSize)
- 动态分区组叫什么名字、有多大(Property、GroupSize)
- 组里有哪些逻辑分区(Partitions)
如果你的设备不在这个配置文件里,SuperBuilder 就无法自动生成正确的 lpmake 参数。所以添加新机型 = 往这个 json 里加一条记录。
准备工作
你需要:
- 一台解了 BL 锁的设备(一加 15 为例)
- 电脑上装好 ADB / Fastboot 工具
- 设备已 root 或能执行 adb root(否则 lpdump 会报权限不够)
方法一:从售后 OFP 包提取(推荐,无需设备)
Oplus 官方的售后刷机包(OFP)里已经包含了你需要的所有信息,不用连设备、不用 root。
需要的文件
OFP 包解压后,找到这两个文件:
META/dynamic_partitions_info.txt ← 最直接,纯文本
META/super_def.00000000.json ← 更完整,含分区大小明细
从 dynamic_partitions_info.txt 提取
文件内容示例:
super_partition_groups=qti_dynamic_partitions
dynamic_partition_list=system system_ext vendor product my_product odm my_engineering vendor_dlkm system_dlkm system_dlkm_oki my_stock my_heytap my_carrier my_region my_company my_preload my_bigball my_manifest
qti_dynamic_partitions_size=18903728128
qti_dynamic_partitions_partition_list=system system_ext vendor product my_product odm my_engineering vendor_dlkm system_dlkm system_dlkm_oki my_stock my_heytap my_carrier my_region my_company my_preload my_bigball my_manifest
virtual_ab=true
字段对应关系:
| 配置文件字段 | 文件内容 | 说明 |
|---|---|---|
Property |
super_partition_groups=qti_dynamic_partitions |
= 后面的值 |
GroupSize |
qti_dynamic_partitions_size=18903728128 |
= 后面的数字 |
Partitions |
dynamic_partition_list=... |
= 后面的列表,空格分隔 |
从 super_def.json 提取
{
"super_device": {
"total_size": "18907922432" ← SuperSize
},
"groups": [
{
"name": "qti_dynamic_partitions_a",
"maximum_size": "18903728128" ← GroupSize
}
],
"partitions": [
{
"name": "system_a",
"size": "975482880",
"group_name": "qti_dynamic_partitions_a"
}
]
}
字段对应:
| 配置文件字段 | json 路径 |
|---|---|
SuperSize |
super_device.total_size |
GroupSize |
groups[].maximum_size(选最大的那个) |
Property |
groups[].name(选最大的那个 group 名) |
Partitions |
partitions[].name(去 _a/_b 后缀) |
两种方法的差异
| OFP 包 | lpdump | |
|---|---|---|
| 需要设备 | 不需要 | 需要 |
| 需要 root | 不需要 | 需要 |
| 信息完整度 | 完整(含分区分组归属) | 完整 |
Partitions 含 system_dlkm_oki |
通常会有 | lpdump 里不一定有(该分区可能不在 super 内) |
方法二:从设备 lpdump 获取(备选)
连接设备后执行:
adb root
adb shell lpdump --slot _a
如果报权限不够,可以从 OTA 包中解出 super.img 后在本地运行:
lpdump super.img
以我们的一加 15 为例,输出如下:
Slot 0:
Metadata version: 10.2
Metadata size: 3308 bytes
Metadata max size: 65536 bytes
Metadata slot count: 3
Header flags: virtual_ab_device
Block device table:
------------------------
Partition name: super
First sector: 2048
Size: 18907922432 bytes
Flags: none
Group table:
------------------------
Name: default
Maximum size: 0 bytes
Flags: none
------------------------
Name: qti_dynamic_partitions_a
Maximum size: 18903728128 bytes
Flags: none
------------------------
Name: cow
Maximum size: 0 bytes
Flags: none
Partition table:
------------------------
Name: my_bigball_a
Group: qti_dynamic_partitions_a
Extents:
0 .. 655 linear super 2048
------------------------
Name: my_carrier_a
Group: qti_dynamic_partitions_a
Extents:
0 .. 655 linear super 3072
...
从 lpdump 提取配置字段
1. SuperSize — Block device table 的 Size
Size: 18907922432 bytes <- 照抄
对应的 json 字段:"SuperSize": 18907922432
2. Property + GroupSize — Group table
找到 Maximum size 最大的那个 group:
Name: qti_dynamic_partitions_a
Maximum size: 18903728128 bytes
对应的 json 字段:
"Property": "qti_dynamic_partitions_a"(group 名字)"GroupSize": 18903728128(Maximum size)
不同芯片的 Property 常见值:
| 芯片 | Property |
|---|---|
| 高通 | qti_dynamic_partitions |
| 联发科 | main |
3. Partitions — Partition table 的分区名列表
把所有非 -cow 的分区列出来,去掉 _a / _b 后缀:
lpdump 原始名 配置里的名字
my_bigball_a → my_bigball
my_carrier_a → my_carrier
my_company_a → my_company
my_engineering_a → my_engineering
my_heytap_a → my_heytap
my_manifest_a → my_manifest
my_preload_a → my_preload
my_product_a → my_product
my_region_a → my_region
my_stock_a → my_stock
odm_a → odm
product_a → product
system_a → system
system_dlkm_a → system_dlkm
system_ext_a → system_ext
vendor_a → vendor
vendor_dlkm_a → vendor_dlkm
(以 -cow 结尾的跳过,不参与合成)
为什么去掉 _a / _b?
配置文件存的是基础分区名,不包含槽位后缀。FFF 的 SuperBuilder 在生成 lpmake 命令时会自动加上 _a。
4. SystemDlkmOkiUrl
非必需项。如果设备有远程下载的 system_dlkm_oki 镜像,填 URL;没有就填 null。
字段对照表
| json 字段 | lpdump 来源 | 说明 |
|---|---|---|
Name |
你自己写 | 设备显示名,随便起 |
Property |
Group table 的 Name |
dynamic partition group 名 |
SuperSize |
Block device table 的 Size |
super 分区总大小(bytes) |
GroupSize |
Group table 的 Maximum size |
选最大的那个 |
Partitions |
Partition table 的 Name |
去 _a/_b/-cow |
SystemDlkmOkiUrl |
OTA 包中提取 | 没有就 null |
添加到 devices_sizes.json
配置文件位于 FFF 程序根目录下的 devices_sizes.json。打开它,在数组末尾加上新条目:
{
"Name": "你的设备名",
"Property": "qti_dynamic_partitions",
"SuperSize": 18907922432,
"GroupSize": 18903728128,
"Partitions": [
"my_bigball", "my_carrier", "my_company",
"..."
],
"SystemDlkmOkiUrl": null
}
保存后重启 FFF,SuperBuilder 的机型下拉框里就会出现你新加的设备。
实战:添加一加 15
从 lpdump 提取的数据
Block device Size: 18907922432
Group (最大): qti_dynamic_partitions_a
Group Maximum size: 18903728128
Partitions (去后缀后): 见下方列表
写入 devices_sizes.json
{
"Name": "一加 15",
"Property": "qti_dynamic_partitions",
"SuperSize": 18907922432,
"GroupSize": 18903728128,
"Partitions": [
"my_bigball", "my_carrier", "my_company",
"my_engineering", "my_heytap", "my_manifest",
"my_preload", "my_product", "my_region",
"my_stock", "odm", "product", "system",
"system_dlkm", "system_ext", "vendor",
"vendor_dlkm"
],
"SystemDlkmOkiUrl": null
}
⚠️ 两个注意事项
1. Property 要不要带 _a?
一加 15 的 lpdump group 名是 qti_dynamic_partitions_a(带 _a),但 FFF 当前版本只认 qti_dynamic_partitions(不带)。如果填了带 _a 的 group 名,SuperBuilder 生成的 lpmake 命令可能不兼容。建议先填不带 _a 的常规名字测试。
2. default group 的分区
一加 15 的 my_company 和 my_preload 实际上在 default 组,不在 qti_dynamic_partitions_a 组。但 FFF 的 SuperBuilder 只支持一个 group,所以把它们一并归入 qti_dynamic_partitions 组处理。
验证配置生效
- 保存
devices_sizes.json - 重启 FFF,进入 SuperBuilder 页面
- 在机型下拉框中找到你添加的设备名
- 选择后,SuperSize、GroupSize、Partitions 列表应该自动填充
- 选择固件目录,点击 Parse,确认分区信息正确
- 点击 Create,开始合成 super.img
发表回复