在树莓派中运行Flutter

注意

本文档描述了将Flutter引擎移植到当前不支持的目标的实验。我使用Raspberry Pi的事实纯粹是偶然的。我故意不对目标做出任何假设。完全有可能您已经准备好与特定电路板一起使用的工具链。

步骤

参考文献

Flutter on Raspberry Pi (mostly) from scratch

构建Flutter引擎

  要为Raspberry Pi 3B Plus构建Flutter引擎,您需要一个能够为ARMv8编译引擎代码的工具链。目标工具链是aarch64-linux-gnueabihf。引擎开发人员依赖于一个非常接近Tip-of-Tree的工具链 Clang/LLVM 来进行开发。虽然使用现代版本的GCC当然是可能的,但如果没有对编译器所需的构建和测试基础设施的持续投资,引擎开发人员不太可能接受GCC特定的补丁。因此,就像引擎开发人员在受支持的平台上所做的那样,设置一个接近Tip-of-Tree的Clang/LLVM工具链。

  为aarch64-linux-gnueabihf准备一个Clang工具链是相当简单的。它涉及下载源代码,如Clang / LLVM的入门页面所述。重要的是不要检出文档“可选”部分中描述的libcxx和libcxxabi。这些库不会为目标平台构建。相反,它们将在安装前缀指定的位置安装主机构件。

签出Clang/LLVM源代码

1
git clone https://github.com/llvm/llvm-project.git

签出Clang/LLVM源代码后,使用以下标志构建工具链

1
2
3
4
5
6
7
8
cd llvm-project
mkdir build
cd build
cmake ../llvm \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" \
-DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \
-DLLVM_TARGETS_TO_BUILD=AArch64 \
更新中 build.sh hosted with ❤ by ka1i Github

### 编译 & 安装 Clang/LLVM
1
2
make
make install DESTDIR=/home/mardan/work_space/raspberry-flutter/project/toolchain
更新中 build.sh hosted with ❤ by ka1i Github

有一个,你有Clang / LLVM工具链,你需要为其构建Binutils arm-linux-gnueabihf。引擎开发人员在Linux上使用Gold作为链接器,所以也是如此。Binutils源代码可以从Binutils主页上提到的Git存储库下载。 ## 签出GNU Binutils源代码
1
git clone git://sourceware.org/git/binutils-gdb.git

签出GNU Binutils源代码后,使用以下标志构建工具链

1
./configure --enable-gold --enable-ld --target=aarch64-linux-gnueabihf

编译 & 安装 GNU Binutils

1
2
make
make install DESTDIR=/home/mardan/work_space/raspberry-flutter/project/toolchain
更新中 build.sh hosted with ❤ by ka1i Github

您现在拥有一个能够为(并且仅用于)手臂构建的工具链-linux-gnueabihf。如果你已经有一个非常接近Tip-of-Tree Clang的工具链,它也能够定位这个平台,你可以使用它。但是,由于版本不一致,这个工具链可以让您更好地避免编译器特定问题。

用刚刚编译的工具链(Clang/LLVM+GNU Binutils)编译libcxx和libcxxabi

您可以使用全新的工具链进行旋转,使用它来构建libcxx和libcxxabi。该树莓派Rasbian图像有libstdc++是比较旧的,不完全适合发动机使用。此外,您希望引擎是自包含的,而不依赖于目标上的C ++库实现。您将使用a libcxx并将其静态链接到引擎中。这样,引擎就拥有了运行所需的一切,并且对底层平台的依赖性最小。由于您构建libcxx仅供引擎使用,因此可以禁用对引擎不需要的异常和RTTI的支持。

下载源代码libcxx,并libcxxabi为从LLVM团队“构建Libcxx”页上介绍。鉴于上述特定功能libcxx,请运行以下命令。

注意:如果您需要有关任何CMake变量的更多帮助,以下命令非常有用:

1
2
cmake --help-variable CMAKE_SYSROOT_COMPILE
cmake --help-variable-list

首先构建libcxxabi,因为libcxx依赖于libcxxabi:

1
2
3
4
5
6
7
8
9
10
11
12
MYTOOLHOME=/home/mardan/work_space/raspberry-flutter/project
cmake ../libcxxabi \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_SYSROOT=${MYTOOLHOME}/sysroot \
-DLIBCXX_ENABLE_SHARED=False \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=AArch64 \
-DCMAKE_C_COMPILER=${MYTOOLHOME}/toolchain/usr/local/bin/clang \
-DCMAKE_CXX_COMPILER=${MYTOOLHOME}/toolchain/usr/local/bin/clang++ \
-DLLVM_TARGETS_TO_BUILD=AArch64 \
-DLIBCXXABI_ENABLE_EXCEPTIONS=False
更新中 build.sh hosted with ❤ by ka1i Github

### 编译 & 安装 libcxxabi
1
2
make
make install DESTDIR=/home/mardan/work_space/raspberry-flutter/project/toolchain

然后,构建libcxx。请注意,它配置为静态链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MYTOOLHOME=/home/mardan/work_space/raspberry-flutter/project
cmake ../libcxx \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_SYSROOT=${MYTOOLHOME}/sysroot \
-DLIBCXX_ENABLE_SHARED=False \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=AArch64 \
-DCMAKE_C_COMPILER=${MYTOOLHOME}/toolchain/usr/local/bin/clang \
-DCMAKE_CXX_COMPILER=${MYTOOLHOME}/toolchain/usr/local/bin/clang++ \
-DLLVM_TARGETS_TO_BUILD=AArch64 \
-DLIBCXX_ENABLE_EXCEPTIONS=False \
-DLIBCXX_ENABLE_RTTI=False \
-DLIBCXX_CXX_ABI=libcxxabi \
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${MYTOOLHOME}/toolchain/usr/local/include/c++/v1\
-DLIBCXX_CXX_ABI_LIBRARY_PATH=${MYTOOLHOME}/toolchain/usr/local/lib \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=True
更新中 build.sh hosted with ❤ by ka1i Github

### 编译 & 安装 libcxx
1
2
make
make install DESTDIR=/home/mardan/work_space/raspberry-flutter/project/toolchain

完成两个库的安装步骤后,查看安装前缀中指定的路径,以确保没有动态库libcxxlibcxxabi结束。您希望绝对确定不会创建依赖于这些动态库的工件(因为它们实际上不会出现在目标上)。如果找到,请将其删除。

cxxabi.h__cxxabi_config.h标头复制到安装前缀文件夹中的c ++ / v1。默认情况下不会将它们放在那里。

Sysroot

从新鲜的无头Raspbian安装rsync的lib,opt和usr目录到你的主机上的一个目录中。我们将此目录称为,sysroot并使用它在主机上构建工件,该工件与目标上的系统库(Raspberry Pi)链接。您可以随意修剪这些目录的内容,以排除嵌入器本身不需要的依赖项。

要构建引擎,你只需要libdl,libpthread,librt,libm和libc,和他们的头。嵌入式实现也可能需要链接到Broadcom库(这些库都在opt)。

颤振发动机
使用参考指南中的说明为Flutter引擎设置主机环境。确保您在Linux桌面主机上,因为您正在为Linux目标(Raspberry Pi)构建,但使用自定义工具链(您刚刚构建的工具链)和sysroot(您刚刚通过的那个rsync)。

------ 文章已经结束,谢谢你的阅读 ------
------ article has ended,thank you for reading ------
Thanks support Me

---------------- The End ----------------