Windows 平台 Flutter-OpenHarmony(鸿蒙)开发环境搭建指南:从 SDK 获取到鸿蒙 PC 真机热重载(含 ZIP 源码三大典型问题与真机运行四项故障修复)
Windows 平台 Flutter-OpenHarmony(鸿蒙)开发环境搭建指南:从 SDK 获取到鸿蒙 PC 真机热重载(含 ZIP 源码三大典型问题与真机运行四项故障修复)
基于 flutter_flutter 仓库 oh-3.44.9-dev 分支(Flutter 3.44.9-ohos)在 Windows 10 22H2 上全程实测通过;真机环节在一台鸿蒙 PC(OpenHarmony 6.1.1,API 24,arm64,2in1 形态)上验证。文中所有命令输出、报错信息、坑位均为真实环境抓取,可放心对照复现。


前言
Flutter 官方并不支持鸿蒙(OpenHarmony/HarmonyOS),目前主流方案是 OpenHarmony 社区维护的 Flutter-OH 分支(现迁移至 GitCode 的 CPF-Flutter 组织)。用它,你可以用熟悉的 Dart/Flutter 技术栈直接开发鸿蒙应用、构建 HAP、适配三方插件。
但这个环境的搭建体验对新手并不友好:官方教程以 Mac/Linux 为主,Windows 用户照抄 export 命令直接报错;用 ZIP 方式下载源码的话,还埋着三个必踩的坑(CMD 闪退、引擎产物 404 无限重试、版本号 0.0.0-unknown 导致依赖解析失败);就算环境全绿,跑上真机还有设备连接与签名配置的四项典型故障等着你(对应 Q7、Q8)。本文把完整流程 + 全部坑位的现象、根因、修复方法一次讲清,小白照着做即可一次跑通。
一、环境准备:软件清单与目录规划
1.1 软硬件要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11(本文实测 Windows 10 22H2 家庭中文版) |
| 磁盘空间 | 20GB 以上(SDK 源码 + 引擎产物缓存 + DevEco Studio) |
| 网络 | 能访问国内镜像源(本文全程使用国内源,无需梯子) |
1.2 软件安装清单
| 软件 | 实测版本 | 作用 | 获取方式 |
|---|---|---|---|
| DevEco Studio | 26 | 鸿蒙官方 IDE,自带 HarmonyOS SDK、ohpm、hvigor、hdc 工具链 | 华为开发者官网 |
| Git | 2.50.0 | Flutter 工具强依赖 | git-scm.com |
| Node.js | 22.20.0(LTS) | hvigor 构建系统是 Node 程序 | nodejs.org |
| Flutter-OH SDK | oh-3.44.9-dev | Flutter 鸿蒙适配版本体 | GitCode 下载(见第三章) |
DevEco Studio 集成完整工具链,安装完成后 ohpm / hvigor / hdc / HarmonyOS SDK 随之就位,无需单独安装。
1.3 关键前提:所有路径必须为纯英文
这是本文最想让你记住的一条,血的教训:
- Flutter SDK 的存放路径、工程项目的存放路径,绝对不能包含中文(包括"鸿蒙""项目"这类字样)。
- hvigor(鸿蒙构建系统)对路径有字符白名单校验,只允许字母、数字、-、_、.、空格、()、@。
- 中文路径在 flutter doctor 阶段完全正常(所以你发现不了问题),直到 flutter build hap 时才会报错,非常隐蔽。
本文统一使用以下示例路径(请按需替换,但务必保持纯英文):
- Flutter SDK:D:\flutter_ohos
- 工程目录:D:\ohos_projects

