首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter 与开源鸿蒙(OpenHarmony)深度集成:从插件开发到分布式能力实战(续篇)

Flutter 与开源鸿蒙(OpenHarmony)深度集成:从插件开发到分布式能力实战(续篇)

作者头像
用户11944278
发布2025-12-23 10:46:22
发布2025-12-23 10:46:22
1180
举报

Flutter 与开源鸿蒙(OpenHarmony)深度集成:从插件开发到分布式能力实战(续篇)

摘要:本文作为《Flutter 与开源鸿蒙实战》的续篇,聚焦于 高级集成场景,包括自定义 Embedder 实现原理、跨设备协同(Continuation)、原子化服务封装、状态管理与 OpenHarmony 数据模型联动、以及 CI/CD 自动化构建流程。内容面向中高级开发者,旨在打通 Flutter 应用在 OpenHarmony 生态中的“最后一公里”。

一、回顾与进阶路线图

在上一篇中,我们完成了 Flutter 在 OpenHarmony 上的基础运行环境搭建,并实现了简单的设备信息插件。然而,要真正构建生产级应用,还需解决以下核心问题:

  • 如何让 Flutter 应用 原生融入 OpenHarmony 生命周期
  • 如何调用 分布式软总线(SoftBus) 实现设备间通信?
  • 如何将 Flutter 页面封装为 原子化服务(Atomic Service)
  • 如何实现 跨设备无缝迁移(Continuation)
  • 如何自动化构建与测试?

本篇将逐一攻克这些难题。


二、深入 Embedder:实现 Flutter 引擎与 OpenHarmony 的深度绑定

2.1 Embedder 的作用

Embedder 是 Flutter Engine 与宿主平台之间的桥梁。在 Android 中是 FlutterActivity,在 iOS 中是 FlutterViewController。在 OpenHarmony 中,我们需要实现一个 OHOS Embedder,负责:

  • 创建 Surface(用于 Skia 渲染)
  • 处理输入事件(触摸、按键)
  • 管理生命周期(onCreate, onResume, onDestroy)
  • 提供 Platform Channel 的底层支持
2.2 关键接口实现(C++ 层)
代码语言:javascript
复制
// ohos_embedder.cc
#include "flutter/shell/platform/embedder/embedder.h"
#include "surface_ohos.h"      // 自定义 Surface
#include "event_handler.h"    // 事件分发

static FlutterEngine g_engine = nullptr;

void OnFlutterPlatformMessage(const FlutterPlatformMessage* message,
                              void* user_data) {
  if (strcmp(message->channel, "com.example/softbus") == 0) {
    // 转发到 OpenHarmony NAPI 模块处理分布式通信
    HandleSoftBusMessage(message);
  }
}

bool InitializeFlutterEngine() {
  FlutterRendererConfig config = {};
  config.type = kOpenGL;
  config.open_gl.struct_size = sizeof(config.open_gl);
  config.open_gl.make_current = [](void*) { return true; };
  config.open_gl.clear_current = [](void*) {};
  config.open_gl.fbo_callback = [](void*) { return 0; };
  config.open_gl.present_with_info = [](void*, const FlutterPresentInfo* info) {
    // 调用 OHOS 图形子系统提交帧
    OHOS::Surface::Present(info->frame_interval);
  };

  FlutterProjectArgs args = {};
  args.assets_path = "/data/app/assets";
  args.icu_data_path = "/system/etc/icu/icudt73l.dat";
  args.platform_message_callback = OnFlutterPlatformMessage;

  FlutterEngineResult result = FlutterEngineRun(
      FLUTTER_ENGINE_VERSION, &config, &args, nullptr, &g_engine);

  return result == kSuccess;
}

提示:OpenHarmony 的图形子系统基于 Rosen(自研窗口系统),需通过 RSTransaction 提交绘制命令。

2.3 与 UIAbility 生命周期同步

EntryAbility.ts 中:

