这题非常“架构级”,我们直接把三条渲染链路并排拆开,看清楚谁画 UI、谁只给画布、谁控制 GPU。
我会按 从你写代码 → 到屏幕亮像素 的顺序讲。
Flutter 不使用 Android RenderThread,RenderThread帮系统把 DisplayList 交给 GPU
Flutter 必须经过 SurfaceFlinger,所有 App、System UI、视频最终都在SurfaceFlinger合成
Flutter 的 Surface 是操作系统提供的“原生窗口缓冲区”,Flutter 把自己画好的帧提交到这个 Surface;“系统合成”就是操作系统(Android 的 SurfaceFlinger / iOS 的 WindowServer)把这个 Surface 和其它系统窗口一起合成并显示
| 平台 | UI 谁决定 | 渲染引擎 | 是否自绘 | 系统参与度 |
|---|---|---|---|---|
| Android 原生 | 系统 | Skia | ❌ | 极高 |
| HarmonyOS | 系统 | ROSEN / ArkUI Renderer | ❌ | 极高 |
| Flutter | Flutter | Impeller / Skia(自带) | ✅ | 很低 |
👉 Flutter 是“应用级引擎”,Android / HarmonyOS 是“系统级 UI”
View / Jetpack Compose
↓
Android UI Toolkit
↓
Canvas / DisplayList
↓
Skia(系统)
↓
OpenGL ES / Vulkan
↓
RenderThread
↓
SurfaceFlinger
↓
屏幕
Android 的 2D 图形核心
负责:
你不能直接控制它
你不是在“画 UI”,你是在“请求系统帮你画 UI”
HarmonyOS 和 Android 理念非常接近,但架构更新。
ArkTS / ArkUI
↓
UI DSL(声明式)
↓
ArkUI Framework
↓
Render Pipeline
↓
ROSEN(图形渲染服务)
↓
OpenGL / Vulkan
↓
Window Manager
↓
屏幕
类似:
声明式 + 响应式
HarmonyOS 的:
角色 ≈ Skia + SurfaceFlinger + WindowManager 的组合
同样是:
系统级 UI 框架 + 系统级渲染服务
和 Android 一样:
这是完全不同的一派。
Flutter Widget
↓
Element / RenderObject
↓
Layer Tree
↓
Flutter Engine
↓
Impeller(或 Skia)
↓
Vulkan / Metal / OpenGL
↓
Surface
↓
系统合成
↓
屏幕
👉 系统只当“窗口管理器”
| 平台 | UI 控制权 |
|---|---|
| Android | 系统 |
| HarmonyOS | 系统 |
| Flutter | Flutter 自己 |
| 平台 | 渲染引擎 |
|---|---|
| Android | 系统 Skia |
| HarmonyOS | 系统 ROSEN |
| Flutter | 应用内(Impeller / Skia) |
| 平台 | GPU 调用 |
|---|---|
| Android | 系统统一调度 |
| HarmonyOS | 系统统一调度 |
| Flutter | 应用直接提交命令 |
🏛️ 政府大楼
你提交申请,
系统决定怎么建、怎么刷漆。
🎮 游戏引擎
你拿到 GPU,
自己画世界。
因为:
👉 像 Unity / Unreal
Android 与 HarmonyOS 都是系统级 UI + 系统级渲染服务(Skia / ROSEN),应用通过高层 API 请求绘制;Flutter 则自带渲染引擎(Impeller/Skia),直接驱动 GPU,自绘 UI,系统只提供 Surface 与合成能力。
如果你愿意,我可以下一步帮你画一张:
你挑一个,我继续。