HarmonyOS 7 API 版本判断还在比字符串?26.10 会被误判小于 26.2

从 API 26.0.0 开始,HarmonyOS 开发套件版本统一采用 X.Y.Z 语义化格式。真正容易出问题的不是多了两个点,而是旧代码仍按字符串排序,或者只会解析 5.0.0(12) 这种带括号的旧值。

API 26 语义化版本的数字比较路径

先确认 API 26 的能力边界

官方 2026-08-29 的版本号说明明确了 SemVer 三段含义。X、Y、Z 都必须按数字比较;旧 API Level 与新 SemVer 不是一个数值空间,迁移期应在边界层分流。

  • 字符串比较会把 26.10.0 判成小于 26.2.0。
  • 缺少任意一段的值不能静默补成 0。
  • 数据库按 TEXT 排序同样会得到错误顺序。

案例一:能力开关在 26.10.0 上反而被关闭

逐字符比较看到 minor 的第一个字符 1 小于 2,于是把更高版本送入低版本分支。修复应先解析三段,再逐段进行数值比较。

interface SemVer { major: number; minor: number; patch: number }
function parseSemVer(input: string): SemVer {
  const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(input.trim())
  if (!m) throw new Error('非法版本号: ' + input)
  return { major: Number(m[1]), minor: Number(m[2]), patch: Number(m[3]) }
}
function compare(aText: string, bText: string): number {
  const a = parseSemVer(aText); const b = parseSemVer(bText)
  for (const k of ['major', 'minor', 'patch'] as const) {
    if (a[k] !== b[k]) return a[k] > b[k] ? 1 : -1
  }
  return 0
}
console.assert(compare('26.10.0', '26.2.0') > 0)

数值比较覆盖 minor 超过 9、主版本跨越和完全相等三种边界,不再依赖字符串字典序。

案例二:旧解析器只认括号,26.0.0 被当成未知版本

一些代码只提取旧值末尾括号中的 API Level。遇到新格式时返回 undefined,再被默认成 0,所有 API 26 设备都会走兼容分支。

type Identity = { kind: 'semver'; value: SemVer } | { kind: 'legacy'; apiLevel: number }
function parseIdentity(input: string): Identity {
  if (/^\d+\.\d+\.\d+$/.test(input.trim())) return { kind: 'semver', value: parseSemVer(input) }
  const legacy = /\((\d+)\)$/.exec(input.trim())
  if (legacy) return { kind: 'legacy', apiLevel: Number(legacy[1]) }
  throw new Error('无法识别版本号: ' + input)
}
console.assert(parseIdentity('26.0.0').kind === 'semver')
console.assert(parseIdentity('5.0.0(12)').kind === 'legacy')

新旧值被明确标记,业务层不能再把两套格式塞进同一个整数比较。

现象与判断对照

现象优先检查处理原则
26.10.0 与 26.2.0 顺序错误是否直接比较字符串解析后三段数值比较
26.0.0 被识别成 0旧括号正则分流新旧格式
数据库排序异常版本列是否为 TEXT拆分三列或生成固定宽度键
灰度开关偶发错分解析失败是否静默兜底失败必须记录并阻断

为什么选择这个实现

把解析和比较放在配置入口,比在每个页面 split 更可靠。页面只询问“当前版本是否至少为某版本”,不重复解释格式。

可复用边界

解析器、比较器和数据库排序键可以组成独立版本模块,并用表驱动测试覆盖每次 SDK 升级。

验证记录

已执行 26.10.0>26.2.0、26.1.9<26.2.0、27.0.0>26.99.99、新旧格式识别和非法输入拒绝。

本文的策略代码已在宿主 JavaScript 环境执行断言,用来验证状态、排序、去重或边界计算。它不等同于 HarmonyOS 7 API 26 工程编译,也不等同于真机系统能力验证;涉及系统回调、设备能力、窗口形态或跨应用 IPC 的部分,仍应在对应 SDK 与设备上完成端到端验收。

上线前检查清单

  • 只接受三段数字的新格式
  • 禁止字符串直接比较
  • 旧格式与新格式分流
  • 数据库排序不使用原始 TEXT
  • 解析失败记录原始值
  • API Change Assistant 与兼容测试已执行

官方资料

版本号能显示出来不等于能正确比较。API 26 之后,所有能力开关、缓存键和升级判断都应该先通过同一个 SemVer 边界层。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