Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果
原创作者:恋猫de小郭
相信大家都已经听说过,明年的 Harmony Next 版本将正式剥离 AOSP 支持 ,基于这个话题我已经做过一期问题汇总 ,当时在 现有 App 如何兼容 Harmony Next 问题上提到过:
华为内部也主导适配目前的主流跨平台方案,主动提供反向适配支持,估计后面就会有类似 Flutter for harmony 的社区支持。

没想到 HDC 大会才刚过去一个多月,就有网友提醒,针对 OpenHarmony 的 Flutter 版本已经开源:gitee.com/openharmony…,这既让人惊喜又是「情理之中」,因为在众多框架里,Harmony 和 Flutter 之间的联系可以说是最密不可分。

关系
为什么说 Harmony 和 Flutter 之间的联系很密切?因为不管是 ArkUI 还是 ArkUI-X ,它们的底层支持里都或多或少存在 Flutter 的身影。
例如 ArkUI 的 framework arkui\_ace\_engine,里面就可以看到很多熟悉的 Flutter 代码,不过这里面有点特殊在于,这些代码都是用 C++ 实现的,例如下图中的 Stack 的控件。


另外,除了 ArkUI 华为还开源了 ArkUI-X,ArkUI-X 扩展了 ArkUI 框架让其支持跨平台开发,而这部分跨平台的底层逻辑,同样来自 Flutter 和 Skia 的支持。

与 Flutter 不同的是,OpenHarmony 上层开发用的是 ArkTS 和 ArkUI,调用走的是 NAPI(Native API),NAPI 是一套基于 Node.js 规范开发的原生模块扩展开发框架。
NAPI 可以实现 JS 与 C/C++ 代码之间相互访问,也就是 ArkTS 可以直接和 C/C++ 无缝调用,类似 dart ffi 效果。

举个例子,例如通过 ArkUI-X 里的 getDefaultDisplaySync 获取设备屏幕信息, 对于 Android 系统而言, ets 下的代码通过 napi 会调用到 C++ 层的 DisplayInfo 对象,从而再通过 jni 调用 java 下的 DisplayInfo 对象。
var dsp = display.getDefaultDisplaySync();





其实这一点对于 Flutter 来说很重要,因为对于 Flutter 兼容 Harmony OS 的支持上, napi 是必不可少的一部分。

因为在 Flutter 里,Dart 除了可以直接和 C/C++ 调用之外,还支持和 Objective-C/Swift 与 Java/Kotlin 直接调用而不需要通过 Channel 。
- 其中
Objective-C / Swift interop是通过 package:ffigen :
ffigen:name: AVFAudiodescription: Bindings for AVFAudio.language: objcoutput: 'avf_audio_bindings.dart'headers:entry-points:- '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AVFAudio.framework/Headers/AVAudioPlayer.h'`
Java / kotlin是通过 jnigen 支持调用,不过目前还属于 experimental 的状态:
output:c:library_name: examplepath: src/example/dart:path: lib/example.dartstructure: single_file
source_path:- 'java/'
classes:- 'dev.dart.Example'`
所以,后续在 Harmony OS 上,就会有多一个类似 napi gen 支持的需要。
兼容
本次开源支持 OpenHarmony 的 flutter 社区版本来自 openharmony-sig ,该组织主要用于孵化 OpenHarmony 相关开源生态项目。

另外,在 openharmony 组织下
sig\_crossplatformui也有 Taro 主导的一些跨平台支持计划。
OpenHarmony 的 flutter (简称 OP Flutter )版本目前所用的分支应该是 3.7 版本,因为是刚开源,目前 flutter tools 指令仅支持 linux 下使用 ,但是相信后续跟上节奏应该不成问题。

以下分析基于 2023-09-18 的部分内容,后续肯定会有新的变化,这里主要提供一些思路和方向。
SIG 社区适配的主要有 OP flutter 和 OP flutter engine 两个项目,根据目前的提交,OP flutter 目前主要是添加了 flutter tools 对于构建 hap 的支持,例如:
- 添加环境检测

- 实现 tools 下的自定义的
build_hap.dart,还有识别鸿蒙设备的支持等。


- 提供 create 时对应的 ets 模版

而关于运行支持,主要是通过 OP flutter engine 来实现,主要代码新增在对应的 ohos/ 目录下:

从 OP flutter engine 变更的内容上看,主要是从原有 shell/platform/android 下的代码拷贝一份进行调整,例如 GL Context 代码部分目前几乎太大区别。


