Flutter 鸿蒙环境搭建避坑实战:Windows 下把 SDK、HDC 和 HAP 构建一次跑通

第一次在 Windows 上搭 Flutter 鸿蒙环境,最容易出现的不是 Dart 页面写错,而是工具链没对齐:Flutter SDK 下错了,DevEco 的 SDK 路径指错了,HDC_HOME 指到了旧目录,项目里的 local.properties 还停留在上一套环境。表面上看是 flutter build hap 报错,实际根因可能在环境变量、SDK API 或设备连接。

在这里插入图片描述

这篇文章按一次真实安装流程整理,目标很明确:在 Windows 上把 Flutter 鸿蒙环境配置到能构建 HAP、能识别模拟器、能 flutter run。文中会把原文里的下载步骤、今天实装压缩包里的稳定配置、以及最容易踩坑的地方放在一起讲。需要注意:文中的磁盘路径、SDK API 和分支名称是本次验证组合,读者实际操作时要替换成自己机器上的真实安装路径,并以当前仓库 README 与 DevEco Studio 安装结果为准。

读完后你应该能解决四件事:

  1. 知道普通 Flutter SDK 为什么不能直接套用到这条鸿蒙构建链路。
  2. 知道 DevEco Studio、OpenHarmony SDK、HDC、PATH 分别负责什么。
  3. 知道 flutter build hap --debug 成功时应该看到什么产物。
  4. 知道环境不通时先查哪里,避免在 Dart 页面里浪费时间。

在这里插入图片描述

在这里插入图片描述

1. 先把工具链边界分清楚

Flutter 开发鸿蒙不是只装一个 Flutter 就完事。它至少涉及五类工具:Flutter 鸿蒙适配版本、DevEco Studio、OpenHarmony SDK、JDK、Node 与鸿蒙命令行工具。每个工具缺一块,最后都可能在构建 HAP 时暴露出来。

工具作用容易踩坑的地方
Flutter 鸿蒙适配版提供 hap 构建目标普通 Flutter SDK 不一定包含鸿蒙构建能力
DevEco Studio管理模拟器、工具链、SDK安装路径和 SDK 路径容易混淆
OpenHarmony SDK提供 API、toolchains、hdcAPI 版本要和项目配置一致
JDK 17支撑构建工具运行JAVA_HOME 不要指到 bin 目录里
Node / ohpm / hvigor参与鸿蒙构建链路PATH 缺失会导致命令找不到

安装前先确认自己要搭的是“Flutter 跑鸿蒙”,不是普通 Android/iOS Flutter,也不是纯 ArkTS 应用。这个判断很重要,因为它决定了 Flutter SDK 的来源。

2. Flutter SDK 不要下错

下载鸿蒙开发者工具地址:

DevEco Studio 下载地址

命令行工具 (里面有hvigor构建工具):

命令行工具下载地址(包含 hvigor 构建工具)

这两个简单 全程下一步就可以了

下载Flutter SDK,推荐用gitCode地址为
Flutter SDK 鸿蒙适配版 GitCode 仓库

原文里专门提醒过:不要把普通 Flutter SDK 当作鸿蒙适配 SDK 使用。今天压缩包里的稳定配置进一步锁定了一个已跑通的来源和分支:

Repo: https://gitcode.com/CPF-Flutter/flutter_flutter.git
Branch: oh-3.35.7-dev
Observed version: Flutter 3.35.8-ohos-1.0.3-beta

如果你使用的是其他团队维护的 Flutter 鸿蒙分支,仓库地址和分支名可能不同。判断是否正确的关键不是地址长得一样,而是当前 flutter 是否支持鸿蒙目标、项目是否能生成 ohos 工程并构建 HAP。

配置完成后,第一件事不是创建项目,而是看版本输出里是否能看出鸿蒙适配信息。

flutter --version

代码解释:

  1. 这个命令用来确认当前命令行调用的是哪一套 Flutter。
  2. 如果 PATH 里排在前面的还是普通 Flutter,后面执行 flutter build hap 很可能没有鸿蒙构建目标。
  3. 版本确认以后再创建项目,避免一开始就把工程生成到错误工具链上。

如果你电脑里装过多套 Flutter,建议直接用完整路径验证一次:


> D:\lesson\flutter_flutter\bin\flutter.bat --version

代码解释:

  1. 完整路径可以绕开 PATH 顺序问题。
  2. 如果完整路径输出正确,但普通 flutter --version 输出错误,说明 PATH 顺序需要调整。
  3. 环境变量修好后重新打开命令行窗口,旧窗口不会自动刷新所有用户变量。

