基于Linux平台交叉编译 flutter arm64应用

    操作系统ubuntu 20.04,开发工具Android Studio + Flutter,运行平台RK3566 Linux。截止现在Flutter官方尚未正式对Linux arm64进行支持,仅有flutter-elinux可用。开发环境的搭建过程遇到了很多的坑,幸运的是最终完成了。为避免后来者再次浪费时间,特撰此文以飨读者。

    本文仅记录编译环境的搭建和验证,不涉及具体的应用开发。

一、操作系统以及基础环境准备

1、操作系统准备

  本文选用ubuntu 20.04。其他版本作者没试过,如果你验证某版本可行请留言。

2、准备基础环境

  安装unzip curl clang cmake pkg-config以及g++-10-aarch64-linux-gnu

sudo apt install unzip curl clang cmake pkg-config

sudo apt install git

sudo apt-get install g++-10-aarch64-linux-gnu

3、开发工具准备与环境配置

  下载flutter-elinux,并移动到/opt/目录下

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

sudo mv flutter-elinux /opt/

 配置环境变量,修改 .bashrc 文件,增加export PATH="$PATH:/opt/flutter-elinux/bin",然后执行source .bashrc

~$ vi .bashrc

#在文件末尾增加如下内容:
export PATH="$PATH:/opt/flutter-elinux/bin"

~$ source .bashrc

  至此,系统环境就配置好了。

二、建立并编译第一个DEMO程序

1、创建第一个范例程序

flutter-elinux create demo1

cd demo1

   这样我们就创建了第一个示例程序demo1并切换到该目录下,后面的操作均在此目录下进行。

2、配置编译工具和链接库

  elinux/CMakeLists.txt打如下补丁

index 8f2a634..6a2adbe 100644
--- a/elinux/CMakeLists.txt
+++ b/elinux/CMakeLists.txt
@@ -16,6 +16,9 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

+set(TARGET_ARCHITECTURE "arm64")
+set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++-10)
+

  elinux/runder/CMakeLists.txt打上如下补丁

--- a/elinux/runner/CMakeLists.txt
+++ b/elinux/runner/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 3.15)
-project(runner LANGUAGES CXX)
+

 if(FLUTTER_TARGET_BACKEND_TYPE MATCHES "gbm")
   add_definitions(-DFLUTTER_TARGET_BACKEND_GBM)
@@ -17,7 +17,18 @@ add_executable(${BINARY_NAME}
   "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
 )
 apply_standard_settings(${BINARY_NAME})
+
+set(FLUTTER_LIB   ${CMAKE_CURRENT_SOURCE_DIR}/../flutter_lib/)
 target_link_libraries(${BINARY_NAME} PRIVATE flutter)
 target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libffi.so )
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libwayland-cursor.so )
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libxkbcommon.so.0 )
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libmali-wayland.so  )
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libdrm.so.2 )
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libwayland-server.so.0 )
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}libc.so.6 )
+target_link_libraries(${BINARY_NAME} PRIVATE ${FLUTTER_LIB}ld-linux-aarch64.so.1 )
+

   创建elinux/flutter_lib目录,将前面用到的库文件都拷贝进去。你是不是想问:这些库文件从哪里来?答案已经蕴含在本文中,琢磨琢磨就知道了。

3、编译

  执行如下命令进行编译

flutter-elinux build elinux --target-arch=arm64

  执行完毕后会生成一个build目录,需要的文件均在build/elinux/arm64/release/bundle/下,整体拷贝到rk3566板子上就可以启动了。

~/demo1$ ls build/elinux/arm64/release/bundle/
data  demo1  lib

参考文献:

arm64平台移植flutter,搭建PC端交叉编译说明-CSDN博客

猜你喜欢

转载自blog.csdn.net/fulszcd/article/details/129904541