二、安装 DevEco Studio(含完整工具链)
- 从华为开发者官网下载安装包,一路默认安装。本文实测安装在 D:\DevEco Studio 26\DevEco Studio(注意:安装完可能是两层同名目录,下文以 D:\DevEco Studio 26\DevEco Studio 为准,请你记准自己的实际路径)。
- 首次启动按引导完成配置(主题、协议等一路下一步即可)。SDK 会随 IDE 自动就位。
- 验证安装结果——打开目录 D:\DevEco Studio 26\DevEco Studio,应能看到这些关键子目录:
D:\DevEco Studio 26\DevEco Studio
├── tools\
│ ├── ohpm\bin\ ← 鸿蒙包管理器(类似 npm)
│ └── hvigor\bin\ ← 鸿蒙构建系统(类似 gradle)
└── sdk\
└── default\ ← HarmonyOS SDK(实测为 HarmonyOS 26.0.0,API 26)
├── hms\
└── openharmony\toolchains\ ← hdc 设备调试工具在这里
另外检查一下 C:\Users\你的用户名\AppData\Local\OpenHarmony\Sdk 是否存在(DevEco 安装 OpenHarmony SDK 的默认位置,内含 10、15 这类版本号子目录)。后面 flutter config --ohos-sdk 要指向它。如果不存在,在 DevEco Studio 的设置里找到 SDK 管理页面安装 OpenHarmony SDK 即可。
三、获取 Flutter-OH SDK
仓库已迁移至 CPF-Flutter/flutter_flutter。本文使用 oh-3.44.9-dev 分支(对应 Flutter 3.44.9,Dart 3.12.2,DevTools 2.57.0)。
3.1 方式一:Git 克隆(推荐)
强烈推荐这种方式。用 Git 克隆的仓库自带 .git 完整历史和官方 tag,可以直接绕过后面 ZIP 方式的三大坑:
git clone -b oh-3.44.9-dev https://gitcode.com/CPF-Flutter/flutter_flutter.git D:\flutter_ohos
克隆完直接跳到第四章继续。
3.2 方式二:ZIP 压缩包下载(须额外完成"修复三件套"初始化)
如果你像很多小白一样,在网页上直接下载了 ZIP 压缩包并解压(比如解压到 D:\flutter_ohos),必须额外完成下面的初始化,否则后面会连续踩三个坑(详细原理解析见第七章 Q1、Q2、Q3)。
打开 PowerShell,依次执行:
# 1. 进入 SDK 目录
cd D:\flutter_ohos
# 2. 初始化 git 仓库(ZIP 包没有 .git,Flutter 工具会因此直接闪退!)
# 注意:git 版本需 >= 2.28;老版本用 "git init" + "git checkout -b oh-3.44.9-dev" 两条命令代替
git init -b oh-3.44.9-dev
# 3. 全量入库(17300+ 个文件,需要几十秒到几分钟,耐心等待)
git add -A
# 4. 关键一步:强制跟踪引擎版本文件
# 该文件被仓库自带的 .gitignore 忽略,但它是引擎产物的"版本号钥匙",
# 不跟踪它,下载引擎时会 404 无限重试!
git add -f bin/internal/engine.version
# 5. 提交(如果报错 "Please tell me who you are",先执行下面两条配置命令再重新提交)
# git config --global user.name "你的名字"
# git config --global user.email "你的邮箱"
git commit -m "init: flutter-ohos 3.44.9-dev snapshot"
# 6. 打版本 tag(否则版本号是 0.0.0-unknown,创建工程时依赖解析会失败)
git tag "3.44.9+ohos"
# 7. 清掉可能已生成的错误版本缓存(如果之前运行过 flutter 命令才会有,删一下无副作用)
Remove-Item bin\cache\flutter.version.json -Force -ErrorAction SilentlyContinue
执行完成后,用 git log --oneline 应能看到一条提交记录,用 git tag 应能看到 3.44.9+ohos。
关于 tag 格式为什么用 3.44.9+ohos 而不是 3.44.9-ohos:在 semver 语义里,+ohos 是构建元数据(与正式版 3.44.9 等价),而 -ohos 是预发布版(版本低于 3.44.9),可能导致 >=3.44.9 这类依赖约束判定失败。Flutter-OH 源码 version.dart 的 parseOhosVersion 函数注释中也明确说明 +ohos 是首选格式。
四、配置环境变量与 .npmrc
4.1 打开环境变量配置面板
Win + R 输入 sysdm.cpl 回车 → 「高级」选项卡 → 「环境变量(N)…」。
面板分上下两栏:上半栏是你自己的"用户变量"(本文所有配置都在这一栏,不需要管理员权限),下半栏是"系统变量"。
4.2 新建用户变量(3 个)
在上半栏点「新建(N)…」,逐个添加:
| 变量名 | 变量值 | 作用 |
|---|---|---|
| PUB_HOSTED_URL | https://pub.flutter-io.cn | pub 包国内镜像(flutter pub get 走这里) |
| FLUTTER_STORAGE_BASE_URL | https://storage.flutter-io.cn | Flutter 上游产物国内镜像 |
| DEVECO_SDK_HOME | D:\DevEco Studio 26\DevEco Studio\sdk | 告诉 hvigor 命令行构建去哪找 SDK(不配的话 flutter build hap 会报 Invalid value of ‘DEVECO_SDK_HOME’,见第七章 Q5) |
4.3 编辑用户 Path(追加 4 条)
在上半栏选中 Path → 「编辑(E)…」→ 「新建(N)」,逐条添加(按你自己的实际安装路径替换):
| # | Path 条目 | 来源 |
|---|---|---|
| 1 | D:\flutter_ohos\bin | Flutter SDK 本体(flutter 命令) |
| 2 | D:\DevEco Studio 26\DevEco Studio\tools\ohpm\bin | ohpm 包管理器 |
| 3 | D:\DevEco Studio 26\DevEco Studio\tools\hvigor\bin | hvigor 构建系统(hvigorw 命令) |
| 4 | D:\DevEco Studio 26\DevEco Studio\sdk\default\openharmony\toolchains | hdc 设备调试工具 |
一路「确定」保存。注意:已经开着的终端窗口读不到新变量,必须新开一个。
4.4 配置 .npmrc(HAP 构建的前置条件)
hvigor 是 Node 程序,构建 HAP 时要联网下载 @ohos 作用域的构建插件包。请用记事本创建/编辑这个文件:
C:\Users\你的用户名\.npmrc
写入两行:
registry=https://repo.huaweicloud.com/repository/npm/
@ohos:registry=https://repo.harmonyos.com/npm/
为什么需要第二行(这是很多人翻车的地方):构建必需的 @ohos/hvigor-ohos-plugin 包只发布在华为的 harmonyos 官方源上,npm 公共镜像(npmmirror、华为云 npm 镜像等)上全部 404——我逐一实测过。所以第一行管普通包(用华为云或 npmmirror 镜像都行),第二行专门把 @ohos 开头的包指向官方源,缺一不可。
顺带澄清一个误区:Flutter 引擎的鸿蒙适配包 @ohos/flutter_ohos 不走这些源。它是构建时由 flutter 工具自动注入的本地 HAR 文件(从华为云 OBS 引擎产物下载),不需要你手动安装。
五、初始化验证:三项关键命令
新开一个 PowerShell 窗口(重要!环境变量只对新开的窗口生效),依次执行以下三条命令。
5.1 验证 Flutter 版本
flutter --version
首次运行会自动下载 Dart SDK 并编译工具(几分钟,属正常现象),完成后预期输出:
Flutter 3.44.9+ohos • channel [user-branch] • unknown source
Framework • revision xxxxxxxxxx • ...
Engine • hash b9499e4c25212536ba3a4eec4f5c1905fb3214fe (revision 5a2a6a42cc) • ...
Tools • Dart 3.12.2 • DevTools 2.57.0
检查两点:① 第一行必须是 Flutter 3.44.9+ohos(不能是 0.0.0-unknown,否则见第七章 Q3);② channel [user-branch]、unknown source 字样属于本地仓库的正常显示,不影响使用。
5.2 配置 OpenHarmony SDK 路径
flutter config --ohos-sdk "C:\Users\你的用户名\AppData\Local\OpenHarmony\Sdk"
预期输出:Setting “ohos-sdk” value to “…”。
这个配置持久保存在 C:\Users\你的用户名\AppData\Roaming.flutter_settings(Windows 上 flutter 工具把用户目录定位到 %APPDATA%,这是它的正常行为)。它的优先级高于 OHOS_HOME、OHOS_SDK_HOME、DEVECO_SDK_HOME 等环境变量。实测跳过这条命令、只靠 4.2 节的 DEVECO_SDK_HOME 环境变量也能让 HarmonyOS toolchain 变绿(flutter 会顺着 PATH 里的 hdc 反查出 DevEco 的 SDK),两种方式二选一即可。
5.3 综合诊断:flutter doctor
flutter doctor
核心关注 HarmonyOS toolchain 一行是否为 [√],它会列出 SDK、ohpm、node、hvigorw 四项检测结果:
[√] HarmonyOS toolchain - develop for HarmonyOS devices
• OpenHarmony Sdk at C:\Users\xxx\AppData\Local\OpenHarmony\Sdk, available api versions has [15:15, 10:10]
• Ohpm version 26.0.0.630
• Node version v22.20.0
• Hvigorw binary at D:\DevEco Studio 26\DevEco Studio\tools\hvigor\bin\hvigorw
其他行的解读,先给你吃颗定心丸:
| doctor 条目 | 状态 | 需要管吗 |
|---|---|---|
| Flutter | [!](unknown channel/source) | ❌ 不用管,本地仓库的正常显示 |
| HarmonyOS toolchain | [√] | ✅ 核心指标,必须绿 |
| Windows Version | [√] | 正常 |
| Android toolchain | [X] | ❌ 不用管,本文只做鸿蒙 |
| Visual Studio | [X] | ❌ 不用管,那是开发 Windows 桌面应用的 |
| Connected device | [√]/[X] | 看需求,见 6.3 节 |
| Network resources | [√]/[!] | [!] 通常是访问 github 超时,不影响国内源构建 |
只要 HarmonyOS toolchain 是 [√],你的环境就搭建成功了。
六、工程实战:创建 OHOS 插件工程并构建 HAP
空口无凭,我们用真实工程完整跑一遍构建链路——这也是三方库适配的标准起点。
6.1 创建插件工程
cd D:\ohos_projects
flutter create --org com.example --template=plugin --platforms=ohos my_first_plugin
预期输出:
Creating project my_first_plugin...
Resolving dependencies in `my_first_plugin`...
Got dependencies in `my_first_plugin`.
...
Wrote 66 files.
All done!
Your plugin code is in my_first_plugin\lib\my_first_plugin.dart.
Host platform code is in the ohos directories under my_first_plugin.
生成的工程里,ohos\ 目录就是鸿蒙原生侧(ArkTS,结构和 Android/iOS 插件同构),lib\ 是 Dart 侧,example\ 是示例 App。
6.2 构建 Debug 版 HAP
cd D:\ohos_projects\my_first_plugin\example
flutter build hap --debug
首次构建会依次完成:下载 OHOS 引擎产物(约 130MB,从华为云 OBS,速度很快)→ ohpm 拉取鸿蒙依赖包 → hvigor 编译 ArkTS → 打包 HAP。构建成功后终端会给出 .hap 文件路径。
过程中如果 hvigor 报错,对照第七章排查(90% 是路径或环境变量问题)。
6.3 真机部署与运行(鸿蒙 PC 全流程实测)


