一、方案简介
在Buildroot构建的嵌入式Linux系统中部署Flutter应用,主流有两套成熟的开源方案,分别适配不同的显示场景与开发需求:
方案一:flutter-elinux(Sony开源方案)
由索尼官方维护的嵌入式Linux Flutter工具链,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多种显示后端,场景适配性更广。
方案二:flutter-pi(轻量级嵌入器)
一款轻量级Flutter引擎宿主程序,仅基于底层DRM/GBM接口实现渲染,无需依赖桌面环境,资源占用更低,更贴合纯嵌入式场景。
二、主流方案对比与架构说明
2.1 flutter-pi与flutter-embedded-linux区别:

2.2 flutter-pi运行时架构:
┌──────────────────────────┐
│FlutterApp(Dart)│→libapp.so(AOT编译译)
├──────────────────────────┤
│libflutter_engine.so│→ 渲染引擎+DartVM
├──────────────────────────┤
│flutter-pi(embedder)│→DRM/GBM直接渲染
├──────────────────────────┤
│Mali-G52GPU+DRM/KMS |
├──────────────────────────┤
│BuildrootLinux(ARM64)│
└──────────────────────────┘
2.3 flutter-pi的渲染管线:
1 Flutter →OpenGLES命令 →libGLESv2.so→Mali-G52GPU→GBMbuffer→DRM→HDMI
三、Buildroot原生Flutter软件包体系
从Buildroot 2024.02版本开始,官方已内置完整的Flutter相关软件包,无需额外移植,只需在defconfig中开启对应配置即可完成编译集成。
软件包目录位于buildroot/package/下,结构如下:
buildroot/package/
├── flutter-engine/ # Flutter 引擎,从源码编译(gclient + GN + ninja)
│ ├── Config.in│
├── flutter-engine.mk│ ├── gen-tarball # gclient 同步源码并打包脚本
│ └── dot-gclient # gclient 配置⽂件
├── flutter-sdk-bin/ # Flutter SDK (宿主⼯具)
│ ├── Config.in.host
│ ├── flutter-sdk-bin.hash
│ └── flutter-sdk-bin.mk
├── flutter-pi/ # ardera 的 DRM-GBM embedder
│ ├── Config.in
│ ├── flutter-pi.hash
│ ├── flutter-pi.mk
│ └── 0001-user_input-touch-Fallback-to-10-slots.patch
├── flutter-embedded-linux/ # Sony 的 Wayland/X11/GBM embedder
│ ├── Config.in
│ ├── flutter-embedded-linux.hash
│ └── flutter-embedded-linux.mk
├── flutter-packages/ # 官⽅⽰例 app
│ ├── Config.in
│ ├── flutter-packages.hash
│ └── flutter-packages.mk
四、flutter-pi适配实操(以RK3568平台为例)
以下基于RK3568 6.1.118 SDK环境演示flutter-pi的适配流程,flutter-embedded-linux的适配逻辑同理,二者按需二选一即可。
注:flutter-pi采用DRM直接渲染,无需依赖Weston桌面环境;选用该方案后可在系统中禁用Weston,进一步降低资源占用。
添加Flutter配置到defconfig:
在配置文件文件:buildroot/configs/rockchip_ok3568_defconfig中新增内容:
Flutter embedder - flutter-pi (DRM-GBM direct rendering)
BR2_PACKAGE_FLUTTER_PI=y
BR2_PACKAGE_FLUTTER_PI_CHARSET_CONVERTER_PLUGIN=y
BR2_PACKAGE_FLUTTER_PI_RAW_KEYBOARD_PLUGIN=y
BR2_PACKAGE_FLUTTER_PI_TEXT_INPUT_PLUGIN=y# Flutter example apps for testing (总共六个⽰例)
BR2_PACKAGE_FLUTTER_PACKAGES=y
BR2_PACKAGE_FLUTTER_ADAPTIVE_SCAFFOLD_EXAMPLE=y
BR2_PACKAGE_FLUTTER_ANIMATIONS_EXAMPLE=y
BR2_PACKAGE_FLUTTER_GO_ROUTER_EXAMPLE=y
BR2_PACKAGE_FLUTTER_IMAGE_EXAMPLE=y
BR2_PACKAGE_FLUTTER_MARKDOWN_EXAMPLE=y
BR2_PACKAGE_FLUTTER_RFW_LOCAL_EXAMPLE=y
各项配置功能说明:

