根据CPF-Flutter社区的规划,下一个Flutter 鸿蒙大版本3.44预期会在9月份前后正式发布,详细看了下对应的分支,可以发现本次最大的特性之一是HCPP,今天要给大家介绍的就是这个特性,给大家尝个鲜~
一、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 注册进来 |
| ArkTS | PlatformViewsController2 用 RENDER_TYPE_DISPLAY 托管原生视图;FlutterPage 按「背景 XComponent → DISPLAY → overlay XComponent → 局部 Block」叠层;DynamicView 承接裁剪、旋转、缩放、透明度 |
和 Android对比:整体架构基本保持一致,差别在层的载体:Android 的层是 SurfaceControl,鸿蒙的层是 DISPLAY 节点加 XComponent。
三、怎么开启
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 |
| buildinfo | enable_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 | 行为 |
|---|---|---|
| texture | initOhosView | 固定走 TLHC 纹理,开关开了也不切系统合成 |
| surfaceFallback(推荐) | initSurfaceOhosView | 优先纹理;HCPP 开启且 GPU 可用时,自动回落到 HCPP |
| expensiveHybrid | initExpensiveOhosView | 强制 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再牛,技术不能丢”