另外,大家比较关心的应该就是 Impeller 在 OP 上是否支持,目前看来 OP Flutter Engine 里对于 Impeller 有一定预设,但是并没有启用,因为 Flutter 官方目前对于 Android 上的 Impeller 也没有正式发布,所以这个目前看来也不需要着急。


关于字体部分, 目前看来 OP 上 Flutter 默认会使用 sans-serif ,这个应该是和 鸿蒙上的 HarmonyOS Sans 保持一致。


关于刷新率部分,目前暂时可以看到是默认写死了 60hz ,后续应该可以通过 napi 等支持获取实际刷新率,支持动态刷新率这个大家不用担心。

另外,因为版本问题,目前 OP Flutter Engine 里还保留了 partial repaint 操作,但是其实 Flutter 官方已经在 Android 上 Disable 了 partial repaint ,因为 Android 上的部分重绘存在太多问题,所以该功能被直接屏蔽。
Flutter 官方之后打算与 Vulkan Impeller 单独适配后再重新开放 partial repaint,这对 OP Flutter Engine 来说也许也是一个历史包袱,猜测 OP Flutter 后续会跟随 Impeller 同步。
当然,因为不同平台,所以 OP Flutter Engine 也有自己需要单独实现的逻辑,例如数据的类型转化处理,在 Android 上对应的是 shell/platform/android/platform\_view\_android\_jni\_impl.cc, 而在 OP 上对应的就是 shell/platform/ohos/napi/platform\_view\_ohos\_napi.cpp :

最后,Flutter 适配不只是 embedding 和 tools 的适配,还有新的 channel 和 plugin 的支持,目前看来 SIG 也在致力与这点,一些常用或者知名的 plugin 社区都会逐步增加支持,这看起来是一个苦力活,但是对于 Harmony 脱离 AOSP 构建自己的生态来说,无疑会是历史性的一步。

