从零到一:在Ubuntu PC上为ARM64设备交叉编译Flutter应用

张开发
2026/4/19 18:13:04 15 分钟阅读

分享文章

从零到一:在Ubuntu PC上为ARM64设备交叉编译Flutter应用
1. 为什么需要交叉编译Flutter到ARM64设备最近几年ARM架构的设备越来越普及从手机到开发板很多都采用了ARM64的CPU。像RK3588、RK3399这些常见的开发板性能已经足够强大完全可以运行复杂的图形界面应用。而Flutter作为谷歌推出的跨平台UI框架非常适合用来开发嵌入式设备的图形界面。但这里有个问题我们平时开发的PC大多是x86架构的直接在PC上编译的Flutter应用是无法在ARM设备上运行的。这就需要用到一个叫交叉编译的技术——在一台机器上生成能在另一种架构上运行的程序。听起来很神奇对吧其实原理并不复杂跟着我一步步操作你也能掌握这个技能。2. 搭建Ubuntu开发环境2.1 选择合适的Ubuntu版本我推荐使用Ubuntu 20.04 LTS这是个长期支持版本稳定性有保障。当然22.04也可以但有些工具链可能需要额外配置。安装过程很简单用U盘做个启动盘就行这里就不赘述了。装好系统后第一件事就是更新软件源sudo apt update sudo apt upgrade -y2.2 安装基础开发工具接下来安装一些必备的开发工具sudo apt install -y unzip curl clang cmake pkg-config ninja-build这些工具中cmake和ninja是构建系统需要的clang是编译器pkg-config用来管理依赖库。2.3 安装ARM64交叉编译工具链这是关键一步。我们需要安装能在x86机器上生成ARM64代码的编译器sudo apt install -y gcc-10-aarch64-linux-gnu g-10-aarch64-linux-gnu安装完成后可以验证一下aarch64-linux-gnu-g-10 --version如果看到版本信息说明安装成功了。这里我选择的是gcc-10版本因为这个版本比较稳定和Flutter的兼容性也比较好。3. 配置Flutter for Embedded Linux环境3.1 获取Flutter for Embedded Linux标准的Flutter SDK不支持嵌入式Linux我们需要使用Sony维护的一个分支git clone https://github.com/sony/flutter-elinux.git sudo mv flutter-elinux /opt/3.2 配置环境变量为了让系统能找到Flutter命令需要修改环境变量echo export PATH$PATH:/opt/flutter-elinux/bin ~/.bashrc source ~/.bashrc验证安装flutter-elinux --version如果看到版本号输出说明配置成功了。4. 创建和配置Flutter项目4.1 创建新项目找个合适的位置创建一个新项目mkdir my_flutter_app cd my_flutter_app flutter-elinux create .这个命令会下载所有依赖并初始化项目结构。第一次运行可能会比较慢因为要下载Dart SDK和Flutter引擎。4.2 关键CMake配置修改为了让交叉编译正常工作需要修改几个CMake文件。首先是项目根目录下的elinux/CMakeLists.txt# 在project(runner LANGUAGES CXX)之前添加 set(CMAKE_EXE_LINKER_FLAGS -fuse-ldgold) set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g-10)然后是elinux/runner/CMakeLists.txt需要添加一些必要的库链接set(FLUTTER_LIB ${CMAKE_CURRENT_SOURCE_DIR}/../flutter_lib/) target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libffi.so ${FLUTTER_LIB}libwayland-cursor.so.0 ${FLUTTER_LIB}libxkbcommon.so.0 ${FLUTTER_LIB}libmali-wayland.so ${FLUTTER_LIB}libdrm.so.2 ${FLUTTER_LIB}libwayland-server.so.0 )这些库文件需要提前准备好放在项目的flutter_lib目录下。这些库可以从目标设备上提取或者自己交叉编译。5. 构建和部署应用5.1 执行交叉编译一切准备就绪后就可以开始编译了flutter-elinux build elinux --target-archarm64这个命令会编译Dart代码为ARM64指令集链接所有必要的库生成可执行文件编译完成后产物会放在build/elinux/arm64/debug目录下。5.2 常见问题解决在实际操作中你可能会遇到一些问题。这里分享几个我踩过的坑库文件缺失如果运行时提示缺少某个.so文件可以从目标设备上复制对应的库到flutter_lib目录。编译器版本不匹配如果遇到奇怪的编译错误可以尝试更换gcc版本比如从gcc-10换成gcc-9。Wayland相关错误有些开发板需要特定的Wayland库版本建议从设备厂商获取正确的库文件。6. 优化构建流程6.1 使用ccache加速编译交叉编译可能会比较耗时可以使用ccache来缓存编译结果sudo apt install ccache echo export PATH/usr/lib/ccache:$PATH ~/.bashrc source ~/.bashrc然后创建符号链接sudo ln -s /usr/bin/ccache /usr/lib/ccache/aarch64-linux-gnu-g-10 sudo ln -s /usr/bin/ccache /usr/lib/ccache/aarch64-linux-gnu-gcc-106.2 自定义构建脚本为了简化流程可以创建一个build.sh脚本#!/bin/bash # 清理旧构建 rm -rf build/ # 设置编译标志 export CXXaarch64-linux-gnu-g-10 export CCaarch64-linux-gnu-gcc-10 # 执行构建 flutter-elinux build elinux --target-archarm64 --debug # 打包输出 mkdir -p output cp -r build/elinux/arm64/debug/bundle/* output/这样每次只需要运行./build.sh就能完成整个构建过程。7. 进阶技巧调试与优化7.1 远程调试在目标设备上运行Flutter应用时可以通过网络进行远程调试# 在设备上运行应用时添加参数 ./your_app --observatory-port8888然后在开发机上用浏览器访问设备IP:8888就能看到Dart的调试界面。7.2 性能优化对于资源受限的嵌入式设备可以采取一些优化措施使用--release模式构建这会启用所有优化flutter-elinux build elinux --target-archarm64 --release在pubspec.yaml中移除不需要的依赖减小包体积。对于复杂的UI可以使用RepaintBoundary来限制重绘区域。掌握了这些技巧后你就能在RK3588、RK3399等ARM64开发板上流畅运行Flutter应用了。虽然交叉编译的配置过程有点复杂但一旦搭建好环境后续的开发效率会非常高。

更多文章