原創(chuàng)作者:戀貓de小郭
相信大家都已經(jīng)聽(tīng)說(shuō)過(guò)甚带,明年的 Harmony Next 版本將正式剝離 AOSP 支持 ,基于這個(gè)話(huà)題我已經(jīng)做過(guò)一期問(wèn)題匯總 佳头,當(dāng)時(shí)在 現(xiàn)有 App 如何兼容 Harmony Next 問(wèn)題上提到過(guò):
華為內(nèi)部也主導(dǎo)適配目前的主流跨平臺(tái)方案鹰贵,主動(dòng)提供反向適配支持,估計(jì)后面就會(huì)有類(lèi)似 Flutter for harmony 的社區(qū)支持畜晰。
沒(méi)想到 HDC 大會(huì)才剛過(guò)去一個(gè)多月砾莱,就有網(wǎng)友提醒,針對(duì) OpenHarmony 的 Flutter 版本已經(jīng)開(kāi)源:gitee.com/openharmony…
凄鼻,這既讓人驚喜又是「情理之中」腊瑟,因?yàn)樵诒姸嗫蚣芾铮琀armony 和 Flutter 之間的聯(lián)系可以說(shuō)是最密不可分块蚌。
關(guān)系
為什么說(shuō) Harmony 和 Flutter 之間的聯(lián)系很密切闰非?因?yàn)椴还苁?ArkUI 還是 ArkUI-X ,它們的底層支持里都或多或少存在 Flutter 的身影峭范。
例如 ArkUI 的 framework arkui\_ace\_engine
财松,里面就可以看到很多熟悉的 Flutter 代碼,不過(guò)這里面有點(diǎn)特殊在于纱控,這些代碼都是用 C++ 實(shí)現(xiàn)的辆毡,例如下圖中的 Stack
的控件。
另外甜害,除了 ArkUI 華為還開(kāi)源了 ArkUI-X
舶掖,ArkUI-X 擴(kuò)展了 ArkUI 框架讓其支持跨平臺(tái)開(kāi)發(fā),而這部分跨平臺(tái)的底層邏輯尔店,同樣來(lái)自 Flutter 和 Skia 的支持眨攘。
與 Flutter 不同的是主慰,OpenHarmony 上層開(kāi)發(fā)用的是 ArkTS 和 ArkUI,調(diào)用走的是 NAPI(Native API)鲫售,NAPI 是一套基于 Node.js 規(guī)范開(kāi)發(fā)的原生模塊擴(kuò)展開(kāi)發(fā)框架共螺。
NAPI 可以實(shí)現(xiàn) JS 與 C/C++ 代碼之間相互訪(fǎng)問(wèn),也就是 ArkTS 可以直接和 C/C++ 無(wú)縫調(diào)用情竹,類(lèi)似 dart ffi 效果藐不。
舉個(gè)例子,例如通過(guò) ArkUI-X 里的 getDefaultDisplaySync
獲取設(shè)備屏幕信息鲤妥, 對(duì)于 Android 系統(tǒng)而言佳吞, ets 下的代碼通過(guò) napi 會(huì)調(diào)用到 C++ 層的 DisplayInfo 對(duì)象,從而再通過(guò) jni 調(diào)用 java 下的 DisplayInfo 對(duì)象棉安。
var dsp = display.getDefaultDisplaySync();
其實(shí)這一點(diǎn)對(duì)于 Flutter 來(lái)說(shuō)很重要底扳,因?yàn)閷?duì)于 Flutter 兼容 Harmony OS 的支持上, napi 是必不可少的一部分贡耽。
因?yàn)樵?Flutter 里衷模,Dart 除了可以直接和 C/C++ 調(diào)用之外,還支持和 Objective-C/Swift 與 Java/Kotlin 直接調(diào)用而不需要通過(guò) Channel 蒲赂。
- 其中
Objective-C / Swift interop
是通過(guò) package:ffigen :
ffigen:
name: AVFAudio
description: Bindings for AVFAudio.
language: objc
output: 'avf_audio_bindings.dart'
headers:
entry-points:
- '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AVFAudio.framework/Headers/AVAudioPlayer.h'`
-
Java / kotlin
是通過(guò) jnigen 支持調(diào)用阱冶,不過(guò)目前還屬于 experimental 的狀態(tài):
output:
c:
library_name: example
path: src/example/
dart:
path: lib/example.dart
structure: single_file
source_path:
- 'java/'
classes:
- 'dev.dart.Example'`
所以,后續(xù)在 Harmony OS 上滥嘴,就會(huì)有多一個(gè)類(lèi)似 napi gen 支持的需要木蹬。
兼容
本次開(kāi)源支持 OpenHarmony 的 flutter 社區(qū)版本來(lái)自 openharmony-sig
,該組織主要用于孵化 OpenHarmony 相關(guān)開(kāi)源生態(tài)項(xiàng)目若皱。
另外镊叁,在 openharmony 組織下
sig\_crossplatformui
也有 Taro 主導(dǎo)的一些跨平臺(tái)支持計(jì)劃。
OpenHarmony 的 flutter (簡(jiǎn)稱(chēng) OP Flutter )版本目前所用的分支應(yīng)該是 3.7 版本走触,因?yàn)槭莿傞_(kāi)源晦譬,目前 flutter tools 指令僅支持 linux 下使用 ,但是相信后續(xù)跟上節(jié)奏應(yīng)該不成問(wèn)題互广。
以下分析基于 2023-09-18 的部分內(nèi)容敛腌,后續(xù)肯定會(huì)有新的變化,這里主要提供一些思路和方向惫皱。
SIG 社區(qū)適配的主要有 OP flutter
和 OP flutter engine
兩個(gè)項(xiàng)目像樊,根據(jù)目前的提交,OP flutter 目前主要是添加了 flutter tools 對(duì)于構(gòu)建 hap 的支持旅敷,例如:
- 添加環(huán)境檢測(cè)
- 實(shí)現(xiàn) tools 下的自定義的
build_hap.dart
凶硅,還有識(shí)別鴻蒙設(shè)備的支持等。
- 提供 create 時(shí)對(duì)應(yīng)的 ets 模版
而關(guān)于運(yùn)行支持扫皱,主要是通過(guò) OP flutter engine 來(lái)實(shí)現(xiàn)足绅,主要代碼新增在對(duì)應(yīng)的 ohos/
目錄下:
從 OP flutter engine 變更的內(nèi)容上看,主要是從原有 shell/platform/android
下的代碼拷貝一份進(jìn)行調(diào)整韩脑,例如 GL Context 代碼部分目前幾乎太大區(qū)別氢妈。
另外,大家比較關(guān)心的應(yīng)該就是 Impeller 在 OP 上是否支持段多,目前看來(lái) OP Flutter Engine 里對(duì)于 Impeller 有一定預(yù)設(shè)首量,但是并沒(méi)有啟用,因?yàn)?Flutter 官方目前對(duì)于 Android 上的 Impeller 也沒(méi)有正式發(fā)布进苍,所以這個(gè)目前看來(lái)也不需要著急加缘。
關(guān)于字體部分, 目前看來(lái) OP 上 Flutter 默認(rèn)會(huì)使用 sans-serif
觉啊,這個(gè)應(yīng)該是和 鴻蒙上的 HarmonyOS Sans 保持一致拣宏。
關(guān)于刷新率部分,目前暫時(shí)可以看到是默認(rèn)寫(xiě)死了 60hz 杠人,后續(xù)應(yīng)該可以通過(guò) napi 等支持獲取實(shí)際刷新率勋乾,支持動(dòng)態(tài)刷新率這個(gè)大家不用擔(dān)心。
另外嗡善,因?yàn)榘姹締?wèn)題辑莫,目前 OP Flutter Engine 里還保留了 partial repaint 操作,但是其實(shí) Flutter 官方已經(jīng)在 Android 上 Disable 了 partial repaint 罩引,因?yàn)?Android 上的部分重繪存在太多問(wèn)題各吨,所以該功能被直接屏蔽。
Flutter 官方之后打算與 Vulkan Impeller 單獨(dú)適配后再重新開(kāi)放 partial repaint袁铐,這對(duì) OP Flutter Engine 來(lái)說(shuō)也許也是一個(gè)歷史包袱揭蜒,猜測(cè) OP Flutter 后續(xù)會(huì)跟隨 Impeller 同步。
當(dāng)然昭躺,因?yàn)椴煌脚_(tái)忌锯,所以 OP Flutter Engine 也有自己需要單獨(dú)實(shí)現(xiàn)的邏輯,例如數(shù)據(jù)的類(lèi)型轉(zhuǎn)化處理领炫,在 Android 上對(duì)應(yīng)的是 shell/platform/android/platform\_view\_android\_jni\_impl.cc
偶垮, 而在 OP 上對(duì)應(yīng)的就是 shell/platform/ohos/napi/platform\_view\_ohos\_napi.cpp
:
最后,Flutter 適配不只是 embedding 和 tools 的適配帝洪,還有新的 channel 和 plugin 的支持似舵,目前看來(lái) SIG 也在致力與這點(diǎn),一些常用或者知名的 plugin 社區(qū)都會(huì)逐步增加支持葱峡,這看起來(lái)是一個(gè)苦力活砚哗,但是對(duì)于 Harmony 脫離 AOSP 構(gòu)建自己的生態(tài)來(lái)說(shuō),無(wú)疑會(huì)是歷史性的一步砰奕。
最后
通過(guò)本篇蛛芥,相信你應(yīng)該能簡(jiǎn)單理解到 Flutter 和 Harmony 之間的「因果關(guān)系」提鸟,對(duì)于 Flutter 開(kāi)發(fā)來(lái)說(shuō),Harmony Next 會(huì)是一個(gè)相對(duì)較好的新平臺(tái)仅淑。
當(dāng)然称勋,這不代表這你可以不學(xué) ArkTS 和 ArkUI ,因?yàn)椴还苁谴虬鼧?gòu)建或者 napi 都離不開(kāi) Harmony 平臺(tái)本身的支持涯竟,而且在于這樣一個(gè)「百?gòu)U待興」的社區(qū)環(huán)境下赡鲜,完全靠社區(qū)支撐明顯不現(xiàn)實(shí),關(guān)鍵時(shí)刻還得是「自己動(dòng)手」才能「豐衣足食」庐船。