1

原创 2026-08-06 08:43:00
1

方案简介

在 Buildroot 构建的嵌入式 Linux 系统中部署 Flutter 应用,主流有两套成熟的开源方案,分别适配不同的显示场景与开发需求:

方案一:flutter-elinux(Sony开源方案)

由索尼官方维护的嵌入式 Linux Flutter 工具链,既支持 DRM/GBM 直接渲染,也兼容 Wayland、X11 等多种显示后端,场景适配性更广。

方案二:flutter-pi(轻量级嵌入器)

一款轻量级 Flutter 引擎宿主程序,仅基于底层 DRM/GBM 接口实现渲染,无需依赖桌面环境,资源占用更低,更贴合纯嵌入式场景。

2

主流方案对比与架构说明

2.1 flutter-pi 与 flutter-embedded-linux 区别

特性 flutter-pi flutter-embedded-linux (Sony)
主导方 社区个人开发者 (ardera) 索尼(Sony)团队及社区
初衷与目标 为树莓派等轻量级/创客设备提供极致精简的运行时 为工业级/商用嵌入式设备提供规范化的 Flutter 运行环境
主要硬件架构 ARMv7 (32位)、ARMv8 (64位)、x86/x86_64 重点优化 ARM64 (64位) 和 x64,32位支持较弱
显示后端 仅限 DRM/GBM (KMS)(完全脱离 X11 / Wayland 图形桌面,直接输出到屏幕) 多后端支持:Wayland、DRM/GBM、X11、EGLStream (NVIDIA)
开发与调试工具 使用原生的 flutter 工具链 + 运行编译产物,调试相对原始 提供了配套的 flutter-elinux 命令行工具,支持 Hot Reload(热重载)和远程调试
适用场景 纯嵌入式全屏应用 需要与桌面环境共存

2.2 flutter-pi 运行时架构

+----------------------------+ | FlutterApp (Dart) | libapp.so (AOT编译) +----------------------------+ | libflutter_engine.so | 渲染引擎 + DartVM +----------------------------+ | flutter-pi (embedder) | DRM/GBM 直接渲染 +----------------------------+ | Mali-G52 GPU + DRM/KMS | +----------------------------+ | Buildroot Linux (ARM64) | +----------------------------+

2.3 flutter-pi 的渲染管线

Flutter --(OpenGL ES命令)--> libGLESv2.so --> Mali-G52 GPU --> GBM buffer --> DRM --> HDMI
3

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
4

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

各项配置功能说明

选项 作用
BR2_PACKAGE_FLUTTER_PI=y 启用 ardera 的 flutter-pi embedder (DRM-GBM)
BR2_PACKAGE_FLUTTER_PI_CHARSET_CONVERTER_PLUGIN=y 字符编码插件
BR2_PACKAGE_FLUTTER_PI_RAW_KEYBOARD_PLUGIN=y 原始键盘事件插件
BR2_PACKAGE_FLUTTER_PI_TEXT_INPUT_PLUGIN=y 文本输入插件
BR2_PACKAGE_FLUTTER_PACKAGES=y 启用 Flutter 官方示例 app,从源码下载

配置完成后,即可按照标准 Buildroot 编译流程执行构建。

5

编译核心产物说明

Buildroot 编译完成后,核心 Flutter 组件会部署到目标系统的对应路径,详情如下:

组件 大小 路径 作用
flutter-pi 355 KB /usr/bin/flutter-pi 嵌入器主程序,负责界面渲染调度与输入事件处理
libflutter_engine.so 42 MB /usr/lib/libflutter_engine.so Flutter 核心引擎,提供渲染能力与 Dart 虚拟机
icudtl.dat 10 MB /usr/share/flutter/release/data/icudtl.dat 国际化字符集数据文件
6

Buildroot 编译出的 Flutter 交叉编译工具链

6.1 工具链清单

工具 路径 运行架构 核心作用
flutter host/share/flutter/sdk/bin/flutter x64 (Shell 脚本) Flutter 项目管理、依赖解析
dartaotruntime host/share/flutter/sdk/bin/cache/dart-sdk/bin/dartaotruntime x64 Dart AOT 运行时环境
frontend_server_aot host/.../dart-sdk/bin/snapshots/frontend_server_aot.dart.snapshot 平台无关 Dart 源码转 Kernel 字节码编译器
flutter_gen_snapshot host/bin/flutter_gen_snapshot x64 -> ARM64 Kernel 字节码转 ARM64 机器码
flutter_patched_sdk host/.../engine/common/flutter_patched_sdk/ - 提供 dart:ui 等 Flutter 核心库

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

方案优劣势分析

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 效果展示

时长 00:11
时长 00:18

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

推荐阅读 换一批 换一批