配置完成后,即可按照标准Buildroot编译流程执行构建。
五、编译核心产物说明
Buildroot编译完成后,核心Flutter组件会部署到目标系统的对应路径,详情如下:

六、buildroot编译出的flutter交叉编译工具链
6.1 工具链清单

6.2 交叉编译三步法
Step 1: flutter build bundle host/share/flutter/sdk/bin/flutter
Dart源码 + pub依赖 ------> kernel_blob.bin + flutter_assets (lib/main.dart)
Step 2: frontend_server_aot host/.../dart-sdk/bin/snapshots/frontend_server_aot.dart.snapshot
kernel_blob.bin ------> app.dill (AOT兼容 kernel)
运⾏⽅式: dartaotruntime frontend_server_aot.dart.snapshot
--sdk-root flutter_patched_sdk/ --target=flutter --aot --tfa
--packages .dart_tool/package_config.json
--output-dill app.dill lib/main.dart
Step 3: flutter_gen_snapshot host/bin/flutter_gen_snapshot
app.dill ------> libapp.so (ELF, ARM aarch64)
运⾏⽅式: flutter_gen_snapshot --deterministic
--snapshot_kind=app-aot-elf --elf=libapp.so app.dill
6.3 关键:flutter_gen_snapshot是交叉编译器
file flutter_gen_snapshot→ ELF x86-64 ← 运⾏在x64 它产出的 libapp.so:→ ELF ARM aarch64 ← 跑在ARM64
这是Buildroot编译flutter-engine时从源码生成的,内部用ARM64模拟器,在x64上直接产出ARM64指令。
七、方案优劣势分析
7.1 方案优势
GPU硬件加速,渲染性能优异
Flutter引擎原生深度适配OpenGL ES / Vulkan图形API,设计目标是实现60fps甚至120fps流畅动效。嵌入式嵌入器通过EGL与GBM创建图形上下文,直接调用GPU渲染,最终经DRM/KMS输出画面。复杂的缩放、旋转、3D翻转、粒子特效均可流畅运行。对比RK3568平台上的Web/Electron方案,Direct-to-DRM的Flutter 摆脱了浏览器冗余开销,界面响应速度与动画细腻度接近智能手机体验。
开发效率高,生态完善
支持Hot Reload(热重载),代码修改后1秒内即可看到效果,大幅缩短了传统嵌入式开发漫长的交叉编译、烧录周期。同时可直接复用移动端庞大的Dart插件生态。
声明式UI,现代化界面开发体验
对比命令式的Qt Widgets、C语言实现的LVGL,Flutter的声明式UI范式(类似React/Vue)更贴合现代前端开发习惯,可快速实现复杂动效与精致的商业化界面,视觉表现力更强。
跨平台高度一致
基于自研渲染引擎逐像素绘制,同一套代码在嵌入式板卡、手机App、Web、桌面端的视觉表现几乎完全一致,可显著降低多端适配成本
7.2 方案局限
系统资源消耗大(硬件门槛高):Flutter的Runtime(Dart虚拟机 +C++引擎)体积较大。一个简单的HelloWorld程序的产物可能就需要几十兆(MB)的内存和磁盘空间。它无法运行在MCU(单片机)上,通常需要Cortex-A 系列处理器、至少256MB/512MB以上可用内存以及必须有硬件GPU支持。
启动速度稍慢 :相比于几百毫秒就能启动的 C/C++原生程序(如LVGL或优化后的 Qt),Flutter启动时需要初始化Dart虚拟机和加载渲染引擎,冷启动通常需要1~2 秒或更久,在对"开机即显⽰"要求极高(如车载倒车影像)的场景下需要额外优化。
嵌入式官方支持尚在完善 :尽管Linux桌面版是官方一等公民,但针对"无桌面环境的纯嵌入式Linux"的Embedder(如 flutter-pi),很大程度上仍依赖社区和各大芯片厂商自己编写适配层,在某些特定硬件上的硬解码、外部接口(GPIO、I2C)调用不如 Qt那么开箱即用。
7.3 效果展示





以上就是Flutter在Buildroot环境下的完整适配方案与实操细节。从方案选型、内核配置到问题排查、交叉编译,整套流程均可直接落地复用。如果你的项目需要在嵌入式Linux平台实现流畅的图形交互,不妨以此为基础快速上手验证。