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

📅 2026/7/5 21:37:12 👁️ 阅读次数 📝 编程学习
Flutter 鸿蒙环境搭建避坑实战:Windows 下把 SDK、HDC 和 HAP 构建一次跑通

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($pathin @($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 版权协议,转载请附上原文出处链接及本声明。
原文链接:原文链接