下载和安装FlutterEngine

825 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

拉取depot_tools工具

engine需要gclient工具获取,因为engine有很多依赖,gclient可以很好的处理这些依赖,简化源码的管理流程,首先使用Chromium提供的部署工具depot_tools depot_tools

git clone https://chromium.googlesource.com/chromium/tools/depot_tools

配置工具的环境变量

这里是放在根目录下

$ export PATH=~/depot_tools:"$PATH"

创建源码的目录

注意:路径不能含有中文,否则后续Down下载的源码会有问题

$ flutter_source_code mkdir engine
$ flutter_source_code cd engine

配置文件

engine目录下创建.gclient

$ engine touch .gclient
solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "git@github.com:flutter/engine.git@d3ea636dc5d16b56819f3266241e1f708979c233",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
  },
]

注:这里的url一定要与已经系在的Flutter的CommitID保持一致,可以使用以下命令来查看当前的Flutter的引擎版本cat xxx/flutter/bin/internal/engine.version

image.png

执行gclinet sync下载

这个操作将会fetch flutter所有的依赖,这里大概有15G的文件,需要一点时间

gclient sync

关于升级

image.png

当我们升级了Flutter的SDK,我们想要升级对应版本的引擎代码,可以直接更新.gclient文件,并指定url的CommitID为需要升级的新版本,也就是上图箭头1所指示的地方

image.png

然后进入下载的源码的src/flutter的目录,也就是箭头2所指示的地方,执行以下命令

git pull
git reset --hard CommitID // CommitID为执行的新版本的引擎id

接着回到engine目录,也就是.gclient文件所在的目录,执行

$gclient sync --with_branch_heads --with_tags --verbose

总的来说,过程可能有点曲折。第一次下载的时候,可能需要很久很久,因为是断点续传,所以中断之后,继续执行重复的命令gclient sync就可。以上就是FlutterEngine的下载过程,但是下载之后还需要编译。 ​

安装antninja

brew install ant
brew install ninja

编译FlutterEngine

打开这个下载的引擎,发现这里并没有Xcode相关的东西。我们先要使用GN来构建元文件。 GN是⼀个⽣成ninja构建⽂件的元构建系统,最后我们还是⽤ninja编译! 总结的来说就是用GN来构建,用Ninja编译!

cd /engine/src/flutter/tools
#构建iOS设备使⽤的引擎 #真机debug版本 
./gn --ios --unoptimized 
#真机release版本(⽇常开发使⽤,如果我们要⾃定义引擎) 
./gn --ios --unoptimized --runtime-mode=release 
#模拟器版本 
./gn --ios --simulator --unoptimized 
#主机端(Mac)构建
./gn --unoptimized

通过Ninja编译得到最后的产物Flutter.frameworkFlutter.framework即为 Flutter Engine 部分的代码,由 C++ 编译而成。

image.png

已经构建好了,那么就开始使用Ninja来编译吧~

ninja -C host_debug_unopt && 
ninja -C ios_debug_sim_unopt && 
ninja -C ios_debug_unopt && 
ninja -C ios_release_unopt

编译结束之后,就出现了一个Xcode工程,此时我们就可以使用Xcode来探索引擎的源码了。