从标题里的“2026”说起。我最近连续接触了几个从 Flutter 跨端转 OpenHarmony 的项目,发现大家拿到 OpenHarmony 工程后,第一反应都是先找 ohos 目录在哪,然后再去看 DevEco Studio 那一套配置。这个思路没毛病,但很多人卡住并不是因为不会写 Dart 代码,而是对 OpenHarmony 侧工程结构不熟,不知道哪些文件是系统生成的、哪些需要手动改、哪些改错了会导致编译直接崩。这篇文章就把 Flutter 编译开发 OpenHarmony 的全套工程目录结构拆开揉碎,从根目录一路看到编译产物,顺带把 RK3568 设备树选择、Gradle 插件报错、依赖下载失败这类高频坑一次说清楚。
这篇文章适合谁看?一个是被公司要求把现有 Flutter App 移植到 OpenHarmony 上、但第一次接触 OpenHarmony 工程的客户端开发;另一个是看了一堆 Flutter 教程但始终没搞清楚 entry、hvigor、module.json5 这些文件到底干什么的初学者。不管你是哪种,读完这篇以后,拿到一个 Flutter + OpenHarmony 工程可以先花十分钟把目录结构过一遍,基本就能判断这个工程的改造状态和编译风险。这不是什么高深的底层原理,就是一份工程实操地图。
1. 项目背景与整体设计思路
1.1 为什么 Flutter 要跑在 OpenHarmony 上
先说背景。OpenHarmony 是一个面向多设备、全场景的分布式操作系统,现在国内外不少设备厂商都在基于它做自己的发行版,比如直接跑在 RK3566、RK3568、RK3588 这类开发板上。而 Flutter 最大的价值在于一套 Dart 代码同时交付 Android、iOS、Web、桌面,渲染自绘、UI 一致性好。两个东西结合以后,最直接的收益就是:移动端团队现有的 Flutter 代码库不用推倒重来,只需要解决平台适配层,就能进入 OpenHarmony 生态。
我实际接触过的几个项目里,有做工业平板的、做智能座舱 HMI 的、做边缘计算网关管理界面的,都是先用 Flutter 写好界面和业务逻辑,再通过 OpenHarmony 的 Flutter 引擎适配层跑到底层系统上。选这条路的核心原因有两个:一是 Flutter 的布局和渲染在复杂界面下优势明显,二是 OpenHarmony 原生 ArkUI 虽然也在快速迭代,但如果团队没有 ArkTS 基础,学习成本并不比适配 Flutter 低。相比之下,直接沿用 Flutter 的工程习惯,只是把平台层换成 OpenHarmony,很多团队实测下来能省三分之一的改造时间。
1.2 OpenHarmony 版 Flutter 的目录设计思路
从架构角度理解,Flutter on OpenHarmony 并不是把 Flutter 的 Android 工程改个名,而是重新做了一层 ohos 平台适配。整个工程模型的逻辑是这样的:Dart 侧的 lib/ 仍然是我们熟悉的 Flutter 业务代码,而 ohos/ 目录就是替代原来 android/、ios/ 的 OpenHarmony 原生宿主工程。
这个设计的好处很明显:Flutter 工具链负责 Dart 编译和资源打包,OpenHarmony 的构建系统(hvigor)负责生成 HAP 应用包,两者通过生成代码和资源目录对接。所以在目录里你会看到很多长得像 Android Gradle 工程标记,但实际字段是 OpenHarmony 风格的配置文件,比如 build-profile.json5、hvigorfile.ts。如果你之前熟 Android 工程,这套思路很快就能迁移过来,只是要把 Gradle 的 Groovy 记忆收一收,换成 JSON5 和 TypeScript 写构建脚本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工程目录结构逐层拆解:从根目录到编译产物
2.1 根目录核心文件:Flutter 工程基因一眼识别
拿到任何一个 Flutter + OpenHarmony 工程,先看根目录。一个标准工程通常长这样:
code复制project_root/
├── android/
├── ios/
├── lib/
│ ├── main.dart
│ └── pages/
├── ohos/
│ ├── app/
│ ├── entry/
│ └── build-profile.json5
├── linux/
├── macos/
├── web/
├── windows/
├── pubspec.yaml
├── analysis_options.yaml
├── .metadata
└── flutter_ohos_config.yaml(部分分支会出现)
如果你在一个工程里看到了 ohos 目录,基本就可以判断这个工程是用带了 OpenHarmony 支持的 Flutter SDK 创建或迁移过的。根目录里最值得关注的文件按优先级排是这样:
pubspec.yaml:Dart 依赖管理,所有第三方包都在这声明,同时也是 Flutter 工具链识别工程类型的入口;analysis_options.yaml:代码静态检查规则,团队规范靠它统一;.metadata:Flutter 工具链生成的版本记录文件,注意别手动删,里面有迁移信息;ohos/:OpenHarmony 宿主工程所在,是整个工程中最核心的目录。
很多人拿到工程后会忽略 pubspec.yaml 里的 environment 字段,我建议先看一眼 sdk: ^3.x.x 和 flutter: ">=3. ...",因为 OpenHarmony 的 Flutter SDK 分支通常基于特定版本定制,版本不匹配会导致编译时出现大量无法解析的符号。后面第 3 章会展开说版本匹配的问题。
