介紹)
1. 概述Flutter OHOS 的本質(zhì)不是重新設(shè)計(jì)一套 Flutter 框架而是在保留 Flutter Framework 與 Engine Core 主體能力的前提下補(bǔ)齊 OpenHarmony 平臺(tái)的宿主、渲染、輸入、資源、生命周期和無(wú)障礙適配層。從代碼歸屬上看Flutter OHOS 主要由三部分組成Flutter 應(yīng)用與 Framework開(kāi)發(fā)者 Dart 業(yè)務(wù)代碼以及 Flutter 上層框架能力。Flutter Engine 通用核心Shell、Rasterizer、RuntimeController、Dart VM、Platform Channel等平臺(tái)無(wú)關(guān)實(shí)現(xiàn)。OpenHarmony 適配層ArkTS Embedding、NAPI 橋接和 Native Embedder共同把 Flutter 運(yùn)行時(shí)接入 OpenHarmony 的UIAbility、WindowStage、XComponent、OH_NativeWindow、OH_NativeVSync、ResourceManager、無(wú)障礙服務(wù)等系統(tǒng)能力。OHOS 適配層主要集中在兩個(gè)目錄ArkTS Embeddingengine/src/flutter/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/Native Embedderengine/src/flutter/shell/platform/ohos/因此Flutter OHOS 的架構(gòu)可以理解為一套“ArkTS 宿主層 NAPI 橋接層 C Embedder 層”的平臺(tái)實(shí)現(xiàn)它向上承接 Flutter Engine向下對(duì)接 OpenHarmony 系統(tǒng)能力。2. 整體架構(gòu)2.1 分層視圖2.1.1 靜態(tài)分層圖flowchart TB subgraph L1[L1 Flutter 應(yīng)用層] DartApp[Dart Application] Framework[Flutter Framework] end subgraph L2[L2 Flutter Engine Core] EngineCore[Shell / RuntimeController / Animator / Rasterizer / Dart VM] end subgraph L3[L3 OpenHarmony Embedding] subgraph ArkTS[ArkTS Embedding] ArkTSHost[FlutterAbilityAndEntryDelegate / FlutterEngine / FlutterView] end subgraph Bridge[NAPI Bridge] NapiBridge[FlutterNapi / PlatformViewOHOSNapi] end subgraph Native[Native Embedder (C)] NativeEmbedder[OhosMain / OHOSShellHolder / PlatformViewOHOS / OHOSSurface / VsyncWaiterOHOS] end end subgraph L4[L4 OpenHarmony System] SystemServices[UIAbility / WindowStage / XComponent / NativeWindow / NativeVSync / ResourceManager / Accessibility] end DartApp--Framework Framework--EngineCore EngineCore--ArkTSHost EngineCore--NapiBridge EngineCore--NativeEmbedder ArkTSHost--NapiBridge NapiBridge--NativeEmbedder NativeEmbedder--SystemServicesL1 負(fù)責(zé)業(yè)務(wù)與 Flutter 聲明式 UI。L2 負(fù)責(zé) Dart 運(yùn)行時(shí)、幀調(diào)度和渲染核心。L3 負(fù)責(zé)把 Flutter 的平臺(tái)抽象映射到 OHOS 宿主、窗口、輸入、資源和系統(tǒng)服務(wù)。L4 提供 OpenHarmony 原生能力。2.1.2 關(guān)鍵交互圖flowchartLRsubgraphEngine[Flutter Engine Core]Shell[Shell]Animator[Animator]Rasterizer[Rasterizer]Runtime[RuntimeController] end subgraphEmbedder[OpenHarmony Embedding]PlatformView[PlatformViewOHOS]VSync[VsyncWaiterOHOS]Surface[OHOSSurface / OHOSContext]MessageHandler[PlatformMessageHandlerOHOS / FlutterNapi] end subgraphSystem[OHOS System]NativeVSync[OH_NativeVSync]NativeWindow[OH_NativeWindow / RenderService]Host[UIAbility / WindowStage / XComponent] endShell--|創(chuàng)建并持有平臺(tái)抽象|PlatformViewAnimator--|請(qǐng)求 VSync|VSyncVSync--|注冊(cè)/接收幀時(shí)序|NativeVSyncRasterizer--|創(chuàng)建 Surface / 提交幀|SurfaceSurface--|Present / SwapBuffers|NativeWindowRuntime--|Platform Channel|MessageHandlerMessageHandler--|轉(zhuǎn)發(fā)宿主與插件消息|HostFlutter Engine Core與OpenHarmony Embedding的關(guān)系主要包含四條主線平臺(tái)抽象主線Shell - PlatformViewOHOS幀調(diào)度主線Animator - VsyncWaiterOHOS - OH_NativeVSync渲染提交主線Rasterizer - OHOSSurface/OHOSContext - OH_NativeWindow平臺(tái)消息主線RuntimeController - PlatformMessageHandlerOHOS / FlutterNapi - ArkTS 宿主2.2 按功能劃分Flutter OHOS 也可以按功能拆成五層層次代表實(shí)現(xiàn)主要職責(zé)Flutter 應(yīng)用代碼業(yè)務(wù) Dart 代碼描述頁(yè)面、狀態(tài)、路由和業(yè)務(wù)邏輯Flutter FrameworkWidgets、Rendering、Scheduler、Services構(gòu)建 Widget/Element/RenderObject 樹(shù)驅(qū)動(dòng)布局、繪制與平臺(tái)通道Flutter Engine 通用核心Shell、Dart VM、RuntimeController、Rasterizer承載 Dart 運(yùn)行時(shí)、幀調(diào)度、場(chǎng)景構(gòu)建與渲染提交OpenHarmony 適配代碼ArkTS Embedding NAPI Native Embedder對(duì)接 Ability、XComponent、輸入、紋理、VSync、無(wú)障礙、資源和系統(tǒng)通道OpenHarmony OS 能力UIAbility、WindowStage、OH_NativeWindow、OH_NativeVSync、ResourceManager提供窗口、圖形緩沖、顯示時(shí)序、資源和系統(tǒng)服務(wù)這里最關(guān)鍵的結(jié)論是Flutter OHOS 的平臺(tái)差異主要集中在第四層Flutter Framework 和 Engine Core 主體仍然遵循上游 Flutter 的分層設(shè)計(jì)。3. 核心對(duì)象與職責(zé)3.1 ArkTS Embedding核心對(duì)象位置職責(zé)FlutterAbilityAndEntryDelegateembedding/ohos/FlutterAbilityAndEntryDelegate.ets串聯(lián) Ability 生命周期、引擎創(chuàng)建、視圖創(chuàng)建、首輪 Dart 啟動(dòng)和頁(yè)面顯示/隱藏FlutterEngineGroupembedding/engine/FlutterEngineGroup.ets管理首引擎創(chuàng)建與后續(xù)spawn復(fù)用 VM 和共享資源FlutterEngineembedding/engine/FlutterEngine.ets封裝DartExecutor、系統(tǒng)通道、插件注冊(cè)、FlutterRenderer、PlatformViewsControllerFlutterViewview/FlutterView.etsArkTS 視圖容器負(fù)責(zé)XComponent綁定、Viewport 同步、鍵鼠輸入、首幀監(jiān)聽(tīng)、系統(tǒng)避讓區(qū)同步FlutterRendererembedding/engine/renderer/FlutterRenderer.ets紋理注冊(cè)與外部紋理管理入口PlatformViewsControllerplugin/platform/PlatformViewsController.ets管理 ArkTS 原生視圖嵌入、紋理模式與混合布局3.2 NAPI 橋接層核心對(duì)象位置職責(zé)FlutterNapiembedding/engine/FlutterNapi.etsArkTS 對(duì) Native 的總?cè)肟谪?fù)責(zé)初始化、attach、spawn、平臺(tái)消息、viewport、紋理、無(wú)障礙和XComponent綁定PlatformViewOHOSNapinapi/platform_view_ohos_napi.cppC NAPI 導(dǎo)出層接收 ArkTS 調(diào)用并轉(zhuǎn)發(fā)給OHOSShellHolder/PlatformViewOHOS3.3 Native Embedder核心對(duì)象位置職責(zé)OhosMainohos_main.cpp解析 Shell Args生成Settings選擇渲染后端完成引擎全局初始化OHOSShellHolderohos_shell_holder.cpp創(chuàng)建ThreadHost、Shell、PlatformViewOHOS、注冊(cè)圖像解碼器管理引擎生命周期PlatformViewOHOSplatform_view_ohos.cpp平臺(tái)適配核心負(fù)責(zé) Surface、Viewport、Platform Message、紋理、輸入、生命周期和無(wú)障礙橋接X(jué)ComponentAdapter/XComponentBaseohos_xcomponent_adapter.cpp管理多個(gè)XComponent實(shí)例及其 Surface/輸入/無(wú)障礙回調(diào)VsyncWaiterOHOSvsync_waiter_ohos.cpp對(duì)接OH_NativeVSync驅(qū)動(dòng) Flutter 幀調(diào)度并接入刷新率投票O(jiān)HOSSurface/OHOSContextsurface/*、context/*管理圖形上下文、窗口表面、Swapchain / EGLSurface 與 GPU SurfaceOHOSAssetProviderohos_asset_provider.cpp從 HAP 原始資源中提供 Flutter 資產(chǎn)SemanticsBridgeaccessibility/ohos_semantics_bridge.cpp維護(hù) Flutter 語(yǔ)義樹(shù)與 OpenHarmony 無(wú)障礙事件之間的映射4. 線程模型Flutter OHOS 沿用了 Flutter 的多線程運(yùn)行時(shí)模型但又疊加了 ArkTS 主線程和 OpenHarmony 系統(tǒng)線程約束。4.1 線程組成線程主要來(lái)源核心職責(zé)ArkTS 主線程O(píng)penHarmony 應(yīng)用主線程UIAbility、WindowStage、FlutterView、ArkTS 插件、窗口事件、系統(tǒng)回調(diào)Platform Thread當(dāng)前平臺(tái)消息循環(huán)NAPI 回調(diào)落點(diǎn)、平臺(tái)消息分發(fā)、部分宿主邏輯協(xié)同UI ThreadOHOSShellHolder創(chuàng)建Dart Isolate 調(diào)度、動(dòng)畫(huà)幀生產(chǎn)、Framework Build/Layout/PaintRaster ThreadOHOSShellHolder創(chuàng)建GPU Surface 創(chuàng)建、場(chǎng)景柵格化、SwapBuffers / PresentIO ThreadOHOSShellHolder創(chuàng)建資源加載、圖片解碼、部分 VSync 投票和后臺(tái)任務(wù)4.2 OHOS 線程適配特點(diǎn)OHOSShellHolder會(huì)顯式創(chuàng)建ThreadHost至少包含 Raster 和 IO 線程當(dāng)未啟用merged_platform_ui_thread時(shí)還會(huì)單獨(dú)創(chuàng)建 UI 線程。OHOS 版本為 UI 線程和 Raster 線程設(shè)置了更高 QoS優(yōu)先級(jí)分別映射到QOS_USER_INTERACTIVE以保證首幀和交互流暢度。VsyncWaiterOHOS在 UI 線程上注冊(cè)O(shè)H_NativeVSync_RequestFrameWithMultiCallbackVSync 回調(diào)到來(lái)后再喚醒 Flutter UI 幀流程。ArkTS 主線程并不直接承擔(dān) Flutter 引擎渲染任務(wù)它主要負(fù)責(zé)宿主 UI、生命周期和系統(tǒng)事件收集然后經(jīng)由 NAPI 進(jìn)入 Flutter 運(yùn)行時(shí)。4.3 線程模型Flutter OHOS 更接近 Flutter 原生 Embedder 設(shè)計(jì)核心是Platform / UI / Raster / IO。這意味著 Flutter 的布局、繪制和柵格化天然分層。5. 啟動(dòng)流程Flutter OHOS 的啟動(dòng)可以拆成四個(gè)階段。5.1 階段一Loader 與引擎全局初始化ArkTS 側(cè)通過(guò)FlutterInjector獲取FlutterLoader和FlutterNapi。FlutterLoader.startInitialization()加載FlutterApplicationInfo預(yù)取默認(rèn)字體并在 Debug 模式下把kernel_blob.bin、VM snapshot、isolate snapshot 從 HAP 復(fù)制到應(yīng)用私有目錄。FlutterLoader.ensureInitializationComplete()組裝 Shell Args例如 ICU、資源緩存、Impeller 開(kāi)關(guān)、AOT/JIT 資源路徑等。FlutterNapi.init()進(jìn)入 Native調(diào)用OhosMain::NativeInit()生成 FlutterSettings并確定 OHOS 側(cè)渲染后端軟件渲染kSoftwareSkia OpenGL ESkOpenGLESImpeller VulkankImpellerVulkan5.2 階段二FlutterEngine 創(chuàng)建或復(fù)用FlutterAbilityAndEntryDelegate.setupFlutterEngine()決定使用緩存引擎、自定義引擎、緩存FlutterEngineGroup還是新建引擎組。首個(gè)引擎通過(guò)FlutterEngineGroup.createAndRunEngineByOptions()創(chuàng)建FlutterEngine初始化DartExecutor、Renderer、系統(tǒng)通道、插件注冊(cè)器。FlutterNapi.attachToNative()調(diào)用 Nativeattach。Native 側(cè)創(chuàng)建OHOSShellHolder、Shell和PlatformViewOHOS。后續(xù)引擎通過(guò)spawn()創(chuàng)建共享 VM 和部分底層資源但擁有獨(dú)立 Dart Isolate。5.3 階段三FlutterView 與 XComponent 綁定FlutterAbilityAndEntryDelegate.createView()創(chuàng)建FlutterView。FlutterView.attachToFlutterEngine()把 viewId 綁定到FlutterEngine。FlutterNapi.xComponentAttachFlutterEngine()進(jìn)入 Native由XComponentAdapter將XComponent與具體shellHolderId建立關(guān)聯(lián)。當(dāng)XComponent的OnSurfaceCreated回調(diào)觸發(fā)時(shí)Native 會(huì)拿到OH_NativeWindow并調(diào)用PlatformViewOHOS::NotifyCreate()。PlatformViewOHOS在 Raster 線程上把OH_NativeWindow交給OHOSSurface完成 onscreen surface 或 swapchain 的建立。5.4 階段四首幀調(diào)度與顯示Shell通過(guò)VsyncWaiterOHOS::AwaitVSync()等待OH_NativeVSync。VSync 到來(lái)后UI 線程驅(qū)動(dòng) Flutter Framework 完成 Build/Layout/Paint生成 LayerTree/DisplayList。Raster 線程調(diào)用CreateRenderingSurface()由OHOSSurface創(chuàng)建 GPU Surface 并提交渲染。最終圖像通過(guò)OH_NativeWindow提交給RenderService。首幀完成后Native 通過(guò)FlutterNapi.onFirstFrame()回調(diào) ArkTS再由FlutterView.onFirstFrame()通知宿主。6. 渲染架構(gòu)6.1 渲染后端選擇Flutter OHOS 當(dāng)前支持三種渲染模式軟件渲染兜底路徑主要用于特殊場(chǎng)景。Skia OpenGL ES傳統(tǒng) GPU 路徑。Impeller VulkanOHOS 的重點(diǎn)優(yōu)化路徑當(dāng)前也是默認(rèn)高性能路徑。PlatformViewOHOS在創(chuàng)建時(shí)會(huì)根據(jù)Settings.ohos_rendering_api構(gòu)造對(duì)應(yīng)的OHOSContext與OHOSSurfaceOhosContextGLSkiaOhosSurfaceGLSkiaOHOSContextVulkanImpellerOHOSSurfaceVulkanImpellerOHOSSurfaceSoftware6.2 渲染提交鏈路sequenceDiagramautonumber participantArkTSasFlutterViewparticipantNAPIasFlutterNapiparticipantPVasPlatformViewOHOSparticipantVSyncasVsyncWaiterOHOSparticipantUIasUIThreadparticipantRasterasRasterThreadparticipantSurfaceasOHOSSurfaceparticipantWindowasOH_NativeWindowparticipantRSasRenderServiceArkTS-NAPI: setViewportMetrics / updateSize / updateDensityNAPI-PV: nativeSetViewportMetricsUI-VSync:AwaitVSync()VSync--UI: frame_time / target_timeUI-UI:Build/Layout/PaintUI-Raster: submitLayerTreeRaster-PV:CreateRenderingSurface()PV-Surface:CreateGPUSurface()Raster-Surface:Draw/SubmitSurface-Window:SwapBuffers/PresentWindow-RS: queueBuffer6.3 OHOS 渲染適配特點(diǎn)FlutterView會(huì)持續(xù)同步顯示尺寸、像素密度、折疊屏特征、系統(tǒng)避讓區(qū)、鍵盤(pán)區(qū)域和手勢(shì)區(qū)域統(tǒng)一匯總為 ViewportMetrics。PlatformViewOHOS會(huì)緩存native_window支持 surface rebuild 和窗口變化后的上下文重建。OHOSSurfaceVulkanImpeller支持預(yù)熱GPUSurface減少首幀前創(chuàng)建 Vulkan surface / swapchain 的冷啟動(dòng)成本。VsyncWaiterOHOS集成了刷新率感知與投票機(jī)制可與 LTPO 動(dòng)態(tài)刷新率協(xié)同。7. 通信機(jī)制Flutter OHOS 存在兩條核心通信鏈路。7.1 Dart 與 ArkTS/Native 的平臺(tái)消息鏈路Dart Platform Channel - Engine PlatformMessage - PlatformMessageHandlerOHOS - FlutterNapi / ArkTS handler - ArkTS plugin orsystemservice反向鏈路則由 ArkTS 調(diào)用FlutterNapi.dispatchPlatformMessage()或dispatchEmptyPlatformMessage()經(jīng)PlatformViewOHOSNapi轉(zhuǎn)發(fā)到PlatformViewOHOS::DispatchPlatformMessage()再送回 Dart。7.2 系統(tǒng)通道與宿主通道FlutterEngine初始化時(shí)會(huì)創(chuàng)建一組系統(tǒng)通道包括LifecycleChannelNavigationChannelTextInputChannelPlatformChannelSystemChannelLocalizationChannelAccessibilityChannelSettingsChannelDisplayMetricsChannelNativeVsyncChannel這使得 OHOS 宿主可以把生命周期、路由、鍵盤(pán)、系統(tǒng)設(shè)置、刷新率、本地化和無(wú)障礙能力注入 Flutter Framework。8. 輸入、平臺(tái)視圖與紋理8.1 輸入事件輸入鏈路以XComponent為源頭OH_NativeXComponent callback - XComponentBase - OhosTouchProcessor - PointerDataPacket - PlatformViewOHOS - Flutter Engine具體包括觸摸事件轉(zhuǎn)換為 FlutterPointerDataPacket鼠標(biāo)事件支持按鍵、移動(dòng)、離開(kāi)、滾輪軸事件API 15 使用原生軸事件處理滾動(dòng)鍵盤(pán)事件ArkTS 側(cè)由KeyboardManager、TextInputPlugin和系統(tǒng)通道協(xié)同處理OhosTouchProcessor還對(duì) OpenHarmony 某些重復(fù) down/up 事件做了過(guò)濾避免多指場(chǎng)景下手勢(shì)狀態(tài)異常。8.2 平臺(tái)視圖Flutter OHOS 的平臺(tái)視圖能力由 ArkTS 側(cè)PlatformViewsController主導(dǎo)實(shí)現(xiàn)方式更偏向“ArkUI 視圖編排 Flutter 紋理/布局協(xié)同”。它負(fù)責(zé)創(chuàng)建和銷毀平臺(tái)視圖管理平臺(tái)視圖尺寸與偏移維護(hù)PlatformViewWrapper通過(guò)TextureRegistry/FlutterRenderer對(duì)接紋理模式把 ArkTS 原生節(jié)點(diǎn)掛入 Flutter 頁(yè)面組合結(jié)果中8.3 外接紋理Native 側(cè)通過(guò)OHOSExternalTexture統(tǒng)一外部紋理抽象并按后端拆分為OHOSExternalTextureGLOHOSExternalTextureVulkan典型場(chǎng)景包括視頻、相機(jī)、PixelMap 和 NativeImage。ArkTS 側(cè)通過(guò)FlutterRenderer注冊(cè)紋理Native 側(cè)則負(fù)責(zé)創(chuàng)建生產(chǎn)者窗口、接收幀可用回調(diào)并驅(qū)動(dòng) Flutter 重繪。9. 生命周期、資源與無(wú)障礙9.1 生命周期同步ArkTS 側(cè)FlutterAbilityAndEntryDelegate會(huì)根據(jù)onShow、onHide、onPaused、onResumed、窗口焦點(diǎn)變化等事件通過(guò)LifecycleChannel向 Flutter 下發(fā)生命周期狀態(tài)。Native 側(cè)PlatformViewOHOS會(huì)監(jiān)聽(tīng)flutter/lifecycle平臺(tái)消息并執(zhí)行本地 GPU 資源回收策略。9.2 資源管理Flutter OHOS 的資源策略主要體現(xiàn)在三點(diǎn)OHOSAssetProvider直接從 HAP 的 raw assets 中提供 Flutter 資源。OHOSImageGenerator接入 OpenHarmony 圖像解碼能力優(yōu)先使用系統(tǒng)硬解碼路徑。PlatformViewOHOS在生命周期切換時(shí)支持 GPU reclaim前臺(tái)恢復(fù)kRestore后臺(tái)/隱藏/分離kAggressive這套策略的目標(biāo)是降低后臺(tái) DMA buffer、紋理和 onscreen context 占用同時(shí)在恢復(fù)前臺(tái)時(shí)盡快重建渲染面。9.3 無(wú)障礙OHOS 無(wú)障礙鏈路由 ArkTS 與 Native 協(xié)同完成ArkTS 側(cè)監(jiān)聽(tīng)系統(tǒng)無(wú)障礙開(kāi)關(guān)變化并通過(guò)FlutterNapi.accessibilityStateChange()下發(fā)Native 側(cè)SemanticsBridge維護(hù) Flutter 語(yǔ)義樹(shù)XComponentBase負(fù)責(zé)注冊(cè)ArkUI_AccessibilityProviderAPI 15 場(chǎng)景下MultiInstanceXCompAccessibility支持多XComponent實(shí)例的無(wú)障礙處理因此Flutter Framework 生成的語(yǔ)義節(jié)點(diǎn)可以映射為 OpenHarmony 可識(shí)別的無(wú)障礙節(jié)點(diǎn)與事件。10. 多引擎與架構(gòu)特征總結(jié)Flutter OHOS 的幾個(gè)關(guān)鍵架構(gòu)特征如下適配層邊界清晰。Flutter Framework 和 Engine Core 基本保持通用實(shí)現(xiàn)OHOS 差異集中在 ArkTS Embedding、NAPI 和 Native Embedder。宿主模型貼合 OpenHarmony。以UIAbility WindowStage XComponent作為宿主容器而不是照搬 Android Activity/View 模型。渲染鏈路明確。FlutterView負(fù)責(zé)宿主側(cè)窗口與 viewport同步進(jìn)入PlatformViewOHOS后由OHOSSurface和OHOSContext完成 GPU 提交。多引擎能力完整。FlutterEngineGroup、spawn()、preDraw()和預(yù)熱機(jī)制使多頁(yè)面、多實(shí)例場(chǎng)景具備較好的擴(kuò)展性。平臺(tái)能力融合較深。輸入、刷新率投票、外部紋理、折疊屏特征、系統(tǒng)避讓區(qū)和無(wú)障礙都已納入平臺(tái)實(shí)現(xiàn)。綜合來(lái)看Flutter OHOS 并不是簡(jiǎn)單把 Flutter 跑在鴻蒙上而是實(shí)現(xiàn)了一套符合 OpenHarmony 應(yīng)用模型和系統(tǒng)能力邊界的 Flutter Embedder 體系。這套體系向上保持 Flutter 的開(kāi)發(fā)范式不變向下則通過(guò) ArkTS 與 Native 雙層適配完成對(duì) OpenHarmony 圖形、輸入、資源和系統(tǒng)服務(wù)的深度接入。