代码语言:javascript
复制
import flutterEmbedder from './native/libflutter_embedder.so';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    console.log('Flutter App onCreate');
    flutterEmbedder.init(); // 初始化 Embedder
  }

  onDestroy(): void {
    flutterEmbedder.shutdown(); // 释放 Engine
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // 获取窗口句柄并传给 Embedder
    const winId = windowStage.getMainWindowSync().windowId;
    flutterEmbedder.setWindowId(winId);
  }
}

三、分布式能力实战:跨设备协同控制

OpenHarmony 的核心优势在于 分布式软总线(DSoftBus),可实现设备间低延迟、高可靠通信。

3.1 封装 DSoftBus 为 Flutter 插件
Dart 层调用:
代码语言:javascript
复制
final channel = MethodChannel('dsoftbus');

Future<void> startDeviceDiscovery() async {
  await channel.invokeMethod('startDiscovery', {'serviceType': 'smart_light'});
}

Future<void> sendDataToDevice(String deviceId, String data) async {
  await channel.invokeMethod('sendData', {
    'deviceId': deviceId,
    'data': data,
  });
}
Native 层(NAPI + C++):
代码语言:javascript
复制
// dsoftbus_plugin.cpp
#include "softbus_client.h" // OpenHarmony 软总线 SDK

napi_value StartDiscovery(napi_env env, napi_callback_info info) {
  // 解析参数
  char serviceType[64];
  // ... 从 JS 参数提取

  // 调用 OpenHarmony DSoftBus API
  int ret = PublishLNN(serviceType, OnDeviceFoundCallback);
  if (ret != 0) {
    // 错误处理
  }
  return nullptr;
}

注意:需在 module.json5 中申请 ohos.permission.DISTRIBUTED_DATASYNC 权限。

3.2 实现跨设备界面迁移(Continuation)

当用户从平板走到手机旁,应用自动迁移到手机继续操作。

步骤:

注册迁移能力

代码语言:javascript
复制
// EntryAbility.ts
import continuationManager from '@ohos.application.continuationManager';

continuationManager.on('continue', (want) => {
  // 保存当前 Flutter 状态(如页面路径、表单数据)
  const state = flutter.getState();
  want.parameters = { flutterState: JSON.stringify(state) };
  return true; // 允许迁移
});

目标设备接收

代码语言:javascript
复制
// 目标设备的 EntryAbility
onCreate(want: Want) {
  if (want.parameters?.flutterState) {
    const state = JSON.parse(want.parameters.flutterState);
    flutter.restoreState(state); // 恢复 UI 状态
  }
}

Flutter 侧状态管理: 使用 ProviderRiverpod 将关键状态序列化为 JSON。


四、原子化服务(Atomic Service)封装

OpenHarmony 支持“免安装”服务卡片,Flutter 可作为服务 UI 提供者。

4.1 创建 Service Ability
代码语言:javascript
复制
// module.json5
{
  "abilities": [
    {
      "name": "LightControlService",
      "type": "service",
      "srcEntry": "./ets/LightControlService.ts",
      "visible": true,
      "skills": [
        { "entities": ["entity.system.home"], "actions": ["action.service.light"] }
      ]
    }
  ]
}
4.2 服务启动 Flutter 微应用
代码语言:javascript
复制
// LightControlService.ts
import flutterMiniApp from './flutter_mini/light_control';

export default class LightControlService extends ServiceExtensionAbility {
  onConnect(want: Want): void {
    // 启动轻量级 Flutter 引擎(仅渲染一个 Widget)
    flutterMiniApp.renderToSurface(this.surfaceHandle);
  }
}

优势:用户无需安装完整 App,即可通过服务卡片控制设备。


五、状态管理与 OpenHarmony 数据模型联动

5.1 使用 @ohos.data.preferences 同步配置
代码语言:javascript
复制
// flutter_preferences.dart
class OHOSPreferences {
  static const _channel = MethodChannel('ohos/preferences');

  static Future<void> setString(String key, String value) async =>
      _channel.invokeMethod('setString', {'key': key, 'value': value});

