1
方案简介
在 Buildroot 构建的嵌入式 Linux 系统中部署 Flutter 应用,主流有两套成熟的开源方案,分别适配不同的显示场景与开发需求:
方案一:flutter-elinux(Sony开源方案)
由索尼官方维护的嵌入式 Linux Flutter 工具链,既支持 DRM/GBM 直接渲染,也兼容 Wayland、X11 等多种显示后端,场景适配性更广。
方案二:flutter-pi(轻量级嵌入器)
一款轻量级 Flutter 引擎宿主程序,仅基于底层 DRM/GBM 接口实现渲染,无需依赖桌面环境,资源占用更低,更贴合纯嵌入式场景。
主流方案对比与架构说明
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 运行时架构
2.3 flutter-pi 的渲染管线
Buildroot 原生 Flutter 软件包体系
从 Buildroot 2024.02 版本开始,官方已内置完整的 Flutter 相关软件包,无需额外移植,只需在 defconfig 中开启对应配置即可完成编译集成。
软件包目录位于 buildroot/package/ 下,结构如下:
flutter-pi 适配实操(以 RK3568 平台为例)
以下基于 RK3568 6.1.118 SDK 环境演示 flutter-pi 的适配流程,flutter-embedded-linux 的适配逻辑同理,二者按需二选一即可。
添加 Flutter 配置到 defconfig
在配置文件 buildroot/configs/rockchip_ok3568_defconfig 中新增内容:
各项配置功能说明
| 选项 | 作用 |
|---|---|
| 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 编译流程执行构建。
编译核心产物说明
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 | 国际化字符集数据文件 |
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 交叉编译三步法
6.3 关键:flutter_gen_snapshot 是交叉编译器
这是 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 平台实现流畅的图形交互,不妨以此为基础快速上手验证。