构建不需要设备,看效果需要。本节在一台**鸿蒙 PC(OpenHarmony 6.1.1,API 24,arm64,2in1 形态,USB 连接)**上从零跑到热重载——这条路线上集中了四项典型故障(Q7 一项 + Q8 三个连环报错),全部实测踩过、全部可修。
6.3.0 前置条件:使用 flutter create 创建独立工程(勿直接运行 SDK 仓库内示例)
examples\hello_world 看起来是现成的验证工程,但它不能直接跑(原因见 Q6):SDK 仓库是 pub workspace 模式,在里面执行 pub get 会连带解析全部 75 个成员包,其中 dev/integration_tests 依赖 github.com/flutter/goldens.git,国内网络必挂。正确姿势(工程必须建在 SDK 目录外、路径纯英文):
cd D:\ohos_projects
flutter create --platforms=ohos my_app
cd my_app
跑 6.1 节插件工程的 example(cd my_first_plugin\example 后 flutter run)同理,下文 Q7、Q8 的修法完全一致。
6.3.1 连接真机
- 设备上:设置 → 关于 → 连点「版本号」开启开发者模式;
- 开发者选项里打开「USB 调试」;
- 数据线连接后盯紧设备屏幕——首次连接会弹「是否允许 USB 调试?」授权框,点允许(错过了就重新插拔一次);
- USB 连接模式选「传输文件」(「仅充电」模式下设备不可见);
- 新开 PowerShell 验证(⚠️ 改过 Path 后旧窗口读不到新变量,报「hdc 无法识别」多半是这个原因):
hdc list targets
输出一串序列号即成功([Empty] 见 Q7)。接着 flutter devices 应能看到:
3QC0124C20001658 (mobile) • 3QC0124C20001658 • ohos-arm64 • Ohos OpenHarmony-6.1.1.130 (API 24)
6.3.2 flutter run 与 DevEco 自动签名
flutter pub get
flutter run
只连一台设备时不用 -d 参数。hvigor 编译(实测约 35 秒)完成后,大概率停在签名报错(Q8 报错①):
Error: 请通过DevEco Studio打开ohos工程后配置调试签名(File -> Project Structure -> Signing Configs 勾选Automatically generate signature)
配置签名(中文版 DevEco Studio 26 实测菜单路径):
- DevEco Studio →「文件」→「打开」,选择 D:\ohos_projects\my_app\ohos(⚠️ 是 ohos 子目录,不是 my_app 根目录,选错会找不到签名入口);
- 等右下角工程同步完成;
- 「文件」→「项目结构」→ 左侧「签名配置」→ 勾选 ✅「自动生成签名」;
- 弹出华为账号登录框,登录后证书、Profile 自动填充为绿色 ✓,点「确定」。
签名信息写入 my_app\ohos\build-profile.json5(证书落在 C:\Users\你的用户名.ohos\config\)。该文件含调试证书路径与密钥,不要提交到公共仓库;配置一次后,后续命令行 flutter run 不再需要打开 DevEco。
6.3.3 签名配置后的两项典型报错

