flutter移植arm32位板子

前言

flutter移植到arm系列芯片的嵌入式设备上运行。

要求

芯片:必须为arm系列的芯片。
linux系统:32/64位皆可运行,系统版本未明确
GPU:不强制有GPU
驱动:显示驱动不强制drm,fb也可
交叉编译器:必须支持c++17特性

一、flutter下载及编译

1 下载及编译

flutter_engine代码下载过程可参考:https://blog.csdn.net/C_Creator/article/details/124849489
libflutter_engine.so编译过程可参考:https://blog.csdn.net/C_Creator/article/details/125041116

2 代码修改

2.1 修改flutter依赖的dart sdk的版本的原因:

一、下载flutter代码必须在外网下载,不能在公司下载。导致更新代码很麻烦。因此尽可能基于手头的flutter-candicate-3.1.0版本的flutter工程。————使用flutter-engine的flutter-candicate-3.1.0版本的必要性。
二、使用flutter-elinux新建的flutter工程固定依赖于V2.17.1版本的dartsdk。而官方flutter工具新建的flutter工程依赖的dart版本迭代很快,一直在变化,且flutter版本和dartsdk版本的对应关系,和flutter-engine源码的flutter:dartsdk的对应关系不统一。 ————使用flutter-elinux构建flutter工程的必要性
三、flutter-engine的flutter-candicate-3.1.0版本依赖的dart-sdk版本和flutter-elinux构建资源时的dart-sdk版本对应不上,且修改flutter-elinux源码的dartsdk版本为flutter-candicate-3.1.0依赖的dart-sdk失败,也就是flutter-elinux不支持该dart-sdk版本。————修改flutter-engine的dartsdk版本的必要性。
四、使用flutter-engine的高于flutter-candicate-3.1.0的版本去适配flutter工具的dartsdk,需要重新解决很多的编译问题。flutter-candicate-3.2.0 - flutter-candicate-3.4.0 新增了许多编译问题。

2.2 修改flutter依赖的dart sdk的流程:

进入flutter-engine的工程目录,编辑src/flutter/DEPS文件。进行如下修改:

// 删除
-  'dart_revision': 'f6c50fc81b9c23aa6620276935f0c1f1c804be0d',
// 新增
+  'dart_revision': 'edf0ab222395c4b13c3e52a18900dd62702b639f',

然后在flutter-engine的工程目录下执行gclient sync操作。(该操作必须在外网且翻墙的情况下运行,不然就会破坏整个flutter-engine的工程)

二、flutter资源构建

2.1 下载flutter-elinux的源码

git clone https://github.com/sony/flutter-elinux.git

2.2 修改flutter-engine版本

echo "caaafc5604ee9172293eb84a381be6aadd660317" >  bin/internal/engine.version

2.3 构建flutter工程

export PATH=$PATH:${flutter-elinux的下载路径}/bin:${flutter-elinux的下载路径}/flutter/bin
flutter-elinux create myapp

2.4 构建flutter资源

cd myapp
flutter-elinux build

flutter-elinux build会在build目录下生成flutter_assets资源目录,这个就是我们需要的资源文件。

2.5 构建应用app.so

注意事项:需要提前编译好host_release版本和linux-release-arm版本的flutter-engine.so

2.5.1 构建kernel_snapshot.dill

${flutter_engine下载目录}/src/out/host_release/dart-sdk/bin/dart ${flutter_engine下载目录}/src/out/host_release/dart-sdk/bin/snapshots/frontend_server.dart.snapshot --sdk-root ${flutter_engine下载目录}/src/out/host_release/flu
tter_patched_sdk --target=flutter --aot  --tfa  -Ddart.vm.product=true --packages .packages --output-dill build/kernel_snapshot.dill  --verbose --depfile build/kernel_snapshot.d  package:myapp/main
.dart

2.5.2 构建app.so

${flutter_engine下载目录}/src/out/linux_release_arm/clang_x64/gen_snapshot --no-use-integer-division --verbose --no-use-integer-division  --deterministic --snapshot_kind=app-aot-elf --elf=build/             flutter_assets/app.so --no-use-integer-division --strip build/kernel_snapshot.dill

三、实现flutter启动程序

不能贴代码,这里就描述一下大致的流程

1. 初始化资源路径
通过命令行参数获取flutter资源的路径
2. 初始化消息队列
初始化一个高效的消息队列
3. 初始化事件获取
初始化触摸屏事件获取。一旦读取到事件,发送到消息队列中。
4. 初始化屏幕信息
初始化屏幕显示(使用fb或者gx的方式获取到显存地址)
5. 初始化设备语言
初始化设备的语言
6. 启动flutter引擎
	6.1 初始化flutter渲染配置
	6.2 初始化flutter工程配置
	6.3 加载dart aot代码
	6.4 初始化flutter引擎
	6.5 启动flutter引擎
	6.6 设置flutter刷新频率
	6.7 设置flutter显示参数
7. 等待消息队列消息,并处理消息队列消息
	7.1 等待来自flutter的消息
		7.1.1 flutter的消息来自设置到flutter中的回调函数platform_message_callback
		7.1.2 必须针对flutter相应的消息进行正确的响应,flutter才能够正常运行
		7.1.3 回调函数触发时,如果不在主线程需要通过消息队列切换到主线程再给flutter返回消息
	7.2 等待来自事件线程的消息

四、编译运行flutter启动程序

1. 编译

采用交叉编译的方式,将flutter启动程序源码以及libflutter_engine.so一起编译。

2. 环境准备

1、 将flutter-elinux生成的flutter_assets资源目录拷贝到设备中
2、 将编译生成的app.so拷贝到设备中的flutter_assets目录下
3、 将编译libflutter_engine.so时生成的libflutter_engine.so和icudtl.dat文件拷贝到板子中,icudtl.dat放置到flutter_assets目录下,libflutter_engine.so放置到能链接到的路径中,或者设置LD_LIBRARY_PATH环境变量
4、 启动运行flutter启动引导程序

总结

编译问题我就不写了(修改ninja编译参数,以及源码),代码部分由于没法贴,我也就不贴了,实现也不算太难。
通过后续的对flutter的了解,arm系列的芯片,基本都能移植成功。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值