资讯中心
关于我们
欢迎光临格子云商城!
GE ZI CLOUD
数字化应用聚合平台
格子云
按钮文本
热门搜索:惠普  复印纸  中性笔
全部商品分类
技术社区

原生适配,让Flutter在鸿蒙系统上跑起来——美团MTFlutter团队

来源: | 作者:创业观察 | 发布时间: 2021-04-12 | 4947 次浏览 | 分享到:
鸿蒙系统 (HarmonyOS)是华为推出的一款分布式操作系统,那么如何在保证开发迭代效率的前提下,以相对低的成本将移动应用快速移植到鸿蒙平台上呢?美团外卖 MTFlutter 团队近期做了一次技术探索,成功地实现了 Flutter 对于鸿蒙系统的原生支持。

 

在鸿蒙系统上,我们可以借助平台提供的多模输入 API,实现多种类型事件的监听:

 

flutterComponent.setTouchEventListener(touchEventListener); // 触摸及鼠标事件 flutterComponent.setKeyEventListener(keyEventListener); // 键盘录入事件 flutterComponent.setSpeechEventListener(speechEventListener); // 语音录入事件 
  • 1.
  • 2.
  • 3.

 

对于事件的封装处理,可以复用 Android 已有的逻辑,只需要关注鸿蒙与 Android 在事件处理上的对应关系即可,比如触摸事件的部分对应关系:原生适配,让Flutter在鸿蒙系统上跑起来——美团MTFlutter团队

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 提供了完整的生命周期回调(如下图所示),我们只需要在对应的时机将状态上报给引擎即可。、

 

原生适配,让Flutter在鸿蒙系统上跑起来——美团MTFlutter团队Page Ability Lifecycle

 

当以上这些能力都准备好之后,我们就可以成功把 Flutter 应用跑起来了。以下是通过 DevEco Studio 运行官方 Flutter Gallery 应用的截图,截图中 Flutter 引擎已经使用鸿蒙系统的平台能力进行了重写:

原生适配,让Flutter在鸿蒙系统上跑起来——美团MTFlutter团队

DevEco Running Flutter