Flutter 适配鸿蒙方案(OpenHarmony)——以及遇到的坑的解决方案

本文整理了在运行/安装 hap(Flutter for OpenHarmony)过程中遇到的典型报错、原因分析与处理办法。主打一个:遇到报错先别急,先把锅精准甩给“签名/端口/权限”三巨头。

环境信息(本次排查)

  • 设备:xxxxxx(USB,一根线拴住了我们的希望)
  • HDC:C:\Users\wf\AppData\Local\OpenHarmony\Sdk\20\toolchains\hdc.exe(本次对话的主要翻译官)
  • hdc 版本:Ver: 3.2.0b
  • 设备系统信息(决定你能不能“为所欲为”的硬指标):
    • const.ohos.apiversion = 22
    • const.product.software.version = BLK-AL80 6.0.0.130(SP25C00E130R4P7)

Flutter 适配纯血鸿蒙方案(本项目落地版)

一句话总结:把 Flutter(Dart)塞进 OpenHarmony 的壳里,让它看起来像原生 Ability,跑起来像“我其实是 Flutter”。

一句话路线图

Flutter 代码(lib/)→ Flutter for OpenHarmony 引擎(@ohos/flutter_ohos)→ Hvigor 构建 → 产出 haphdc/bm install 上机 → 调试靠 hdc fport 打洞。

工程结构(关键文件在哪)

  • 应用信息(包名/版本号):ohos/AppScope/app.json5
  • 签名与编译 SDK 配置:ohos/build-profile.json5
  • OpenHarmony 模块声明(权限/入口 Ability):ohos/entry/src/main/module.json5
  • OpenHarmony 入口 Ability(把 Flutter 引擎拉起来):ohos/entry/src/main/ets/entryability/EntryAbility.ets
    • 这里继承了 FlutterAbility,并在 configureFlutterEngine 里注册插件:
      • import { FlutterAbility } from '@ohos/flutter_ohos';
      • GeneratedPluginRegistrant.registerWith(flutterEngine)
  • Hvigor 总入口(把 Flutter 工程接进来):ohos/hvigorfile.ts
    • 通过 flutter-hvigor-plugin 指向 Flutter 工程根目录,让 Hvigor 知道去哪儿搬 Flutter 的产物/资源。

补充说明:

  • GeneratedPluginRegistrant.ets 是生成文件,默认会被忽略(ohos/entry/.gitignore 里能看到)。所以它“消失”并不代表它真的消失,通常代表它在构建时才会出现。

