2021-11-01 Flutter Engine编译与调试

1 ,安装 Chromium 的depot_tools

我的目录是在/opt下面

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

修改环境变量

vi ~/.bash_profile
export PATH=$PATH:/opt/depot_tools

2, 下载 buildroot

我测试flutter engine编译的目录是/Volumes/huc/dartvm/flutter_engine

在此目录下面创建名为.gclient的文件, 提前到github上fork engine项目到github.com/hc2088/engine.git自己的账号下:

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

执行

cd /Volumes/huc/dartvm/flutter_engine/
gclient sync 

执行完成之后,会生成一个src目录,对应的就是buildroot 的git仓库

cd src
 git remote -v
origin  https://github.com/flutter/buildroot.git (fetch)
origin  https://github.com/flutter/buildroot.git (push)

src/flutter 对应就是flutter engine的git仓库

cd src/flutter
git remote -v
origin  git@github.com:hc2088/engine.git (fetch)
origin  git@github.com:hc2088/engine.git (push)

3,确认flutter engine与flutter 版本是否一致

我的flutter 装在/Volumes/huc/dartvm/flutter目录下

which flutter 
/Volumes/huc/dartvm/flutter/bin/flutter
cd /Volumes/huc/dartvm/flutter
cat bin/internal/engine.version 
3a0a63c2d2098fffe4dc2fa161e265420bdfbb25

修改flutter engine仓库的版本

cd  /Volumes/huc/dartvm/flutter_engine/src/flutter
git reset --hard 3a0a63c2d2098fffe4dc2fa161e265420bdfbb25

4, 下载 依赖

在src目录下,重新拉取依赖

pwd
/Volumes/huc/dartvm/flutter_engine/src
gclient sync

这一步会把dart sdk的源代码项目下载到下面目录:

src/third_party/dart  

pwd
/Volumes/huc/dartvm/flutter_engine/src/third_party/dart

git remote -v
origin  https://dart.googlesource.com/sdk.git (fetch)
origin  https://dart.googlesource.com/sdk.git (push)

image.png

注意执行这一步,会比较慢:Syncing projects done完成之后,不要终止进程,继续等后面任务执行完:

huchu58:src huchu$ gclient sync
23>WARNING: subprocess '"git" "-c" "core.deltaBaseCacheLimit=2g" "clone" "--no-checkout" "--progress" "https://dart.googlesource.com/sdk.git" "/Volumes/huc/dartvm/flutter_engine/src/third_party/_gclient_dart_0aepvjce"' in /Volumes/huc/dartvm/flutter_engine failed; will retry after a short nap...
53>WARNING: subprocess '"git" "-c" "core.deltaBaseCacheLimit=2g" "fetch" "origin" "--no-tags"' in /Volumes/huc/dartvm/flutter_engine/src/third_party/pkg/vector_math failed; will retry after a short nap...
Syncing projects:  50% (65/129) src/third_party/pkg/vector_math
[0:01:40] Still working on:
[0:01:40]   src/third_party/dart
//......
Syncing projects: 100% (129/129), done.                                         
///这里需要等
Hook 'python3 src/flutter/tools/pub_get_offline.py' took 21.91 secs
Running hooks:  88% ( 8/ 9) Download prebuilt Dart SDK
Hook 'python3 src/flutter/tools/download_dart_sdk.py' took 195.20 secs
Running hooks: 100% (9/9), done.  

5, 准备构建文件

使用预先构建的dart sdk: (默认的是--prebuilt-dart-sdk)

cd src
./flutter/tools/gn --ios --unoptimized --prebuilt-dart-sdk
./flutter/tools/gn --unoptimized --prebuilt-dart-sdk

使用dart sdk源代码,现编译的dart sdk:
改成--no-prebuilt-dart-sdk

huchu58:src huchu$ ./flutter/tools/gn --ios --unoptimized --no-prebuilt-dart-sdk
GOMA usage was specified but can't be found, falling back to local builds. Set the GOMA_DIR environment variable to fix GOMA.
Generating GN files in: out/ios_debug_unopt
Generating Xcode projects took 405ms
Generating compile_commands took 79ms
Done. Made 564 targets from 213 files in 9560ms
huchu58:src huchu$ ./flutter/tools/gn --unoptimized --no-prebuilt-dart-sdk
GOMA usage was specified but can't be found, falling back to local builds. Set the GOMA_DIR environment variable to fix GOMA.
Generating GN files in: out/host_debug_unopt
Generating Xcode projects took 447ms
Generating compile_commands took 91ms
Done. Made 931 targets from 260 files in 5531ms

6, 构建 engine

huchu58:src huchu$ ninja -C out/ios_debug_unopt && ninja -C out/host_debug_unopt
ninja: Entering directory `out/ios_debug_unopt'
[1362/1362] STAMP obj/default.stamp
ninja: Entering directory `out/host_debug_unopt'
[6208/6208] STAMP obj/default.stamp

输出:

src/out/host_debug_unopt
src/out/ios_debug_unopt

7, flutter app集成自定义engine

创建flutter app

cd ~/Desktop
flutter create xxapp
flutter run --local-engine=ios_debug_unopt --local-engine-src-path=/Volumes/huc/dartvm/flutter_engine/src

使用--config-local,不编译只是修改xcode LOCAL_ENGINE 和相关插件的配置,加快速度。

flutter build ios --local-engine=ios_debug_unopt --config-only --local-engine-src-path=/Volumes/huc/dartvm/flutter_engine/src

flutter app native端确认用的flutter engine

打开Runner.xcworkspace工程:
/Users/huchu/Desktop/xxapp/ios/Runner.xcworkspace

问题:怎么都不进断点 -[FlutterEngine runWithEntrypoint:]

8,xcode集成原理

run 项目时候,xcode先后调用以下脚本:

/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed_and_thin

这里的FLUTTER_ROOT是/Volumes/huc/dartvm/flutter
主要作用是确认dart 是/Volumes/huc/dartvm/flutter/bin/dart
读取在flutter build/run这一步配置好的相关变量值:

image.png

然后会生成flutter_export_environment.sh 文件,flutter_export_environment.sh 使得变量有效:

#!/bin/sh
# This is a generated file; do not edit or check into version control.
export "FLUTTER_ENGINE=/Volumes/huc/dartvm/flutter_engine/src"
export "LOCAL_ENGINE=ios_debug_unopt"
#其他内容这里就不粘贴了
....

可以看到/Volumes/huc/dartvm/flutter/packages/flutter_tools/bin/xcode_backend.dart文件有用到:

如果没有用自定flutter_engine

final String frameworkPath = '${environmentEnsure('FLUTTER_ROOT')}/bin/cache/artifacts/engine/$artifactVariant';
String flutterFramework = '$frameworkPath/Flutter.xcframework';

对应使用的engine 就是 flutter 自己同步的

image.png

咱们这里用了--local-engine

final String? localEngine = environment['LOCAL_ENGINE'];
 flutterFramework = '${environmentEnsure('FLUTTER_ENGINE')}/out/$localEngine/Flutter.xcframework';

该路径指定了使用我们自定义的flutter_engine的产物:

image.png

flutter App dart端如何确认dart sdk
修改pubspec.yaml

dependency_overrides:
  sky_engine:
    path: /Volumes/huc/dartvm/flutter_engine/src/out/ios_debug_unopt/gen/dart-pkg/sky_engine

默认为:

/Volumes/huc/dartvm/flutter/bin/cache/pkg/sky_engine
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271