一、环境搭建

1.安装Linux虚拟机

下载VMWare,下载Ubuntu镜像,按VMWare操作步骤,创建虚拟机,注意资源配置,内存最好配置8GB左右,硬盘配置50GB左右, 也可以配置较少资源给虚拟机,如果后期不够用可以进行扩容;

2.安装flutter-elinux

参考https://github.com/sony/flutter-elinux进行SDK安装,下载SDK注意使用git命令下载,不要直接download资源(因为项目创建、依赖安装等需要用到SKD目录下的git配置,直接下载项目中不带git相关配置)

3.配置环境变量

环境变量配置分为两部分,vi命令编辑~/.bashrc文件,将如下环境变量粘贴到此文件;

  1. Flutter-elinux SDK环境变量的配置
    export PATH=$PATH:/opt/flutter-elinux/bin
    export PUB_HOSTED_URL=https://pub.flutter-io.cn
    export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
    export PATH=$PATH:/opt/flutter-elinux/flutter/bin
  2. Buildroot环境变量的配置

需要从屏幕厂商拷贝Buildroot目录到linux虚拟机固定目录,配置如下环境变量;

export PATH=$PATH:/home/root1/buildroot/output/host/bin
export PATH=$PATH:/home/root1/buildroot/output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib

二、创建项目

直接用flutter-elinux官方给的指令创建项目,不要使用flutter命令,flutter命令创建出来的项目中没有elinux文件夹(不支持elinux),如果是现有项目要移植到elinux,可以使用flutter-elinux创建和现有项目相同的项目,再将原有项目代码进行移植,或者可以在新创建的项目中使用flutter-elinux create . 对elinux平台进行支持;

三、打包部署

  1. 参考https://github.com/sony/flutter-elinux/wiki/Building-flutter-apps,使用第三种打包方式:Use Buildroot Toolchain,用如下命令创建一个shell文件run_build.sh,方便后期执行打包命令,注意如下Buildroot相关路径的配置,另外文件创建完成后要使用chmod添加权限才可以被执行 chmod 777 ./run_build.sh
    flutter-elinux build elinux --target-arch=arm64 \
          --target-compiler-triple=aarch64-buildroot-linux-gnu \
          --target-sysroot=/home/root1/buildroot/output/staging \
          --target-compiler-flags=--gcc-toolchain=/home/root1/buildroot/output/host

2.部署需要连接arm板:

  1. 用Type-C连接ARM板,主机安装HyperTerminal,新建一个连接,选择一个端口,波特率选择115200,然后点击确定,重启arm板,确定是否连接成功;
  2. 将ARM板连接网线,HyperTerminal命令行中使用ip addr show或者ifconfig查看板子IP;
  3. Linux虚拟机中,Files -> Other Locations -> Connect to Server输入ftp://192.168.4.72 进行FTP连接板子文件系统;创建一个文件夹,将打包好的包拷贝到板子的新建文件夹下;
  4. 启动程序,./flutter_project_getx –bundle=./

四、真机调试

1.创建真机连接配置文件

参考https://github.com/sony/flutter-elinux/wiki/Remote-target-devices,在~目录下创建一个隐藏文件,.flutter_custom_devices.json,使用flutter-elinux devices查看是否成功创建了真机的连接;

2.打debug包

flutter-elinux build elinux --target-arch=arm64 \
      --target-compiler-triple=aarch64-buildroot-linux-gnu \
      --target-sysroot=/home/root1/buildroot/output/staging \
      --target-compiler-flags=--gcc-toolchain=/home/root1/buildroot/output/host \
    --debug

打包完成后,执行flutter-elinux run –d { deviceId } -v, deviceId就是上一步中配置文件中的id;

注意:这里最好用-v来显示全部的日志信息,否则可能不会显示板子上启动的debug包的vmService的地址,就无法通过vscode的attach连接真机;

执行完flutter-elinux run –d deviceId –v以后,一路输入板子密码,最后板子程序启动成功,将日志中显示出来的vmService的地址复制出来,拷贝到虚拟机中vscode的launch.json中如下图:

然后VScode启动选项选择此Attach选项,就可以连接到板子的vmService了,修改代码保存后,会自动同步到板子上;

注意:要成功Attach板子还需要有一个端口映射的操作,需要在.flutter_custom_devices.json中配置端口映射,如下图

3.可能出现的问题

问题1

[ERROR][ELinuxWindowWayland(1066)] Failed to connect to the Wayland display.

[ERROR][CreateRenderSurface(1338)] Wayland display is invalid.

首先在板子上执行:weston-simple-egl,看能否跳出来wayland的动画示例,然后执行weston &,查看XDG_RUNTIME_DIR绑定的路径和.flutter_custom_devices.json绑定的一致,如下截图:

问题2

4.另一种调试方式

以上方式自动化程度高,但是传输文件很慢,尤其是传输debug包(160MB)的时候,要3分钟才能传输成功,非常慢,可以使用ftp直接传输,详细步骤:

  1. 打包部署,参照2.4.2,对项目进行打包,然后打开虚拟机中的资源管理器,如下图进行连接:
  2. 连接成功以后进入程序部署目录,然后将打好的包从虚拟机中拷贝到板子部署目录;

  3. 启动可执行文件,使用HyperTerminal连接板子(或者直接使用ssh),启动flutter可执行文件,如下图:
  4. 拷贝vmService的启动地址: http://127.0.0.1:42801/fzgpO39Wp1E=/ 到虚拟机中的vscode的launch.json中的attach项,如下图
  5. 端口转发,在虚拟机中执行如下指令,将虚拟机的端口转发到嵌入式板子的对应端口,为下一步attach做准备;ssh -L 42801:127.0.0.1:42801 root@192.168.4.72
  6. 启动attach,在虚拟机中,vscode的Run and Debug中选择Attach,然后启动,如下图:

五、资源占用情况

1. App没有数据刷新

启动时间<=3s, 平均CPU占用:5%左右,平均内存占用:6.5%左右;

2.以10ms的频率获取全部6通道数据

CPU占用119.5%,内存占用9.1%,资源占用情况如下:

3.以50ms的频率获取全部6通道数据

CPU占用46.1%,内存占用6.1%,资源占用情况如下:

4.以100ms的频率获取全部6通道数据

CPU占用25.0%,内存占用6.5%,资源占用情况如下:

5.以200ms的频率获取全部6通道数据

CPU占用16.0%,内存占用6.1%,资源占用情况如下:


总结

flutter相比QT开发嵌入式UI的优点如下:

1.现代化的声明式 UI 编程范式

  • Flutter 的声明式:你只需改变状态变量(例如 isButtonVisible = false),然后整个 build 方法会基于新状态重新描述 UI,框架智能地计算出最小改动并高效地更新屏幕。

2.逻辑清晰
Bug 更少:单一的数据源(状态)流向UI,状态和UI的对应关系非常明确,不易产生状态不一致的Bug。

3.行业标杆的开发效率——热重载 (Hot Reload)

  • UI 调试的“即时反馈”:调整边距、颜色、动画曲线、布局结构,都像在网页上调CSS一样即时。开发者可以大胆尝试,极大地降低了试错成本。

  • 状态不丢失:调试登录页面时,热重载后无需重新输入用户名密码,状态被完整保留。这能让开发者深入多级界面后,依然能快速迭代

  • 4.真正的跨平台 UI 一致性

  • 消除平台差异:设计师再也不用担心一个按钮在A平台是方的,在B平台变圆了。

  • 统一品牌形象:对于追求统一品牌视觉的产品,Flutter 是确保在任何设备上都保持一致的理想选择

更多推荐