构建/运行(最常用)

  • 如果 flutter doctor -v 里看到 HarmonyOS toolchain 报错:

    • Ohpm is missing, please configure "ohpm" to the environment variable PATH.
    • Hvigorw is missing, please configure "hvigorw" to the environment variable PATH.

    说明当前系统环境变量 PATH 里找不到 HarmonyOS/OpenHarmony 的命令行工具:

    • ohpm:包管理工具
    • hvigorw:构建工具 wrapper(Windows 通常是 hvigorw.bat

    处理方法(Windows):

    1. 确认已安装 DevEco Studio,并安装了对应 SDK/命令行工具组件(包含 ohpm/hvigor)。
    2. 把以下目录加入 PATH(按你的 DevEco Studio 安装目录调整):
      • <DevEco Studio>\tools\ohpm\bin
      • <DevEco Studio>\tools\hvigor\bin
    3. 关闭并重新打开终端(或注销/重启)让环境变量生效,然后验证:
    where ohpm
    where hvigorw
    
    ohpm -v
    hvigorw -v
    flutter doctor -v
    
  • Debug 运行(会触发构建 HAP + 安装 + 启动):

flutter run -d xxxxxx
  • 你会在日志里看到类似产物路径(示例):
    • build\ohos\hap\entry-default-signed.hap

如果你想“手动上机”(方便验证是不是 Flutter 工具链的问题):

  1. 把 hap 传到设备:
& "C:\Users\wf\AppData\Local\OpenHarmony\Sdk\20\toolchains\hdc.exe" -t xxxxxx file send ".\build\ohos\hap\entry-default-signed.hap" "data/local/tmp/entry-default-signed.hap"
  1. 安装:
& "C:\Users\wf\AppData\Local\OpenHarmony\Sdk\20\toolchains\hdc.exe" -t xxxxxx shell bm install -p "data/local/tmp/entry-default-signed.hap"

适配要点(少走弯路版)

  • 权限:OpenHarmony 这边的权限在 module.json5 里配(比如本项目已配置 ohos.permission.INTERNET),别在 Flutter 里默念“我有网”就当真有网。
  • 插件:不是所有 Flutter 插件都有 OpenHarmony 侧实现;遇到“某某插件找不到实现/跑不起来”,先怀疑插件是否支持纯血鸿蒙,再怀疑人生。
  • 签名:量产机上很容易卡在签名校验(见下面“问题 1”),因为设备不吃你电脑上的 debug 证书,这一点请提前和设备/系统版本对齐预期。

问题 1:安装失败 fail to verify pkcs7 file

现象

安装阶段报错(bm install),设备表示:你的包我不熟,不敢收:

error: failed to install bundle.
code:9568257
error: fail to verify pkcs7 file.

常见原因

  • 设备对应用签名(证书链 / p7b / pkcs7)做了强校验:签名不对,门都不给进。
  • 当前 HAP 使用的签名(通常是本机 debug 证书)不被该设备的校验策略接受:你以为是“我电脑上能跑”,设备说“你电脑是谁”。
  • 有些设备/系统版本需要打开特定参数开关才能安装此类签名的包:开关不在你手上,就别硬拧。

“官方方案”与本次结论

常见官方建议是开启“别验那么严”的开关:

& "C:\Users\wf\AppData\Local\OpenHarmony\Sdk\20\toolchains\hdc.exe" -t xxxxxx shell param set persist.bms.ohCert.verify true

但在本次设备上执行返回(翻译:你没有资格修改这个世界线):

Set parameter persist.bms.ohCert.verify true fail! errNum is:1001!

同时尝试进入 root 模式也失败(翻译:别想了,这不是开发版):

hdc -t xxxxxx smode
[Fail]Cannot set root run mode in undebuggable version.

结论:

  • 该设备属于 undebuggable(量产/非调试)系统shell 权限无法修改 persist.* 系统参数;
  • 因此“param set 开关”在这台设备上无法生效:这不是技术问题,这是权限剧情。

可行解决方向

  1. 使用可调试系统/环境
    • 换 OpenHarmony 模拟器、开发板、或 userdebug/eng 系统版本的设备;
    • 在可修改参数的环境里再执行上述 param set ...,让开关真的能被拨动。
  2. 使用设备认可的签名体系重新签名
    • 按设备侧要求使用对应的发布证书/签名链(而不是本机 debug 证书)重新签名后再安装:走正规渠道,省很多气。

项目签名配置位置:

  • ohos/build-profile.json5app.signingConfigs 段落

问题 2:调试连接失败 Forward parament failed / TCP Port listen failed

现象 A:Forward parament failed

Flutter 启动到“等待调试连接”阶段失败:应用跑起来了,调试却没来,像约好见面却被放鸽子。

Error waiting for a debug connection: ProcessException: hdc returned error:
[Fail]Forward parament failed

Command: ... hdc.exe -t xxxxxx fport tcp:62024 tcp:34297

现象 B:TCP Port listen failed at 50000

指定端口后依然失败:这回设备说“端口我也听不到”,像你在空房间里喊“喂——”。

[Fail]TCP Port listen failed at 50000
Command: ... hdc.exe -t xxxxxx fport tcp:50000 tcp:33009

原因解释(核心机制)

Flutter debug 需要在本机与设备之间建立端口转发(fport)。你可以把它理解为:给调试开一条“专用小路”。

  • tcp:本机端口 -> tcp:设备端口(127.0.0.1:<port> LISTEN)

失败通常来自两类问题:

  1. 本机端口无法监听:该端口被系统保留/策略禁止/权限限制(Windows 常见表现是“以一种访问权限不允许的方式访问套接字”)。
  2. 本机端口已被占用:可能被其他进程占用,或之前残留的 hdc fport 规则占着(你以为你在用端口,其实端口在用你)。

处理方法

1)不要用系统不允许监听的端口

本次排查中,62024 在本机上无法绑定监听(会触发权限拒绝),从而导致 fport 失败。解决方式很朴素:别跟它死磕,换一个。

做法:让 Flutter 固定使用一组“可监听”的端口(换一组端口即可):

flutter run -d xxxxxx --host-vmservice-port=51000 --dds-port=51001

如果仍失败,继续换端口段(如 52000/5200153000/53001)。端口是消耗品,心态要环保。

2)检查是否存在残留的 fport 规则/占用

查看当前转发:

& "C:\Users\wf\AppData\Local\OpenHarmony\Sdk\20\toolchains\hdc.exe" fport ls

如果看到类似:

<deviceId>    tcp:50000 tcp:34297    [Forward]

说明端口可能已经被占用(后续再次绑定同端口就会出现 TCP Port listen failed)。别再重复绑定同一端口了,像重复拨同一个不接你电话的人。

此时优先选用新的端口段(推荐做法),或者重启 hdc server 清理状态:

& "C:\Users\wf\AppData\Local\OpenHarmony\Sdk\20\toolchains\hdc.exe" kill -r
3)确认设备侧端口确实在监听(可选)
& "C:\Users\wf\AppData\Local\OpenHarmony\Sdk\20\toolchains\hdc.exe" -t xxxxxx shell netstat -an | Select-String -Pattern ":<设备端口>\\b"

示例(看到 LISTEN 说明设备侧服务在):

tcp 0 0 127.0.0.1:34297 0.0.0.0:* LISTEN

快速排查清单

  1. 安装失败且提示 fail to verify pkcs7 file
    • 若设备是 undebuggable:不要纠结 param set persist.*,大概率无权限改(不是你不会,是它不让);
    • 换可调试设备/模拟器,或换满足设备要求的签名/证书链。
  2. 启动调试卡在 Error waiting for a debug connection
    • 先换端口段(--host-vmservice-port / --dds-port);
    • 再检查是否存在残留 fport 或 hdc server 状态异常(必要时 hdc kill -r)。
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