3. DevEco Studio 和 OpenHarmony SDK 要分开看

很多人会把 DevEco Studio 安装目录和 SDK 目录混成一个路径。实际配置时要分清楚:

DevEco Studio root:
D:\harmonyos\DevEco Studio\devecostudio-windows-6.1.1.280\DevEco Studio

OpenHarmony SDK root:
D:\harmonyos\OpenHarmony-6.0.0-API20\sdk

DevEco Studio 负责 IDE、模拟器入口和工具目录;OpenHarmony SDK 负责 API、toolchains、hdc 等构建运行依赖。压缩包里的脚本就是按这两个根目录分别处理的。

$DevecoRoot = "D:\harmonyos\DevEco Studio\devecostudio-windows-6.1.1.280\DevEco Studio"
$SdkRoot = "D:\harmonyos\OpenHarmony-6.0.0-API20\sdk"

Test-Path "$DevecoRoot\tools\hvigor\bin"
Test-Path "$DevecoRoot\tools\ohpm\bin"
Test-Path "$SdkRoot\default\openharmony\toolchains"

代码解释:

  1. hvigorohpm 在 DevEco Studio 工具目录里。
  2. hdc 所在的 toolchains 来自 OpenHarmony SDK。
  3. 这三个路径有一个不存在,就不要急着执行 Flutter 构建,先修安装目录。

4. 环境变量按用途配置,不要只靠复制

原文里列了很多环境变量,确实容易配错。更稳的做法是按用途理解:SDK 根目录、HDC 工具、Flutter 来源、Flutter bin、依赖缓存分别配置。

[Environment]::SetEnvironmentVariable("DEVECO_SDK_HOME", "D:\harmonyos\OpenHarmony-6.0.0-API20\sdk", "User")
[Environment]::SetEnvironmentVariable("HOS_SDK_HOME", "D:\harmonyos\OpenHarmony-6.0.0-API20\sdk", "User")
[Environment]::SetEnvironmentVariable("HDC_HOME", "D:\harmonyos\OpenHarmony-6.0.0-API20\sdk\default\openharmony\toolchains", "User")
[Environment]::SetEnvironmentVariable("HDC_SERVER_PORT", "7035", "User")
[Environment]::SetEnvironmentVariable("FLUTTER_GIT_URL", "https://gitcode.com/CPF-Flutter/flutter_flutter.git", "User")
[Environment]::SetEnvironmentVariable("HOST_FLUTTER", "D:\lesson\flutter_flutter\bin", "User")

代码解释:

  1. DEVECO_SDK_HOMEHOS_SDK_HOME 指向 SDK 根目录,不是 DevEco Studio 根目录。
  2. HDC_HOME 指向 toolchains,这样命令行才能稳定找到 hdc。
  3. HDC_SERVER_PORT=7035 来自本次验证环境,适合这套模拟器调试链路;如果你的团队已有统一端口策略,应按团队配置执行。
  4. HOST_FLUTTER 指向 Flutter 的 bin 目录,方便构建工具找到宿主 Flutter。

如果你使用 PowerShell 脚本统一配置,可以把路径作为参数传入:

