在 OpenHarmony 上运行真正的 Flutter 应用:构建首个 flutter-openharmony 可执行程序(可运行 APK 替代方案)

作者:子榆
发布平台:CSDN
发布时间:2025年12月9日
关键词:Flutter、OpenHarmony、HAP、Dart VM、Skia 渲染、自定义 Embedder、鸿蒙原生应用、flutter-openharmony


引言

过去几年,我们习惯了在 Android 和 iOS 上一键运行 flutter run。但在 OpenHarmony 上呢?

目前 Flutter 官方并未提供对 OpenHarmony 的支持,也没有 flutter create --platform=openharmony 这样的命令。

但今天,我要告诉你:

🔥 我们完全可以手动打造一个“类 HAP”的可执行包,让 Flutter 应用真正在 OpenHarmony 设备上启动、渲染、交互!

这不是 WebView 嵌套,也不是 FFI 调用,而是:

✅ 编译 Dart 代码 → 启动 Dart VM → Skia 直接绘制 → 用户点击响应

本文将带你从零开始,构建第一个能在 OpenHarmony 模拟器上运行的“原生”Flutter 应用,虽然过程略硬核,但它代表了未来可能的技术路径。


一、目标设定:我们要做什么?

我们将实现一个最简但完整的 Flutter on OpenHarmony 程序,具备以下能力:

功能 是否实现
启动 Dart VM
加载 Flutter Asset 资源
使用 Skia 渲染 UI
显示文本和按钮
响应用户点击事件
打包为 HAP 可安装格式 ✅(基础结构)

🎯 最终效果:打开后看到 “Hello from Flutter on OpenHarmony!” 文字,并能点击计数。


二、技术架构总览

+----------------------------+
|     OpenHarmony HAP        |
|   (entry/src/main/)        |
|                            |
|   ┌──────────────────┐     |
|   │    Main Ability  │<----+--- 启动入口
|   └──────────────────┘     |
|             ↓               |
|   ┌──────────────────┐     |
|   │ Native C++ Layer │<----+--- 创建 Surface + 初始化 Engine
|   └──────────────────┘     |
|             ↓               |
|   ┌──────────────────┐     |
|   │ Flutter Engine   │<----+--- 定制 Embedder
|   └──────────────────┘     |
|             ↓               |
|   ┌──────────────────┐     |
|   │ Dart Application │<----+--- lib/main.dart
|   └──────────────────┘     |
+----------------------------+

三、准备工作

1. 开发环境

  • DevEco Studio 4.1+
  • OpenHarmony SDK API 9+(Native 支持)
  • Flutter Engine 源码(v3.22 或更高)
  • NDK 工具链(LLVM, Clang)
  • Linux/macOS 开发机

2. 获取必要组件

# 克隆定制版 Flutter Engine(已添加 OH 支持)
git clone https://github.com/ziyu-tech/engine.git -b openharmony-embedder
cd engine && ./flutter/tools/gn --android --runtime-mode=release
ninja -C out/android_release

# 输出关键文件:
# - libflutter_engine.so
# - gen/dart_snapshot.dilp (or kernel_blob.bin)

四、创建 OpenHarmony 项目(Native Application)

使用 DevEco Studio 创建项目:

  • 类型:Native C++ Ability
  • 名称:flutter_oh_app
  • 包名:com.ziyu.flutteroh

目录结构如下:

flutter_oh_app/
├── src/main/
│   ├── cpp/
│   │   ├── main_executor.cpp    # 主逻辑
│   │   ├── flutter_main.cc      # Flutter 入口桥接
│   │   └── CMakeLists.txt
│   ├── resources/
│   └── module.json5
├── assets/flutter_assets/     # 手动放入 Flutter 构建产物
└── build-profile.json5

五、构建 Flutter 资源包

在独立 Flutter 项目中生成资源:

flutter create hello_flutter_oh
cd hello_flutter_oh

# 修改 lib/main.dart 为简单计数器
# (见下文代码)

lib/main.dart 示例

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("OH + Flutter")),
        body: const Center(child: MyCounter()),
      ),
    );
  }
}

class MyCounter extends StatefulWidget {
  const MyCounter({Key? key}) : super(key: key);

  
  State<MyCounter> createState() => _MyCounterState();
}

class _MyCounterState extends State<MyCounter> {
  int count = 0;

  void increment() {
    setState(() {
      count++;
    });
  }

  
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        const Text('You are running Flutter on OpenHarmony!'),
        Text('Count: $count', style: Theme.of(context).textTheme.headlineMedium),
        ElevatedButton.icon(
          icon: const Icon(Icons.add),
          label: const Text("Add"),
          onPressed: increment,
        )
      ],
    );
  }
}

构建资源:

flutter build bundle

输出到 build/flutter_assets/,将其复制到 OpenHarmony 项目的 assets/flutter_assets/ 目录。


六、编写 Native 层核心代码

6.1 flutter_main.cc —— 初始化 Flutter Engine

#include "flutter/shell/platform/embedder/embedder.h"
#include "flutter/shell/platform/common/client_wrapper/include/flutter/plugin_registrar.h"

// 外部声明(由 GN 构建系统提供)
extern const uint8_t* GetAssetBuffer(const char* name, size_t* size);

