macOS Big Sur(11.6.2/11.7.1) 编译Flutter engine

准备同步代码:

$ cd ~

$ mkdir flutter_engine

$ cd flutter_engine

# 检出构建依赖
# git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
# 国内用户可从gitlab中检出
$ git clone https://gitlab.com/chromiumsrc/depot_tools.git

# 添加到搜索路径
$ export PATH=$PATH:`pwd`/depot_tools

生成配置代码同步配置文件:

$ vim .gclient

内容如下:

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

注意,上面的 name 字段不能变更,否则会在同步代码的时候报错

________ running 'python3 src/flutter/tools/pub_get_offline.py' in '~/flutter_engine'
/usr/local/bin/python3: can't open file '~/flutter_engine/src/flutter/tools/pub_get_offline.py': [Errno 2] No such file or directory
Error: Command 'python3 src/flutter/tools/pub_get_offline.py' returned non-zero exit status 2 in ~/flutter_src
/usr/local/bin/python3: can't open file '~/flutter_engine/src/flutter/tools/pub_get_offline.py': [Errno 2] No such file or directory

执行代码同步命令(国内需要配置代理):

$ gclient sync -D --force --reset

# 同步时间超长,要花费几个小时,同步代码约16-17GB,压缩之后约8.75GB

# 如果已经执行过同步,代码会被锁定到以前拉取到的某个特定版本。
# 如果想更新到主分钟的最新代码,目前没有很好的办法,只能先整个删除src目录,再次执行同步命令

# 当然,如果需要更新flutter的代码,相关依赖不更新的情况下,
# 也可以直接在src/flutter目录下执行git pull 命令来手动更新

从源代码开始构建:

$ cd src

$ ./flutter/tools/gn --ios --unoptimized

# 编译配置文件生成在out目录下

# 执行编译
$ ninja -C out/ios_debug_unopt

$ ./flutter/tools/gn --android --unoptimized

$ ninja -C out/android_debug_unopt

# release 
$ ./flutter/tools/gn --android --runtime-mode=release

$ ninja -C out/android_release

# 生成的 libflutter.so 很大,被压缩后的在 lib.stripped 目录下,但是这个版本的符号还在,进一步压缩可以移除符号

一般情况下我们使用的是官方版本的引擎,如果需要调试 libflutter.so 里面的符号,可以在flutter_infra页面直接下载带有符号表的SO文件,根据打包时使用的Flutter工具版本下载对应的文件即可。

比如2.8.1版本:

$ flutter --version # version命令可以看到Engine对应的版本 06afdfe54e
Flutter 2.8.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 77d935af4d (3 周前) • 2021-12-16 08:37:33 -0800
Engine • revision 890a5fca2e
Tools • Dart 2.15.1

$ cat `dirname $(which flutter)`/internal/engine.version # flutter安装目录下的engine.version文件也可以看到完整的版本信息 890a5fca2e34db413be624fc83aeea8e61d42ce6
890a5fca2e34db413be624fc83aeea8e61d42ce6

拿到引擎版本号后在https://console.cloud.google.com/storage/browser/flutter_infra_release/flutter/890a5fca2e34db413be624fc83aeea8e61d42ce6/ 看到该版本对应的所有构建产物,下载android-arm-release、android-arm64-release和android-x86目录下的symbols.zip。

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注