.\setup_flutter_harmonyos.ps1 `
  -FlutterRoot "D:\lesson\flutter_flutter" `
  -DevecoRoot "D:\harmonyos\DevEco Studio\devecostudio-windows-6.1.1.280\DevEco Studio" `
  -SdkRoot "D:\harmonyos\OpenHarmony-6.0.0-API20\sdk" `
  -ProjectRoot "D:\work\my_flutter_ohos_app" `
  -Verify

代码解释:

  1. FlutterRoot 是 Flutter 仓库根目录,不是 bin
  2. DevecoRoot 是 DevEco Studio 安装根目录。
  3. SdkRoot 是 OpenHarmony SDK 根目录。
  4. ProjectRoot 传入后,可以同步修正项目里的 ohos/local.properties

5. PATH 里要覆盖这些目录

环境变量配好不代表命令能直接执行,PATH 还要能找到 Flutter、hvigor、ohpm、node、JBR 和 toolchains。压缩包里的规则建议追加这些目录,实际路径按自己的安装位置替换:

<Flutter root>\bin
<DevEco Studio root>\tools\node
<DevEco Studio root>\tools\ohpm\bin
<DevEco Studio root>\tools\hvigor\bin
<DevEco Studio root>\jbr\bin
<OpenHarmony SDK root>\default\openharmony\toolchains

可以用下面的命令快速确认当前窗口能否找到关键命令:

where flutter
where hdc
where hvigor
where ohpm
where node

代码解释:

  1. where 会展示命令实际命中的路径。
  2. 如果 where flutter 命中了旧版 Flutter,需要调整 PATH 顺序。
  3. 如果 hdc 找不到,优先检查 HDC_HOME 和 toolchains 是否加入 PATH。
  4. 如果 hvigorohpm 找不到,说明 DevEco Studio 工具目录没有加入 PATH。

6. 项目里的 ohos 配置也要对齐

即使全局环境变量正确,项目本身也可能还指向旧 SDK。Flutter 鸿蒙项目里要重点看三个文件。

ohos/build-profile.json5
ohos/entry/src/main/module.json5
ohos/local.properties

推荐的关键配置如下:

{
  "app": {
    "compileSdkVersion": 20,
    "targetSdkVersion": 20,
    "compatibleSdkVersion": 20,
    "runtimeOS": "OpenHarmony"
  }
}

代码解释:

  1. compileSdkVersion 控制编译使用的 SDK API。
  2. targetSdkVersion 表示目标运行 API。
  3. compatibleSdkVersion 表示兼容范围。
  4. 三者要和本机 OpenHarmony SDK 对齐;本次验证组合使用 API 20,所以这里示例写 20。

module.json5 里设备类型也要确认:

{
  "module": {
    "deviceTypes": [
      "default"
    ]
  }
}

代码解释:

  1. deviceTypes 决定模块面向的设备类型。
  2. 如果这里和模拟器目标不匹配,可能出现构建或安装阶段的异常。
  3. 初学阶段先使用稳定配置,跑通后再按真实设备类型扩展。

local.properties 则要写真实本机路径:

hwsdk.dir=D:\\harmonyos\\OpenHarmony-6.0.0-API20\\sdk
flutter.sdk=D:\\lesson\\flutter_flutter

代码解释:

  1. hwsdk.dir 指向 OpenHarmony SDK 根目录。
  2. flutter.sdk 指向 Flutter 仓库根目录。
  3. 路径里的反斜杠在 properties 文件中通常需要转义。

7. 按顺序验证,不要一步跳到运行

环境搭好后,建议按下面顺序验证。这个顺序能把问题定位得更清楚。

flutter --version
flutter doctor -v
hdc list targets -v
flutter devices
flutter build hap --debug
flutter run

代码解释:

  1. flutter --version 确认 SDK 来源和版本。
  2. flutter doctor -v 查看 Flutter 与鸿蒙工具链状态。
  3. hdc list targets -v 确认 hdc 能连接到模拟器或真机。
  4. flutter devices 确认 Flutter 层能看到设备。
  5. flutter build hap --debug 先把 HAP 构建出来。
  6. flutter run 最后再安装运行,避免把构建问题和设备问题混在一起。

构建成功时,应能看到类似结果:

Built build\ohos\hap\entry-default-signed.hap.

代码解释:

  1. entry-default-signed.hap 是开发阶段很重要的判断点。
  2. 如果没有这个产物,不要先看页面代码,先回到 SDK、PATH、项目配置排查。
  3. 有产物但运行失败,再重点看设备连接和模拟器状态。

8. 创建项目前先确认命令来源

原文最后执行了创建项目命令:

flutter create my_app01

这个命令看起来简单,但前提是当前 flutter 已经是鸿蒙适配版本。否则你会得到一个普通 Flutter 项目,后面再补鸿蒙环境会更绕。

建议创建前先执行:

where flutter
flutter --version
flutter doctor -v

代码解释:

  1. where flutter 解决“到底调用了哪一个 flutter”的问题。
  2. flutter --version 解决“这个 flutter 是否是鸿蒙适配版”的问题。
  3. flutter doctor -v 解决“工具链是否具备构建条件”的问题。

如果项目已经创建过,也可以先不要删项目,先修 ohos/local.properties 和 SDK API 配置,再重新构建。

9. 一个更稳的本机配置脚本思路

手工配环境变量容易漏,推荐把已验证路径写成脚本。下面是简化版,核心逻辑和压缩包中的配置脚本一致:先确认路径存在,再设置用户环境变量,最后更新当前进程 PATH。

param(
  [string]$FlutterRoot,
  [string]$DevecoRoot,
  [string]$SdkRoot
)

$toolchains = Join-Path $SdkRoot "default\openharmony\toolchains"
$flutterBin = Join-Path $FlutterRoot "bin"
$hvigor = Join-Path $DevecoRoot "tools\hvigor\bin"
$ohpm = Join-Path $DevecoRoot "tools\ohpm\bin"
$node = Join-Path $DevecoRoot "tools\node"
$jbr = Join-Path $DevecoRoot "jbr\bin"

foreach ($path in @($toolchains, $flutterBin, $hvigor, $ohpm, $node, $jbr)) {
  if (-not (Test-Path $path)) {
    throw "Path not found: $path"
  }
}

[Environment]::SetEnvironmentVariable("DEVECO_SDK_HOME", $SdkRoot, "User")
[Environment]::SetEnvironmentVariable("HOS_SDK_HOME", $SdkRoot, "User")
[Environment]::SetEnvironmentVariable("HDC_HOME", $toolchains, "User")
[Environment]::SetEnvironmentVariable("HDC_SERVER_PORT", "7035", "User")
[Environment]::SetEnvironmentVariable("HOST_FLUTTER", $flutterBin, "User")

代码解释:

  1. Test-Path,可以提前发现路径写错。
  2. 变量写入 User 级别,重开终端后仍然生效。
  3. HDC_SERVER_PORT 在本次验证环境中写成 7035,用于减少模拟器连接不稳定的问题。
  4. 脚本只做环境配置,不替你改业务代码,风险更低。

如果还要自动修项目路径,可以补一段写入 local.properties

$localProperties = "D:\work\my_flutter_ohos_app\ohos\local.properties"
$sdk = $SdkRoot.Replace("\", "\\")
$flutter = $FlutterRoot.Replace("\", "\\")

@(
  "hwsdk.dir=$sdk"
  "flutter.sdk=$flutter"
) | Set-Content -LiteralPath $localProperties -Encoding utf8

代码解释:

  1. properties 文件中的 Windows 路径要处理反斜杠。
  2. 这一步只适合你确认项目路径正确后执行。
  3. 如果项目里还有其他配置项,实际脚本应保留原内容,只替换对应键。

10. 常见问题和处理方式

环境问题不要靠猜,先按错误发生阶段归类。

问题现象优先排查处理方式
flutter build hap 不识别Flutter SDK 来源换成鸿蒙适配 fork,调整 PATH
hdc 找不到HDC_HOME 和 PATH指向 default\openharmony\toolchains
找不到模拟器DevEco 模拟器和 hdc启动模拟器后执行 hdc list targets -v
API 或 syscap 报错SDK 与项目配置对齐 build-profile.json5 与本机 SDK API
构建产物没有生成工具链或依赖先修 flutter doctor -v 的异常项
能构建不能运行设备连接flutter devicesflutter run -d 指定目标

遇到问题时建议按下面的小流程走:

flutter clean
flutter pub get
flutter doctor -v
hdc list targets -v
flutter build hap --debug

代码解释:

  1. flutter clean 清掉旧构建产物,避免缓存干扰。
  2. flutter pub get 重新拉取 Dart 依赖。
  3. doctorhdc 分别确认工具链与设备链路。
  4. 重新构建 HAP,如果仍失败,再根据日志定位具体工具。

11. 最终验证清单

环境搭建完成后,可以按下面清单确认一次:

  1. where flutter 命中鸿蒙适配版 Flutter。
  2. flutter --version 能看到鸿蒙适配版本信息。
  3. DEVECO_SDK_HOMEHOS_SDK_HOME 指向 OpenHarmony SDK 根目录。
  4. HDC_HOME 指向 default\openharmony\toolchains
  5. HDC_SERVER_PORT 按本机模拟器链路配置;本次验证值为 7035
  6. where hdc 能找到 SDK toolchains 下的 hdc。
  7. hdc list targets -v 能看到模拟器或真机。
  8. flutter devices 能看到鸿蒙运行目标。
  9. ohos/build-profile.json5 与本机 OpenHarmony SDK API 保持一致;本次验证组合为 API 20。
  10. ohos/local.properties 指向当前机器真实 SDK 和 Flutter 路径。
  11. flutter build hap --debug 生成 entry-default-signed.hap
  12. flutter run 能安装并进入 Dart VM Service。

12. 总结

Flutter 鸿蒙环境搭建的关键不是把变量堆得越多越好,而是把“版本、路径、设备、项目配置、构建产物”这五件事按顺序验证清楚。先锁定鸿蒙适配版 Flutter,再让项目 SDK API 与本机 OpenHarmony SDK 对齐,然后配置 HDC 与 PATH,最后用 entry-default-signed.hapflutter run 结果验证整条链路。

后续真正写页面时,再进入 lib 目录做业务开发;需要鸿蒙权限、插件或平台能力时,再有目的地修改 ohos 工程。这样环境和业务分层清楚,排查问题会快很多。


版权声明:本文基于 CSDN 博主「大雷神」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:原文链接

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