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 Studio26鸿蒙官方 IDE,自带 HarmonyOS SDK、ohpm、hvigor、hdc 工具链华为开发者官网
Git2.50.0Flutter 工具强依赖git-scm.com
Node.js22.20.0(LTS)hvigor 构建系统是 Node 程序nodejs.org
Flutter-OH SDKoh-3.44.9-devFlutter 鸿蒙适配版本体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(含完整工具链)

  1. 华为开发者官网下载安装包,一路默认安装。本文实测安装在 D:\DevEco Studio 26\DevEco Studio(注意:安装完可能是两层同名目录,下文以 D:\DevEco Studio 26\DevEco Studio 为准,请你记准自己的实际路径)。
  2. 首次启动按引导完成配置(主题、协议等一路下一步即可)。SDK 会随 IDE 自动就位。
  3. 验证安装结果——打开目录 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_URLhttps://pub.flutter-io.cnpub 包国内镜像(flutter pub get 走这里)
FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cnFlutter 上游产物国内镜像
DEVECO_SDK_HOMED:\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 条目来源
1D:\flutter_ohos\binFlutter SDK 本体(flutter 命令)
2D:\DevEco Studio 26\DevEco Studio\tools\ohpm\binohpm 包管理器
3D:\DevEco Studio 26\DevEco Studio\tools\hvigor\binhvigor 构建系统(hvigorw 命令)
4D:\DevEco Studio 26\DevEco Studio\sdk\default\openharmony\toolchainshdc 设备调试工具

一路「确定」保存。注意:已经开着的终端窗口读不到新变量,必须新开一个

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 连接真机
  1. 设备上:设置 → 关于 → 连点「版本号」开启开发者模式;
  2. 开发者选项里打开「USB 调试」;
  3. 数据线连接后盯紧设备屏幕——首次连接会弹「是否允许 USB 调试?」授权框,点允许(错过了就重新插拔一次);
  4. USB 连接模式选「传输文件」(「仅充电」模式下设备不可见);
  5. 新开 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 实测菜单路径):

  1. DevEco Studio →「文件」→「打开」,选择 D:\ohos_projects\my_app\ohos(⚠️ 是 ohos 子目录,不是 my_app 根目录,选错会找不到签名入口);
  2. 等右下角工程同步完成;
  3. 「文件」→「项目结构」→ 左侧「签名配置」→ 勾选 ✅「自动生成签名」;
  4. 弹出华为账号登录框,登录后证书、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 的六条下载链路:

#下载内容由谁控制默认/推荐值
1Dart SDK脚本内置华为云 OBS(flutter-ohos.obs.cn-south-1.myhuaweicloud.com),无需配置
2OHOS 引擎产物(flutter.har、gen_snapshot 等)FLUTTER_OHOS_STORAGE_BASE_URL默认华为云 OBS,无需配置
3上游通用产物(engine_stamp.json 等)FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn
4pub 包(pubspec 依赖)PUB_HOSTED_URLhttps://pub.flutter-io.cn
5ohpm 包(@ohos/hypium 等 HAR)ohpm 自身https://ohpm.openharmony.cn/ohpm/,无需配置
6hvigor 的 npm 包(@ohos/hvigor-ohos-plugin 等)~/.npmrcregistry + @ohos:registry 两行,缺一不可

理解这张表后你会发现:只有 3、4、6 三条需要你动手配置(本文第四章的三个环境变量 + .npmrc),其余链路默认就走华为云,对国内用户天然友好。


九、总结与下一步

回顾整个流程,其实主线只有七步:

  1. 装 DevEco Studio(自带 SDK 和全套工具链);
  2. 获取 Flutter-OH SDK(git clone 优先;ZIP 方式必须补 git 三件套:init + add -f engine.version + tag);
  3. 配环境变量(3 个变量 + Path 4 条 + .npmrc 两行);
  4. flutter config --ohos-sdk 指定 SDK 路径;
  5. flutter doctor 确认 HarmonyOS toolchain 全绿;
  6. flutter create --platforms=ohos 创建独立工程,flutter build hap --debug 验证构建;
  7. 真机三连:设备开开发者模式 + 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 两个坑的修法照搬即可)。

参考资料

Logo

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

更多推荐