Flutter Engine 编译 —— 我是这样读源码的

级别: ★☆☆☆☆
标签:「Flutter」「Engine」
作者: sunhao
审校: QiShare团队


前言:
之前的文章包括 Flutter Platform ViewFlutterPlatform Channel,都遇到了一些 Framwork 对 Engine 层的调用,本篇就讲讲我们如何来编译 Flutter Engine ,来对源码进行编译,使用 IDE 进行加载阅读。

本文处理方式以官方配置为主,可能会更多的注重一些细节。读者可以直接参考官方文档进行编译。

Setting up the Engine development environment
https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment

笔者以 macOS 进行编译,所以这里仅提供 macOS 的编译步骤。

在开始编译之前,还希望你能准备好梯子,否则你可能卡在 ninja -C 中。

通畅的网络很重要!!!

通畅的网络很重要!!!

通畅的网络很重要!!!

编译 Flutter Engine

安装 depot_tools

$ pwd
/Users/sunhao/developmchromium.googlesource.com/chromium/tools/depot_tools.git

配置环境变量:建议在 ~/.bash_profile 文件中添加

export PATH=/Users/sunhao/development/depot_tools/:$PATH

然后执行

$ source ~/.bash_profile 

当然,你也可以配置临时环境变量

$ export PATH=$PATH:/Users/sunhao/development/depot_tools/

2、将 engine 项目 fork 到自己的github

关于 github 的使用,这里不多说了,fork 过来,添加 github 的 ssh key 信任。

我这里的地址为:https://github.com/loosaSH/engine

3、创建项目目录

你可以创建一个目录,名称推荐为 engine,后面的步骤会自动执行 clone 。

$ pwd
/Users/sunhao/development
$ mkdir engine

4、创建 .gclient 文件

进入engine 目录,创建 .gclient 文件

$ cd engine
$ vim .gclient

写入如下内容:

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

将 <your_name_here> 换成你的 GitHub 名字,例如我的是:

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

:wq 保存退出。

5、执行 gclient sync 命令

这里的执行需要梯子,速度根据你的网络状况,同步下来的文件大小大概有 10G 多吧

$ pwd
/Users/sunhao/development/engine
$ gclient sync

需要注意的是,这里需要等待文件自动完成,并且尽量不要打断该命令,显示 100% 后仍有很多操作。

6、重新 fetch flutter/engine 仓库

$ cd src/flutter
$ pwd
/Users/sunhao/development/engine/src/flutter
$ git remote add upstream git@github.com:flutter/engine.git

7、安装辅助工具

安装 JDK 1.8 以上

ant 安装

$ brew install ant

8、编译 android 相关

确保本地 flutter/engine 仓库是最新的

$ pwd
/Users/sunhao/development/engine/src/flutter
$ git pull upstream master
$ cd /Users/sunhao/development/engine
$ gclient sync

执行以下命令编译

// 准备文件,生成 compile_commands.json 文件
$ ./flutter/tools/gn --unoptimized
$ ./flutter/tools/gn --android --unoptimized
// 构建
$ ninja -C out/android_debug_unopt && ninja -C out/host_debug_unopt

整个过程比较漫长,耐心等待。

9、编译 iOS 相关

确保本地 flutter/engine 仓库是最新的

$ pwd
/Users/sunhao/development/engine/src/flutter
$ git pull upstream master
$ cd /Users/sunhao/development/engine
$ gclient sync

执行以下命令编译

// 准备文件,生成 compile_commands.json 文件
$ ./flutter/tools/gn --ios --unoptimized
$ ./flutter/tools/gn --unoptimized
// 构建
$ ninja -C out/ios_debug_unopt && ninja -C out/host_debug_unopt

这样 flutter engine 的编译工作就基本完成了。生成的一些编译文件目录为 src/out 。

阅读 Engine 代码 ——Clion

个人认为 Clion 来阅读 C++ 代码比较方便,并且打开速度明显要快于 VSCode

操作比较简单,将上面生成的 compile_commands.json 文件复制到 src/flutter 目录中,然后使用 Clion 打开项目,indexing 之后便可以跟踪跳转(这一步可能也要一点时间)

阅读 Engine 代码 ——VSCode

官方推荐使用 cquery 进行对 engine 的源码依赖跟踪,

1、cmake 安装

安装 cquery 的过程中需要使用到 cmake

$ brew install cmake

2、cquery 安装

$ brew install --HEAD cquery

编译 cquery 源码

https://github.com/cquery-project/cquery/wiki/Building-cquery

$ pwd
/Users/sunhao/development
$ git clone --recursive https://github.com/cquery-project/cquery.git
$ cd cquery
$ git submodule update --init
$ mkdir build 
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=release -DCMAKE_EXPORT_COMPILE_COMMANDS=YES
$ cmake --build .
$ cmake --build . --target install

3、配置 cquery 环境变量

配置环境变量:建议在 ~/.bash_profile 文件中添加

export PATH=/Users/sunhao/development/cquery/build/release/bin:$PATH

然后执行

$ source ~/.bash_profile 

3、安装 VSCode、以及cquery插件

4、拷贝 cquery 需要的项目配置文件

将 compile_commands.json 文件从 src/out/compile_commands.json 拷贝到 src/

5、配置 VSCode 设置(还是使用clion吧,舒服多了)

https://github.com/cquery-project/cquery/wiki/Visual-Studio-Code#setting-up-the-extension

因为我们配置了全局的环境变量,所以可以根据官方的推荐设置一些 highlighting。

在 VSCode 中打开 settings.json,在 json 中增加:

    "cquery.highlighting.enabled.types": true,
    "cquery.highlighting.enabled.freeStandingFunctions": true,
    "cquery.highlighting.enabled.memberFunctions": true,
    "cquery.highlighting.enabled.freeStandingVariables": true,
    "cquery.highlighting.enabled.memberVariables": true,
    "cquery.highlighting.enabled.namespaces": true,
    "cquery.highlighting.enabled.macros": true,
    "cquery.highlighting.enabled.enums": true,
    "cquery.highlighting.enabled.typeAliases": true,
    "cquery.highlighting.enabled.enumConstants": true,
    "cquery.highlighting.enabled.staticMemberFunctions": true,
    "cquery.highlighting.enabled.parameters": true,
    "cquery.highlighting.enabled.templateParameters": true,
    "cquery.highlighting.enabled.staticMemberVariables": true,
    "cquery.highlighting.enabled.globalVariables": true,

这样你就可以在 VSCode 中跟踪 flutter/engine 代码了。

总结

阅读源码只是第一步,后面我会分享关于如何使用本地的 Flutter Engine 以及如何进行调试。

参考资料:
Setting up your engine development environment
https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment
Compiling the engine
https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment
Building cquery
https://github.com/cquery-project/cquery/wiki/Building-cquery
Contributing to Flutter
https://github.com/flutter/flutter/blob/master/CONTRIBUTING.md


推荐文章:
WebSocket 双端实践(iOS/ Golang)
今天我们来聊一聊WebSocket(iOS/Golang)
用 Swift 进行贝塞尔曲线绘制
Swift 5.1 (11) - 方法
Swift 5.1 (10) - 属性
iOS App后台保活
奇舞周刊

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