4. 高通平台固件与分区布局

在高通Snapdragon双系统设备上,固件并不是“一整块”烧录进eMMC/UFS的,而是由引导链逐级加载、由分区表精确定位的一组镜像。理解分区布局,等于掌握了双系统能否启动、能否回滚、能否安全升级的底层规则。本节围绕GPT、A/B、动态分区三条主线,说明双系统镜像到底应该放在哪里、为什么这样放,以及实际配置时如何验证。

一、GPT:所有分区的“地址簿”

高通平台设备普遍使用UEFI引导,磁盘分区采用GPT(GUID Partition Table)。GPT头部位于LBA1,包含分区表项数组(通常128项,每项128字节),每项记录分区类型GUID、唯一分区GUID、起始LBA、结束LBA、属性与分区名。GPT同时保留主备两份(磁盘首尾各一份),并带CRC32校验,因此分区表损坏时可用备份恢复。

对双系统而言,GPT最重要的价值是“分区名可读且可寻址”。高通XBL(eXtensible Boot Loader)在加载ABL(Application Bootloader)时,会按分区名查找abl_a/abl_b;ABL再按boot_a/boot_b、system_a/system_b等名称加载内核与系统。因此双系统镜像的存放策略,本质上是“在GPT中预留哪些分区名、每个分区多大、由谁读写”。

实际查看分区表可用:

# 在设备shell或host端(需root/权限)
sgdisk -p /dev/block/sda
# 或
parted /dev/block/sda print
# 查看分区名与GUID
ls -l /dev/block/by-name/

典型高通设备GPT分区(示例,容量因机型而异):

分区名作用典型大小
gpt分区表主/备约1MB
xbl_a/xbl_b一级引导约1MB
abl_a/abl_bUEFI应用引导约1MB
boot_a/boot_b内核+dtb+ramdisk64–128MB
dtbo_a/dtbo_b设备树叠加8–16MB
vbmeta_a/vbmeta_bAVB校验元数据64KB–1MB
super动态分区容器数GB
userdata用户数据剩余空间
misc启动控制/恢复命令1MB

二、A/B分区:无缝升级与回滚的基础

A/B(Seamless Update)把关键分区成对存在:_a槽与_b槽。设备当前运行在某个槽(slot),升级时把新镜像写入另一个槽,写完后通过misc分区或BCB(Bootloader Control Block)设置“下次从新槽启动”。若新槽启动失败,bootloader可回退到旧槽,实现回滚。

槽状态由boot_control HAL管理,常见状态包括:active、bootable、successful、unbootable。升级流程中,新槽先标记为bootable,启动成功后标记successful;若连续失败,则标记unbootable并切回旧槽。

双系统与A/B的关系需要特别澄清:A/B是同一系统的两个副本,不是两个不同操作系统。双系统通常占用_a槽运行系统1、_b槽运行系统2,或使用独立分区名(如system_alt)。若直接复用A/B槽,需注意升级时不能覆盖另一系统所在槽,否则会破坏双系统。因此更稳妥的做法是:双系统各自使用独立分区或独立slot,并在misc中明确记录当前启动目标。

三、动态分区:super分区与逻辑分区

Android 10起引入动态分区(Dynamic Partitions),把system、vendor、product、system_ext等打包进一个super物理分区,内部再划分为逻辑分区。逻辑分区大小可在OTA时调整,不再受GPT固定大小限制。super分区使用liblp元数据描述逻辑分区布局,元数据位于super起始处,含两个槽(slot 0/1)的元数据副本。

查看逻辑分区:

# 查看super元数据
lpdump /dev/block/by-name/super
# 查看逻辑分区映射
ls -l /dev/block/mapper/
# 典型输出:system、vendor、product、system_ext

动态分区对双系统的意义在于:如果两个系统都基于Android动态分区,则super只能承载一套逻辑分区布局。双系统要么各自使用独立super(需GPT预留两个super分区),要么把第二系统放在独立物理分区(如system_alt),由ABL根据启动参数选择挂载目标。实际项目中,受super分区容量限制,双系统更常见的是“主系统动态分区+副系统独立分区”的混合布局。

四、双系统镜像存放策略与启动选择

综合以上三条主线,双系统镜像存放可归纳为三种策略:

  • 独立分区策略:GPT中为系统2预留boot_alt、system_alt、vendor_alt等分区,与系统1完全隔离。优点是互不影响、升级安全;缺点是占用固定空间,GPT分区数量有限。
  • A/B槽复用策略:系统1用_a槽,系统2用_b槽。优点是节省分区;缺点是OTA会覆盖另一系统,需禁用自动A/B升级或改造升级逻辑。
  • 动态分区+独立super策略:GPT预留super与super_alt,两套逻辑分区各自独立。优点是灵活扩容;缺点是占用空间大,需ABL支持双super选择。

启动选择通常由ABL读取misc分区中的BCB命令或自定义标志位决定。例如在misc中写入boot-slot:alt,ABL解析后加载boot_alt。也可通过fastboot命令临时切换:

fastboot getvar current-slot
fastboot --set-active=a
fastboot --set-active=b
# 自定义双系统可扩展为:
fastboot oem set-boot-target alt

验证分区布局是否正确的关键检查点:一是ls -l /dev/block/by-name/确认所有预期分区名存在;二是lpdump确认super内逻辑分区与槽元数据一致;三是fastboot getvar current-slot与misc内容一致;四是分别启动两个系统,确认各自挂载的分区不串扰。若出现启动后进入recovery或反复重启,优先检查misc中的BCB命令与vbmeta校验是否匹配当前槽。

高通双系统 GPT / A-B / 动态分区布局示意 GPT 物理分区(eMMC/UFS) gpt xbl_a xbl_b abl_a abl_b boot_a boot_b dtbo_a dtbo_b vbmeta_a vbmeta_b super userdata misc super 内部逻辑分区(liblp 元数据) system slot 0/1 vendor slot 0/1 product slot 0/1 system_ext slot 0/1 启动链与槽选择 PBL ROM 固化 XBL 加载 ABL ABL 读 misc / BCB 选择 slot a / b / alt 加载 boot_* Kernel + dtb + ramdisk 双系统镜像存放策略对比 策略一:独立分区 boot_alt / system_alt / vendor_alt 优点:隔离彻底,升级安全 缺点:占用固定空间,分区数受限 策略二:A/B 槽复用 系统1→_a,系统2→_b 优点:节省分区,复用A/B机制 缺点:OTA 会覆盖另一系统 策略三:双 super super + super_alt 各自逻辑分区 优点:灵活扩容,动态调整 缺点:空间占用大,需ABL支持
在双系统项目中,建议优先采用“独立分区策略”或“双super策略”,避免直接复用A/B槽导致OTA覆盖另一系统。若必须复用,应在升级逻辑中屏蔽对非当前系统槽的写入,并在misc中显式记录启动目标。
修改GPT分区表属于高风险操作,错误的分区名或越界写入可能导致设备无法进入fastboot。操作前务必备份原分区表(sgdisk --backup),并确认ABL支持自定义分区名查找。