最后
通过本篇,相信你应该能简单理解到 Flutter 和 Harmony 之间的「因果关系」,对于 Flutter 开发来说,Harmony Next 会是一个相对较好的新平台。
当然,这不代表这你可以不学 ArkTS 和 ArkUI ,因为不管是打包构建或者 napi 都离不开 Harmony 平台本身的支持,而且在于这样一个「百废待兴」的社区环境下,完全靠社区支撑明显不现实,关键时刻还得是「自己动手」才能「丰衣足食」。
为了能让大家更好的学习鸿蒙 (Harmony OS) 开发技术,这边特意整理了《鸿蒙 (Harmony OS)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙 (Harmony OS)开发学习手册》
入门必看:https://qr21.cn/FV7h05
- 应用开发导读(ArkTS)
- 应用开发导读(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05
- 系统定义
- 技术架构
- 技术特性
- 系统安全

如何快速入门:https://qr21.cn/FV7h05
- 基本概念
- 构建第一个ArkTS应用
- 构建第一个JS应用
- ……

开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……

基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……

相关文章:
Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果
原创作者:恋猫de小郭 相信大家都已经听说过,明年的 Harmony Next 版本将正式剥离 AOSP 支持 ,基于这个话题我已经做过一期问题汇总 ,当时在 现有 App 如何兼容 Harmony Next 问题上提到过: 华为内部也主导适配目前的主…...
k8s 之7大CNI 网络插件
一、介绍 网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性。因此,业界已有不少不同的网络方案,来满足特定的环境和要求。 CNI意为容器网络…...
stable diffusion 人物高级提示词(一)头部篇
一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾,一定不要和 long hair一起使用,会冲突Pigtails2条辫子-Braid辫子只写braid也会生…...
限制哪些IP能连接postgre
打开C:\Program Files\PostgreSQL\9.4\data\pg_hba.conf 以下代表本机能连,172.16.73.xx都能连(/24就代表最后一位是0-255),如果是172.16.73.11/32那就是限制了172.16.73.11才能连(实际我设置/32是无效的)&…...
可狱可囚的爬虫系列课程 08:新闻数据爬取实战
前言 本篇文章中我带大家针对前面所学 Requests 和 BeautifulSoup4 进行一个实操检验。 相信大家平时或多或少都有看新闻的习惯,那么我们今天所要爬取的网站便是新闻类型的:中国新闻网,我们先来使用爬虫爬取一些具有明显规则或规律的信息&am…...
mysql2pgsql
使用pgloader进行迁移 pgloader是一个强大的数据迁移工具,专为将不同数据库之间的数据迁移到PostgreSQL而设计。它支持从MySQL到PostgreSQL的迁移,并提供了一种简单且灵活的方式来转移数据。 安装pgloader 使用pgloader迁移数据 1、命令行方式 2、脚…...
设计模式-流接口模式
设计模式专栏 模式介绍模式特点应用场景流接口模式和工厂模式的区别代码示例Java实现流接口模式Python实现流接口模式 流接口模式在spring中的应用 模式介绍 流接口模式是一种面向对象的编程模式,它可以使代码更具可读性和流畅性。流接口模式的核心思想是采用链式调…...
Java 堆与栈的作用与区别
栈是运行时的单位,而堆是存储的单位,栈解决程序的运行问题,堆解决数据存储的问题。 一个线程对应一个线程栈,栈是运行单位,里面存储的信息都是跟当前线程相关的信息,包括局部变量、程序运行状态、方法返回…...
再谈小米汽车
文章目录 1. 外观2. 电机3. 电池4. 风阻5. 强度6. 智能驾驶 我在两年前分析过小米造车的形势,大家可以 点击这里查看。今天小米官宣传了新汽车。看一下它公布的主要信息: 1. 外观 汽车外观是向保时捷致敬,因此它的外观特别像保时捷。不过外…...
Power Apps 学习笔记 - IOrganizationService Interface
文章目录 1. IOrganization Interface1.1 基本介绍1.2 方法分析 2. Entity对象2.1 Constructor2.2 Properties2.3 Methods 3. 相关方法3.1 单行查询 Retrive3.2 多行查询 RetriveMultiple3.3 增加 Create3.4 删除 Delete3.5 修改 Update 4. 数据查询的不同实现方式4.1 QueryExp…...
常见函数的4种类型(js的问题)
• 匿名函数 • 回调函数 • 递归函数 • 构造函数 1、匿名函数 定义时候没有任何变量引用的函数 匿名函数自调:函数只执行一次 (function(a, b){console.log(a b);} )(1, 2);// 等价于 function foo (a, b){console.log(a b); }foo(1, …...
DNS主从服务器、转发(缓存)服务器
一、主从服务器 1、基本含义 DNS辅助服务器是一种容错设计,考虑的是一旦DNS主服务器出现故障或因负载太重无法及时响应客户机请求,辅助服务器将挺身而出为主服务器排忧解难。辅助服务器的区域数据都是从主服务器复制而来,因此辅助服务器的数…...
第二十一章 网络编程
第二十一章 网络编程 1.网络相关概念2.IP地址3.域名与端口4.网络协议5.TCP与UDP6.InetAddress7.Socket8.TCP字节流编程19.TCP字节流编程210.TCP字节流编程311.网络上传文件112.网络上传文件213.网络上传文件314.Netstat15.TCP连接秘密16.UPD原理17.UPD网络编程118.UDP网络编程2…...
scratch新跳7游戏 2023年12月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析
目录 scratch新跳7游戏 一、题目要求 1、准备工作 2、功能实现 二、案例分析...
三、C#面向对象编程(接口与实现)
在C#中,接口是一种定义方法但不包含实现的方式,可以被多个类实现以支持不同的行为。通过接口,我们可以定义一组标准的成员,让类遵循特定的契约。 下面是一个关于接口和实现的简单示例: // 定义一个接口 public inter…...
【java爬虫】股票数据获取工具前后端代码
前面我们有好多文章都是在介绍股票数据获取工具,这是一个前后端分离项目 后端技术栈:springboot,sqlite,jdbcTemplate,okhttp 前端技术栈:vue,element-plus,echarts,ax…...
Scikit-Learn线性回归(四)
Scikit-Learn线性回归四:梯度下降 1、梯度下降1.1、梯度下降概述1.2、梯度下降及原理1.3、梯度下降的实现2、梯度下降法求解线性回归的最优解2.1、梯度下降法求解的原理2.2、梯度下降法求解线性回归的最优解2.3、梯度下降法求解线性回归案例(波士顿房价预测)3、Scikit-Learn…...
SCT2330C——3.8V-28V输入,3A,低EMI,超低功耗同步降压DCDC转换器
描述: SCT2330C是3A同步buck变换器,输入电压范围高达28V,完全集成了80mΩ高压侧MOSFET和42mΩ低压侧MOSFET,提供高效降压DC-DC转换。SCT2330C采用峰值电流模式控制,集成补偿网络,通过最小化片外元件数量&a…...
php生成唯一ID的5种方法介绍
php生成唯一ID的5种方法介绍 工作中使用到唯一ID的场景非常多,如临时缓存文件、临时变量、临时安全码等。 uniqid()函数基于以微妙计的当前时间,生成一个唯一的ID。由于生成唯一ID与微妙时间关联,因此生成ID的唯一性非常可靠。 生成的唯一…...
向日葵远程工具安装Mysql的安装与配置
目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
