鸿蒙系统 (HarmonyOS)是华为推出的一款分布式操作系统,那么如何在保证开发迭代效率的前提下,以相对低的成本将移动应用快速移植到鸿蒙平台上呢?美团外卖 MTFlutter 团队近期做了一次技术探索,成功地实现了 Flutter 对于鸿蒙系统的原生支持。
在鸿蒙系统上,我们可以借助平台提供的多模输入 API,实现多种类型事件的监听:
flutterComponent.setTouchEventListener(touchEventListener); // 触摸及鼠标事件 flutterComponent.setKeyEventListener(keyEventListener); // 键盘录入事件 flutterComponent.setSpeechEventListener(speechEventListener); // 语音录入事件
对于事件的封装处理,可以复用 Android 已有的逻辑,只需要关注鸿蒙与 Android 在事件处理上的对应关系即可,比如触摸事件的部分对应关系:
3. 其他必要的平台能力
为了保证 Flutter 应用能够正常运行,除了最基本的渲染和交互外,我们的嵌入层还要提供资源管理、事件循环、生命周期同步等平台能力。对于这些能力 Flutter 大多都在嵌入层的公共部分有抽象类声明,只需要使用鸿蒙 API 重新实现一遍即可。
比如资源管理,引擎提供了 AssetResolver 声明,我们可以使用鸿蒙 Rawfile API 来实现:
class HAPAssetMapping : public fml::Mapping { public: HAPAssetMapping(RawFile* asset) : asset_(asset) {} ~HAPAssetMapping() override { CloseRawFile(asset_); } size_t GetSize() const override { return GetRawFileSize(asset_); } const uint8_t* GetMapping() const override { return reinterpret_cast<const uint8_t*>(GetRawFileBuffer(asset_)); } private: RawFile* const asset_; FML_DISALLOW_COPY_AND_ASSIGN(HAPAssetMapping); };
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
对于事件循环,引擎提供了 MessageLoopImpl 抽象类,我们可以使用鸿蒙 Native_EventHandler API 实现:
// runner_ 为鸿蒙 EventRunnerNativeImplement 的实例 void MessageLoopHarmony::Run() { FML_DCHECK(runner_ == GetEventRunnerNativeObjForThread()); int result = ::EventRunnerRun(runner_); FML_DCHECK(result == 0); } void MessageLoopHarmony::Terminate() { int result = ::EventRunnerStop(runner_); FML_DCHECK(result == 0); }
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
对于生命周期的同步,鸿蒙的 Page Ability 提供了完整的生命周期回调(如下图所示),我们只需要在对应的时机将状态上报给引擎即可。、
Page Ability Lifecycle
当以上这些能力都准备好之后,我们就可以成功把 Flutter 应用跑起来了。以下是通过 DevEco Studio 运行官方 Flutter Gallery 应用的截图,截图中 Flutter 引擎已经使用鸿蒙系统的平台能力进行了重写:
DevEco Running Flutter