准备同步代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ 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 |
生成配置代码同步配置文件:
1 |
$ vim .gclient |
内容如下:
1 2 3 4 5 6 7 8 9 10 |
solutions = [ { "managed": False, "name": "src/flutter", "url": "https://github.com/flutter/engine.git", "custom_deps": {}, "deps_file": "DEPS", "safesync_url": "", }, ] |
注意,上面的 name 字段不能变更,否则会在同步代码的时候报错
1 2 3 4 |
________ 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 |
执行代码同步命令(国内需要配置代理):
1 2 3 4 5 6 7 8 9 |
$ gclient sync -D --force --reset # 同步时间超长,要花费几个小时,同步代码约16-17GB,压缩之后约8.75GB # 如果已经执行过同步,代码会被锁定到以前拉取到的某个特定版本。 # 如果想更新到主分钟的最新代码,目前没有很好的办法,只能先整个删除src目录,再次执行同步命令 # 当然,如果需要更新flutter的代码,相关依赖不更新的情况下, # 也可以直接在src/flutter目录下执行git pull 命令来手动更新 |
从源代码开始构建:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ 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版本:
1 2 3 4 5 6 7 8 |
$ 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。