Harmony 開(kāi)始支持 Flutter ,聊聊 Harmony 和 Flutter 之間的因果

原創(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 flutterOP 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)手」才能「豐衣足食」庐船。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末银酬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筐钟,更是在濱河造成了極大的恐慌揩瞪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盗棵,死亡現(xiàn)場(chǎng)離奇詭異壮韭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纹因,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)喷屋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瞭恰,你說(shuō)我怎么就攤上這事屯曹。” “怎么了惊畏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恶耽,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我颜启,道長(zhǎng)偷俭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任缰盏,我火速辦了婚禮涌萤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘口猜。我一直安慰自己负溪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布济炎。 她就那樣靜靜地躺著川抡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪须尚。 梳的紋絲不亂的頭發(fā)上崖堤,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天侍咱,我揣著相機(jī)與錄音,去河邊找鬼密幔。 笑死放坏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的老玛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钧敞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜡豹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起溉苛,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤镜廉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后愚战,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娇唯,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年寂玲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塔插。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拓哟,死狀恐怖想许,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情断序,我是刑警寧澤流纹,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站违诗,受9級(jí)特大地震影響漱凝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诸迟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一茸炒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亮蒋,春花似錦扣典、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至趁怔,卻和暖如春湿硝,著一層夾襖步出監(jiān)牢的瞬間薪前,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工关斜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留示括,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓痢畜,卻偏偏與公主長(zhǎng)得像垛膝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丁稀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容