Flutter 鸿蒙 3.44 版本重磅功能HCPP介绍

16 阅读3分钟

根据CPF-Flutter社区的规划,下一个Flutter 鸿蒙大版本3.44预期会在9月份前后正式发布,详细看了下对应的分支,可以发现本次最大的特性之一是HCPP,今天要给大家介绍的就是这个特性,给大家尝个鲜~

image.png

一、HCPP 是什么?

HCPP(Hybrid Composition++)是鸿蒙上 Platform View 混合合成 能力,对标的是 Android的HCPP。这个功能的主要原理是把原生视图作为系统合成层(RENDER_TYPE_DISPLAY)叠在 Flutter 内容之上,由 ArkUI RenderService 完成最终合成。

二、HCPP解决什么问题

上游Flutter 3.44 在 Android 侧引入的HCPP,是把图层合成任务委托给操作系统,利用 Vulkan 的底层访问能力,通过硬件缓冲区交换链和 SurfaceControl 事务同步 Flutter UI 与原生视图,换来高性能滚动和精准的触控输入。

Flutter鸿蒙 3.44 对标了上游,把原生内容绕过 Flutter 渲染管线,由 ArkUI 的 RenderService 直接合成输出。因为其优秀的原生渲染能力,所以在Web、地图、视频等类似这类与 Flutter 控件交叉遮挡多、圆角和透明度要求高的场景,HCPP功能会被大量应用,也是HCPP的主战场!

二、HCPP的工作机制

HCPP的架构分为了三层,各层职责如下:

职责
Dart(Framework)平台视图创建经 platform_views.dart 发往嵌入层;SurfaceOhosViewController 是 HCPP 在框架层的入口和路由枢纽,对应 Android 上的 SurfaceAndroidViewController
Engine(C++)开关开启且 GPU 渲染可用时创建 OHOSExternalViewEmbedder;每帧负责背景洞穿与 overlay 切片,经 NAPI 把几何、mutator、overlay rect 下发 ArkTS;overlay surface 的 NativeWindow 由 overlay 的 XComponent 注册进来
ArkTSPlatformViewsController2 用 RENDER_TYPE_DISPLAY 托管原生视图;FlutterPage 按「背景 XComponent → DISPLAY → overlay XComponent → 局部 Block」叠层;DynamicView 承接裁剪、旋转、缩放、透明度

和 Android对比:整体架构基本保持一致,差别在层的载体:Android 的层是 SurfaceControl,鸿蒙的层是 DISPLAY 节点加 XComponent。

image.png

三、怎么开启

HCPP 默认是关闭的,不开启的时候行为与原先保持一致。开启后走系统合成,两条路可以二选一:

方式操作适用
命令行flutter run --enable-hcpp开发调试。工具链在构建期把开关写进 buildinfo.json5
手动配置在 buildinfo.json5 里把 enable_ohos_hybrid_composition 写成 "true"正式包长期开启,与 Impeller 开关同一文件

配置文件位置:ohos/entry/src/main/resources/rawfile/buildinfo.json5,部分工程在 resources/base/profile/ 下,写法:

{
  "string": [
    // Impeller 开关,同文件相邻
    { "name": "enable_impeller", "value": "true" },
    { "name": "enable_ohos_hybrid_composition", "value": "true" }
  ]

同一个开关在三层有三个名字,排查时对得上:

名称
CLI--enable-hcpp
buildinfoenable_ohos_hybrid_composition
引擎 Settings / shellArgs--enable-ohos-hybrid-composition

注意点:第一,开关写在构建产物资源里,改完必须重新 build,hot restart 不会刷新 buildinfo.json5。第二,不带 --enable-hcpp 跑 flutter run 时,工具可能把该键写回 false,覆盖手动配置。

最后,这个功能依赖GPU:所以模拟器就不要尝试了。

四、Dart 侧怎么接入

PlatformViewLink 是自定义平台视图 Widget 的通用脚手架:分配 viewId、创建控制器、挂载 OhosViewSurface,并衔接布局、手势、焦点与生命周期。鸿蒙上通过 onCreatePlatformView 选择创建模式,共三种:

模式init API行为
textureinitOhosView固定走 TLHC 纹理,开关开了也不切系统合成
surfaceFallback(推荐)initSurfaceOhosView优先纹理;HCPP 开启且 GPU 可用时,自动回落到 HCPP
expensiveHybridinitExpensiveOhosView强制 HCPP,必须先开开关,否则创建失败

这边推荐使用surfaceFallback。接入代码的骨架如下,重点看 onCreatePlatformView 里调的是哪个 init:

PlatformViewLink(
  viewType: viewType,
  surfaceFactory: (context, controller) {
    return OhosViewSurface(
      controller: controller as OhosViewController,
      // 手势、命中行为按需配置
    );
  },
  onCreatePlatformView: (params) {
    // 关键就这一行:纹理优先,HCPP 可用时自动回落
    return PlatformViewsService.initSurfaceOhosView(
      id: params.id,
      viewType: viewType,
      // 方向、creationParams 等参数按需传入
    )..create();
  },

功能就介绍到这了,心动不如行动,可以自己去试一下~

小伙伴们记得点赞+关注

关注 CPF-Flutter 社区

“AI再牛,技术不能丢”