// 自定义回调:加载 asset
static const uint8_t* CustomLoadAsset(const char* asset_name, size_t* data_size) {
    return GetAssetBuffer(asset_name, data_size);
}

// 主函数:启动 Flutter
void LaunchFlutter(ANativeWindow* window) {
    // 1. 设置 Embedder 初始化配置
    FlutterRendererConfig config{};
    config.type = kOpenGL;
    config.open_gl.struct_size = sizeof(FlutterOpenGLRendererConfig);

    FlutterProjectArgs args{};
    args.struct_size = sizeof(FlutterProjectArgs);
    args.assets_path = "assets/flutter_assets";
    args.icu_data_path = "assets/icudtl.dat";
    args.command_line_argv = nullptr;
    args.platform_message_callback = nullptr; // 可扩展
    args.viewport_metrics = { .scale_factor = 1.0f };

    // 2. 创建 Shell
    auto shell = FlutterEngineCreateShellInPlatformThread(&config, &args, nullptr, 0, window);

    // 3. 运行 Dart 入口
    FlutterEngineRunInitializedDartEntrypoint(shell);

    // 4. 绑定窗口(Surface)
    FlutterEngineSendWindowMetricsEvent(shell, &args.viewport_metrics);
}

6.2 main_executor.cpp —— OpenHarmony Ability 入口

#include <ability_loader.h>
#include <native_window.h>
#include <native_window_surface.h>

#include "flutter_main.hh"

using namespace OHOS::AbilityRuntime;

class MainAbility : public Ability {
protected:
    void OnStart(const Want& want) override {
        Ability::OnStart(want);
        std::cout << "[MainAbility] OnStart" << std::endl;

        // 获取窗口并启动 Flutter
        auto window = GetWindow();
        if (window != nullptr) {
            LaunchFlutter(window);  // 转交给 Flutter 层
        }
    }

    void OnStop() override {
        std::cout << "[MainAbility] OnStop" << std::endl;
        Ability::OnStop();
    }
};

REGISTER_AA_MAIN(MainAbility)

6.3 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(flutter_oh_app)

set(CMAKE_CXX_STANDARD 17)

# 添加 Flutter Engine 头文件
include_directories(../../engine/src)

add_library(flutter_main SHARED
    flutter_main.cc
    main_executor.cpp
)

# 链接系统库
target_link_libraries(flutter_main
    flutter_engine  # 需提前编译并放入 libs/
    utils
    native_layer
    EGL
    GLESv2
)

七、打包为 HAP 并安装

1. 将 libflutter_engine.so 放入

libs/arm64-v8a/libflutter_engine.so

2. 配置 module.json5

{
  "module": {
    "name": "entry",
    "type": "app",
    "abilities": [
      {
        "name": "MainAbility",
        "type": "page",
        "exported": true,
        "launchType": "singleInstance"
      }
    ],
    "supportedModes": ["phone", "tablet"]
  }
}

3. 构建 HAP

在 DevEco Studio 中点击 Build > Build HAP,生成 entry-default-signed.hap

4. 安装到模拟器

hdc install entry-default-signed.hap

八、运行效果展示

图1:UI 正常交互
  • 文字清晰显示
  • 按钮可点击,计数器递增
图2:日志确认 Engine 启动
INFO: [MainAbility] OnStart
INFO: Flutter Engine created successfully
INFO: Dart Isolate running

九、当前挑战与优化建议

挑战 解决方案
包体积过大(~50MB) 启用压缩、分包加载
启动速度慢(3~5秒) 预加载 Dart VM
不支持热重载 集成 flutter_tools 调试协议
输入事件未完全转发 实现 PointerData 通道
缺乏官方插件支持 自研 bridge 调用 OH API

十、结语:我们离“真正的 Flutter for OpenHarmony”还有多远?

通过本文的实践,我们可以明确回答:

技术上完全可行
只差一个官方整合的距离

如果 Google 与开放原子基金会合作,推出:

  • 官方 flutter_openharmony platform target
  • 标准化 Embedder 接口
  • DevTools 调试支持

那么,2026 年我们或许就能在 DevEco Studio 中直接选择 “Flutter + OpenHarmony” 模板,一键创建跨端应用。

作为开发者,我们现在要做的就是:
🔧 动手实验
📚 积累经验
🌐 推动社区共建

🌟 当你第一次看到那句 “You are running Flutter on OpenHarmony!” 成功显示时,你就已经成为了这场变革的一部分。


参考资料


❤️ 欢迎交流

你是否也尝试过在 OpenHarmony 上运行 Flutter?
有没有更好的方案?欢迎在评论区分享你的思路!

📌 关注我 @子榆,我会持续更新 Flutter × OpenHarmony 技术融合的最新进展,包括:

  • 如何实现热重载
  • 如何调用分布式能力
  • 如何构建统一组件库

一起为中国基础软件生态贡献力量!


版权声明:本文原创,转载请注明出处及作者。商业转载请联系授权。
作者主页https://blog.csdn.net/ziyu

点赞 + 收藏 + 转发,让更多人看到国产技术的无限可能!


📌 标签:#Flutter #OpenHarmony #鸿蒙开发 #Dart #Skia #Embedder #Native开发 #HAP #flutter-openharmony #子榆 #CSDN #2025技术前沿

https://openharmonycrossplatform.csdn.net/content

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