本文主要是记录在WSL2 Ubuntu22.04上搭建Flutter Engine编译环境的整个过程。
环境准备
本节主要是编译前的准备工作,主要是网络配置和所需工具安装。
机器信息
本次编译环境的机器信息如下:
- X64处理器
- Windows 10
- WSL2
- Ubuntu22.04
网络配置
由于flutter源码下载和编译过程都需要使用网络,因此需要进行代理配置。本次编译环境需要在三个地方进行代理配置。
配置windows代理
本文通过clash实现Windows上的外部网络连接,所以需要下载“clash for windows”软件,并配置代理信息。具体下载配置方式网络上有很多,可以自行查阅资料,此处不在赘述。
WSL2代理配置
在clash配置完成后,可以通过浏览器访问外部网络,但是WSL2还需要在进行单独配置才能访问外部网络。通过下面的配置将WSL2网络模式设置成mirrored模式,使得它可以访问clash的代理。
- 在.wslconfig文件中添加如下配置信息。.wslconfig文件在User目录下。
1
2
3
4
5
6
7[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
sparseVhd=trueUbuntu代理配置
通过设置https_proxy等环境变量实现Ubuntu的代理配置。具体配置如下:
1
2
3
4
5
6
7!/bin/bash
hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"
export all_proxy="socks5://${hostip}:7890"
export no_proxy=localhost,127.0.0.1,::1工具安装
本次编译需要依赖openjdk,deptools和python3等工具,需要提前安装,以避免编译过程报错。因为Ubuntu22.04已经自带了一些工具(如,python3、git等),所以本节只记录缺失的工具安装过程,其余工具信息可以参考flutter官网信息。
安装pkg-config、curl、unzip、openjdk
1
sudo apt install pkg-config curl unzip openjdk-17-jdk
安装deptools 工具集
首先,从google的网站上下载deptools工具集。
1
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
然后,将deptools工具集添加到环境变量中。
1
export PATH=/path/to/depot_tools:$PATH
代码下载
本文通过deptools中的fetch和gclient进行代码下载和同步。具体命令如下:
1 | 创建源码目录并进入到该目录 |
适配Flutter SDK版本
为了保证编译出来的flutter engine能适配Flutter SDK版本,在编译前我们可以根据SDK version文件里的commit id设置flutter engine的代码版本。
1 | 查看本地 Flutter SDK 引擎版本, 这个文件中是包含对应的 commit id |
engine编译
engine编译分为两个步骤,编译配置和编译。
编译配置
因为flutter engine有多种编译配置,因此需要进行配置以指定所需的编译配置。本文只编译arm64 Android版engine,同时设置为debug版本,具体命令和参数配置如下:
1 | ./flutter/tools/gn --unoptimized --runtime-mode=debug |
执行此命令之后,就会生成一个编译目录 android_debug_unopt_arm64。
编译
上述配置执行之后,通过如下执行命令就可以完成编译。
1 | ninja -C out/android_debug_unopt_arm64 |
报错处理
Emscripten SDK 安装失败
需要安装 pkg-config、curl 和 unzip。
本地IP不走代理设置
需要设置no_proxy环境变量。
缺少JAVA环境
需要安装java运行环境。
gradle下载报错
代理太慢导致下载超时,重试即可。也可以替换更快的代理。
总结
只要网路环境没有问题,参考官方Wiki即可完成编译。