签名配好后(无论回命令行重跑 flutter run,还是在 DevEco Studio 里直接点运行),还会撞上两个报错:
① 「目标不能为空」(Q8 报错②):DevEco 保存签名时顺手往 build-profile.json5 的 products 里写入空字符串字段 “targetSdkVersion”: “”,hvigor 把空值当成「空目标」。修法:用记事本删掉这一行(连同上一行末尾的逗号)。
② 设备类型不匹配(Q8 报错③):鸿蒙 PC 的设备形态是 2in1,而 flutter create 模板只声明了 phone(在 DevEco Studio 里直接点运行时必现;命令行 flutter run 不传该校验参数,但同样建议修,两种运行方式一份配置通吃):
Error Message: The type of target device does not match the device type configured by module: entry.
Required device type:2in1, current module device type:phone
修法:编辑 my_app\ohos\entry\src\main\module.json5,把 deviceTypes 补全:
"deviceTypes": [
"phone",
"tablet",
"2in1"
],
经验值:凡是要在鸿蒙 PC / 平板上跑的工程(包括三方库适配的 example),deviceTypes 建议 phone、tablet、2in1 三态全声明,一步到位。
6.3.4 运行效果验证:计数器 Demo 与热重载
两个报错修完再 flutter run:安装 → 启动 → 真机屏幕出现 Flutter 官方计数器模板(右下角 ➕ 按钮,点一下数字 +1,偶数时页面变浅色)。注意这不是 hello_world——是 flutter create 的默认产物,它验证的是「点击 → 状态变化 → UI 刷新」的完整交互链路,能正常计数就说明渲染、事件、状态管理全部正常。
此时终端进入热重载待命状态:
| 按键 | 作用 |
|---|---|
| r | 热重载(改完 lib 下代码保存后按,秒级生效,无需重装) |
| R | 热重启 |
| q | 退出应用 |
随手验证:用记事本改 lib\main.dart 里任意文案 → Ctrl+S → 按 r → 真机立即更新。这套开发体验与 Android/iOS 上完全一致。
七、故障排查 FAQ:Q1 ~ Q8 核心问题的现象、根因与修复
以下八条核心 FAQ(Q1 ~ Q8)按环境搭建的阶段顺序排列,你可以根据自己卡住的环节直接对号入座。Q1 ~ Q3 只在使用 ZIP 方式下载源码时出现(第三章 3.2 节的修复三件套已提前预防);Q6 ~ Q8 集中在真机运行阶段(第 6.3 节已按流程顺序内联讲过,此处供卡壳时快速检索)。
Q1(首次运行):为什么在 CMD 中运行 flutter 会直接闪退?
现象:flutter --version 一回车,整个 CMD 窗口消失,连报错都看不到。
根因:bin\flutter.bat 启动时会检查 SDK 根目录是否存在 .git 文件夹。下面是仓库 bin\flutter.bat 的真实源码(第 45~52 行):
REM Test if the flutter directory is a git clone, otherwise git rev-parse HEAD would fail
IF NOT EXIST "%flutter_root%\.git" (
ECHO Error: The Flutter directory is not a clone of the GitHub project.
ECHO The flutter tool requires Git in order to operate properly;
ECHO to set up Flutter, run the following command:
ECHO git clone -b stable https://github.com/flutter/flutter.git
EXIT 1
)
ZIP 解压的目录没有 .git,脚本走到 EXIT 1——而批处理的 EXIT 不带 /B 参数时会关闭整个 CMD 窗口,错误信息一闪而过。
解决:按第 3.2 节完成 git init + git add -A + git commit 即可。(官方 FAQ 13 说是"配置 git 环境变量",实际根因是 .git 目录缺失,配了 PATH 也救不了 ZIP 包——且 FAQ 给的 export PATH=… 是 Linux 语法,Windows 上照抄也不行。)
Q2(首次运行):为什么卡在 engine_stamp.json 404 无限重试?
现象:首次运行 flutter,Dart SDK 下载正常,但到引擎产物阶段报 Failed to download …/engine_stamp.json 404,无限重试。
根因(这个最隐蔽,展开讲)。flutter 需要一个引擎版本号去云端下载对应的产物,而版本号的来源链是这样断裂的:
第 1 步:.gitignore 故意忽略引擎版本文件。仓库自带 .gitignore 的真实源码(第 34~42 行):
# This file, on the master branch, should never exist or be checked-in.
#
# On a *final* release branch, that is, what will ship to stable or beta, the
# file can be force added (git add --force) and checked-in in order to effectively
# "pin" the engine artifact version so the flutter tool does not need to use git
# to determine the engine artifacts.
#
# See https://github.com/flutter/flutter/blob/main/docs/tool/Engine-artifacts.md.
/bin/internal/engine.version
第 2 步:版本号解析脚本只认"被 git 跟踪"的版本文件。bin\internal\update_engine_version.ps1 的真实源码(第 49~63 行):
# Check if bin/internal/engine.version exists and is a tracked file in git.
#
# This is intended for a user-shipped stable or beta release, where the release
# has a specific (pinned) engine artifacts version.
#
# If set, it takes precedence over the git hash.
} elseif (git -C "$flutterRoot" ls-files bin/internal/engine.version) {
$engineVersion = Get-Content -Path "$flutterRoot/bin/internal/engine.version"
# Fallback to using git to triangulate which upstream/master (or origin/master)
# the current branch is forked from, which would be the last version of the
# engine artifacts built from CI.
} else {
$engineVersion = Invoke-Expression "& '$flutterRoot/bin/internal/content_aware_hash.ps1'"
}
第 3 步:官方假设你用 git clone(克隆时 engine.version 已被跟踪,不受 ignore 影响),但 ZIP + git init + git add -A 的组合会让它被上面第 1 步的 ignore 规则跳过。
第 4 步:于是脚本走了 else 分支——对本地源码算一个内容哈希(如 90efa1ca…)充当版本号。
第 5 步:云端根本没有这个哈希对应的产物 → 404 → 无限重试。
解决(就是 3.2 节修复三件套的第二步):
git add -f bin/internal/engine.version
git commit -m "track engine.version to pin upstream engine artifacts"
快速确诊法:对比 bin\cache\engine.stamp 和 bin\internal\engine.version 两个文件的内容,如果不一致,就是中了这个坑。
注意:这个 404 和你配没配国内镜像无关——我用错误哈希实测了 storage.flutter-io.cn、华为云 OBS、Google 官方源三个源,全部 404;换回真实版本号后三个源全部 200。别在镜像配置上浪费时间。
Q3(创建工程):为什么版本号是 0.0.0-unknown、依赖解析失败?
现象:flutter --version 显示 Flutter 0.0.0-unknown;flutter create 创建插件工程时报:
The current Flutter SDK version is 0.0.0-unknown.
Because my_first_plugin requires Flutter SDK version >=3.3.0, version solving failed.
根因:flutter 工具的版本号从 git tag 解析,version.dart 中的真实逻辑是执行 git describe --match ..* --tags。ZIP 仓库没有任何 tag → 版本号未知 → pub 求解器拿 0.0.0 去和插件模板要求的 >=3.3.0 比较 → 解析失败。
解决(就是 3.2 节修复三件套的第三步):
git tag "3.44.9+ohos"
Remove-Item bin\cache\flutter.version.json -Force -ErrorAction SilentlyContinue
版本号会被缓存到 bin\cache\flutter.version.json,所以打完 tag 必须删缓存让 flutter 重新解析。
Q4(构建阶段):中文路径为什么会导致 hvigor 构建失败?(三种报错形态)
现象:flutter build hap 时 hvigor 报错。中文路径会在三个不同阶段以三种面目出现:
# 形态一:工程路径含中文
hvigor ERROR: 00306003 Specification Limit Violation
Error Message: Invalid project path. Current path does not match:
D:\A鸿蒙项目\my_plugin\example\ohos
# 形态二:(易误诊)先报 SDK 变量无效,见 Q5
# 形态三:SDK 本体路径含中文(最隐蔽,报错文件指向 SDK 内部模块)
hvigor ERROR: 00306002 Specification Limit Violation
Error Message: The Node directory and node name cannot contain Chinese characters at file:
D:\A鸿蒙项目\flutter_flutter-oh-3.44.9-dev\packages\integration_test\ohos
根因:hvigor 对路径做字符白名单校验。形态三尤其坑人:你的工程路径是英文的,但 SDK 放在了中文目录——插件工程默认依赖 integration_test(位于 SDK 内部),hvigor 编译它时同样过不了路径校验。
解决:
- 新装用户:SDK 和工程从一开始就放纯英文路径(本文第 1.3 节);
- 已装在中文路径的补救:建一个目录联接(Junction),让英文路径指向中文目录,以后统一走英文路径:
# 以管理员或普通权限在 PowerShell 执行(D:\flutter_ohos 为新的英文入口)
New-Item -ItemType Junction -Path "D:\flutter_ohos" -Target "D:\A鸿蒙项目\flutter_flutter-oh-3.44.9-dev"
然后把用户 Path 里的 flutter bin 条目改成 D:\flutter_ohos\bin,并新开终端。原理:flutter 启动脚本按入口路径定位 SDK 根目录,走 junction 入口后,hvigor 看到的所有 SDK 内部路径都是英文的,而物理文件一个都不用挪。
Q5(构建阶段):为什么 hvigor 报 Invalid value of ‘DEVECO_SDK_HOME’?
现象:
hvigor ERROR: 00303217 Configuration Error
Error Message: Invalid value of 'DEVECO_SDK_HOME' in the system environment path.
根因:flutter build hap 底层调用 hvigorw 命令行构建,hvigor 需要靠 DEVECO_SDK_HOME 环境变量定位 HarmonyOS SDK。在 DevEco Studio 图形界面里点构建不需要它(IDE 自己知道 SDK 在哪),但命令行构建必须配。flutter doctor 不检查这个变量,所以 doctor 全绿也可能中招。
解决:按第 4.2 节配置用户变量 DEVECO_SDK_HOME = D:\DevEco Studio 26\DevEco Studio\sdk,然后执行 hvigorw --stop-daemon 停掉 hvigor 缓存的旧状态,再重新构建。
Q6(运行准备):为什么直接运行 SDK 仓库内的 examples\hello_world 会失败?
现象:在 SDK 仓库 examples\hello_world 目录下执行 flutter pub get,报:
Git error. Command: `git clone --mirror https://github.com/flutter/goldens.git ...`
fatal: unable to access 'https://github.com/flutter/goldens.git/': schannel: failed to receive handshake, SSL/TLS connection failed
exit code: 128
根因:SDK 仓库是 pub workspace 模式,根 pubspec.yaml 声明了 75 个成员包,在任一成员目录执行 pub get 都会解析整个 workspace。其中 dev/integration_tests 系列包通过 git 依赖 github.com/flutter/goldens.git,国内网络拉不动,整个解析随之失败。
解决:验证/测试用工程一律用 flutter create --platforms=ohos 新建独立工程(建在 SDK 目录外)。官方 CI 也是这么干的——仓库 ci\scripts\compile_hello_world.sh 里专门用 sed 把 hello_world 从 workspace 成员列表里摘除后再编译。
Q7(设备连接):为什么 hdc list targets 输出 [Empty]?
现象:USB 线插着,hdc list targets 却返回 [Empty],flutter devices 里只有 Windows / Chrome / Edge。
根因:鸿蒙设备(含鸿蒙 PC)默认不开 USB 调试;或 USB 模式是「仅充电」;或首次连接的授权弹窗没点允许。设备侧没授权,hdc 服务端自然枚举不到。
解决:设备上「设置 → 关于 → 连点版本号」开启开发者模式 → 开发者选项打开「USB 调试」→ 重新插拔并在设备弹窗上点「允许」→ USB 模式选「传输文件」。另注意:配完 Path 后旧终端窗口不生效(4.3 节),要么新开窗口,要么用 hdc.exe 完整路径调用。
Q8(真机部署):签名相关的三个连环报错如何依次解决?
真机部署阶段,三个报错会按时间线依次出现,全部可修:
报错 ①:调试签名缺失
现象:hvigor 编译完成(约 35 秒)后 flutter run 终止:
Error: 请通过DevEco Studio打开ohos工程后配置调试签名(File -> Project Structure -> Signing Configs 勾选Automatically generate signature)
根因:真机安装 HAP 必须有调试签名,flutter create 生成的工程默认不带签名配置(flutter build hap 只构建不安装,所以 6.2 节能一路走通,到 flutter run 要装机时才被拦下)。
解决(中文版 DevEco Studio 26):打开 my_app\ohos(注意是 ohos 子目录,选成 my_app 根目录会找不到签名入口)→「文件」→「项目结构」→「签名配置」→ 勾选「自动生成签名」→ 登录华为账号 →「确定」。签名写入 build-profile.json5 后,后续命令行 flutter run 不再需要打开 DevEco。
报错 ②:「目标不能为空」
现象:DevEco 保存签名后重跑 flutter run,hvigor 报:
错误: 目标不能为空。请检查项目根目录下的build-profile.json5文件,
并确保配置中模块的目标在applyToProducts中设置为指定产品:default。
根因:DevEco 26 的「自动生成签名」保存时会顺手往 build-profile.json5 的 products 里写入空字符串字段 “targetSdkVersion”: “”,hvigor 把空值解析成「空目标」。而 modules 里 targets / applyToProducts 的配置其实完全正确——报错文案极具误导性,别去改 modules。
解决:删掉 products 里 targetSdkVersion 空字段那一行(连同上一行末尾的逗号)。删掉后 hvigor 只会提示一条「建议显式配置 targetSdkVersion」的 WARN,不阻塞构建。
报错 ③:设备类型不匹配(Required device type:2in1)
现象:hvigor 报:
Error Message: The type of target device does not match the device type configured by module: entry.
Required device type:2in1, current module device type:phone
根因:DevEco Studio 检测到目标设备形态后,会通过 -p requiredDeviceType=2in1 参数传给 hvigor 校验(flutter 命令行不传这个参数——flutter_tools 源码 hvigor.dart 的 assembleHap 只拼 product 和 buildMode 两项,但 deviceTypes 补全对两种运行方式都是通用正解);而 flutter create 模板的 module.json5 里 deviceTypes 只声明了 phone。鸿蒙 PC 属于 2in1 形态,与 phone、tablet 并列为三种设备类型。
解决:工程 ohos\entry\src\main\module.json5 的 deviceTypes 补全为 [“phone”, “tablet”, “2in1”]。三方库适配的 example 工程建议同样三态全声明,一次兼容所有鸿蒙设备形态。
八、下载源机制详解:六条链路的职责划分
各配置项的职责边界如何划分?下表完整梳理 Flutter-OH 的六条下载链路:
| # | 下载内容 | 由谁控制 | 默认/推荐值 |
|---|---|---|---|
| 1 | Dart SDK | 脚本内置 | 华为云 OBS(flutter-ohos.obs.cn-south-1.myhuaweicloud.com),无需配置 |
| 2 | OHOS 引擎产物(flutter.har、gen_snapshot 等) | FLUTTER_OHOS_STORAGE_BASE_URL | 默认华为云 OBS,无需配置 |
| 3 | 上游通用产物(engine_stamp.json 等) | FLUTTER_STORAGE_BASE_URL | https://storage.flutter-io.cn |
| 4 | pub 包(pubspec 依赖) | PUB_HOSTED_URL | https://pub.flutter-io.cn |
| 5 | ohpm 包(@ohos/hypium 等 HAR) | ohpm 自身 | https://ohpm.openharmony.cn/ohpm/,无需配置 |
| 6 | hvigor 的 npm 包(@ohos/hvigor-ohos-plugin 等) | ~/.npmrc | registry + @ohos:registry 两行,缺一不可 |
理解这张表后你会发现:只有 3、4、6 三条需要你动手配置(本文第四章的三个环境变量 + .npmrc),其余链路默认就走华为云,对国内用户天然友好。
九、总结与下一步
回顾整个流程,其实主线只有七步:
- 装 DevEco Studio(自带 SDK 和全套工具链);
- 获取 Flutter-OH SDK(git clone 优先;ZIP 方式必须补 git 三件套:init + add -f engine.version + tag);
- 配环境变量(3 个变量 + Path 4 条 + .npmrc 两行);
- flutter config --ohos-sdk 指定 SDK 路径;
- flutter doctor 确认 HarmonyOS toolchain 全绿;
- flutter create --platforms=ohos 创建独立工程,flutter build hap --debug 验证构建;
- 真机三连:设备开开发者模式 + USB 调试授权(hdc list targets 出序列号)→ DevEco 打开 my_app\ohos 自动签名 → 删空 targetSdkVersion、deviceTypes 补 2in1 → flutter run 真机见计数器,按 r 热重载。
再加上三条铁律:路径全英文、配完环境变量开新终端、测试工程用 flutter create 独立创建(别直接跑 SDK 仓库内示例),就能避开 95% 的坑。
环境搭好之后,你的下一步大概率是三方库/插件的鸿蒙适配。动手前建议先查一眼 Flutter OH 三方库适配列表,很多热门库已有人适配过,别重复造轮子;需要自己适配时,用本文 6.1 节的插件模板起步,example 的真机验证直接走 6.3 节流程(签名与 deviceTypes 两个坑的修法照搬即可)。
参考资料
更多推荐

所有评论(0)