  static Future<String?> getString(String key) async =>
      _channel.invokeMethod('getString', {'key': key});
}
5.2 响应系统主题变化

OpenHarmony 支持深色/浅色模式切换:

代码语言:javascript
复制
// 监听主题变化
import themeManager from '@ohos.app.ability.themeManager';

themeManager.on('themeChange', (theme) => {
  flutter.sendTheme(theme.isDarkMode ? 'dark' : 'light');
});

Flutter 侧:

代码语言:javascript
复制
void initPlatformState() {
  const EventChannel('ohos/theme').receiveBroadcastStream().listen((theme) {
    ThemeMode mode = theme == 'dark' ? ThemeMode.dark : ThemeMode.light;
    context.read<ThemeBloc>().add(ThemeChanged(mode));
  });
}

六、CI/CD 自动化构建流程

6.1 构建脚本(build.sh)
代码语言:javascript
复制
#!/bin/bash
# 1. 编译 Flutter AOT
flutter build ohos --release

# 2. 复制产物到 ohos/assets
cp -r build/ohos/release/* ohos/src/main/resources/rawfile/

# 3. 使用 DevEco CLI 打包 HAP
devecostudio --build --project . --mode release

# 4. 安装到远程设备(通过 hdc)
hdc install outputs/default/oh_flutter_demo-unsigned.hap
6.2 GitHub Actions 示例
代码语言:javascript
复制
name: Build for OpenHarmony
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup DevEco CLI
        run: |
          wget https://.../devecostudio-cli.tar.gz
          tar -xzf devecostudio-cli.tar.gz
          echo "$PWD/devecostudio-cli/bin" >> $GITHUB_PATH
      - name: Build & Test
        run: ./scripts/build_and_test.sh

七、性能监控与崩溃分析

  • 帧率监控:通过 FrameTiming API 上报到 OpenHarmony HiLog。
  • 内存泄漏检测:结合 DevEco Profiler 与 Flutter Memory Dashboard。
  • 崩溃日志收集:重写 FlutterError.onError,将堆栈通过 NAPI 写入系统日志。

八、结语:走向生产就绪

Flutter 与 OpenHarmony 的集成已从“能否运行”迈向“如何高效开发”。尽管工具链仍在完善,但通过 Embedder 定制 + 插件封装 + 分布式能力对接,我们已能构建具备商业价值的应用。

下一步建议

  • 参与 OpenHarmony SIG-Flutter 贡献代码
  • 将常用插件发布至 pub.dev 并打上 openharmony 标签
  • 探索 Flutter Web + OpenHarmony IoT 的组合场景

附录:常用资源链接

  • OpenHarmony NAPI 开发指南:https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/extension/api-guides/js-apis-napi-overview.md
  • Flutter Embedder 示例仓库:https://github.com/openharmony-sig/flutter_embedder_ohos
  • 分布式软总线 API 文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-communication-softbus.md
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Flutter 与开源鸿蒙(OpenHarmony)深度集成:从插件开发到分布式能力实战(续篇)
    • 一、回顾与进阶路线图
    • 二、深入 Embedder:实现 Flutter 引擎与 OpenHarmony 的深度绑定
      • 2.1 Embedder 的作用
      • 2.2 关键接口实现(C++ 层)
      • 2.3 与 UIAbility 生命周期同步
    • 三、分布式能力实战:跨设备协同控制
      • 3.1 封装 DSoftBus 为 Flutter 插件
      • 3.2 实现跨设备界面迁移(Continuation)
    • 四、原子化服务(Atomic Service)封装
      • 4.1 创建 Service Ability
      • 4.2 服务启动 Flutter 微应用
    • 五、状态管理与 OpenHarmony 数据模型联动
      • 5.1 使用 @ohos.data.preferences 同步配置
      • 5.2 响应系统主题变化
    • 六、CI/CD 自动化构建流程
      • 6.1 构建脚本(build.sh)
      • 6.2 GitHub Actions 示例
    • 七、性能监控与崩溃分析
    • 八、结语:走向生产就绪
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档