flutter engine编译,方便阅读源码

获取Depot_tools脚本工具集

depot_tools是google用来管理Chromium源码的工具集,主要有gclient、ninja、repo等。gclient和repo都是用来检出项目源码的脚本。gclient主要依赖于.gclient与DEPS2个配置违建进行源码的依赖检出。而repo主要依赖于manifest.xml配置文件进行项目模块源码检出。

获取工具集

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

上面下载的时候会报443,是因为我们下载的是外网项目,可以给Git配置代理:

git config --global http.proxy 'http://127.0.0.1:1087'

git config --global https.proxy 'socks://127.0.0.1:1080'

这里可以看一下自己的代理软件,是不是对应的端口。

clone成功之后配置一下环境变量,就可以使用命令了

export PATH=$PATH:/path/depot_tools

检出Flutter Engine源码

这里由于github下载较慢,使用gitee进行下载的。

git clone https://gitee.com/lao_mao_the_only_one/flutter-engine.git

获取Flutter Engine依赖的源码

在上面clone下来的项目中新建一个.gclient文件

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

上面的url改成自己Fork的Flutter Engine的地址

之后,在engine目录下进行gclient sync

cd flutter_engine
gclient sync

上面由于要访问外网,可能会失败,需要配置代理,上面只是配置了git的代理,这里可以给终端配置一下代理:

export http_proxy=http://127.0.0.1:1087
export https_proxy=socks://127.0.0.1:1080

可以通过如下验证配置是否成功:

curl -I www.google.com

如果打印出网页信息,说明成功。

注意:export可以在bash中配置,这样是全局有效,也可以在命令行中配置,只是在当前命令窗口中有效。

切分支

在我们使用的Flutter SDK中找到该版本对应的commit id

bin/internal/engine.version // 在该目录下可以看到

切换到engine/src/flutter目录下,执行:

git reset --hard 2f0af3715217a0c2ada72c717d4ed9178d68f6ed
gclient sync --with_branch_heads --with_tags

我使用的Flutter SDK是1.22.6版本,在执行上面命令后会报错:

failed to resolve flutter_internal/android/sdk/licenses@latest (line 28): prefix "flutter_internal/android/sdk/licenses" doesn't exist or not visible to unauthenticated callers

这是因为你没有权限,只有谷歌的开发者才能直接构建,在github是有该issues,暂未解决:

https://github.com/flutter/flutter/issues/72108

之后我使用了v1.12.13-hotfixes版本没问题了,该版本对应的commit_id:

af51afceb8886cc11e25047523c4e0c7e1f5d408

编译Engine

准备构建文件

cd src  //进入src目录
./flutter/tools/gn --runtime-mode profile //生成Host编译产物存放文件
./flutter/tools/gn --android --runtime-mode profile //生成Android编译产物存放文件

执行上面命令会在src/out目录下生成相应的文件夹,用于存放该平台的编译产物

构建可执行文件

ninja -C out/host_profile -j 6
ninja -C out/android_profile -j 6

使用本地引擎运行Flutter应用

flutter run --local-engine-src-path /engine/src --local-engine=android_profile

IDE配置

个人编译flutter engine主要为了方便阅读源码,所以上面几步只是做了简单记录,在我们使用了./flutter/tools/gn编译引擎后,就会在src/out下生成compile_commands.json 文件

  • 将compile_commands.json文件拷贝到src/flutter目录下
  • 使用Clion打开src/flutter目录,就可以识别到compile_commands.json,代码就有跳转的能力了。

参考文档

  • http://gityuan.com/2019/08/03/flutter_engine_setup/
  • http://zhengxiaoyong.com/2019/03/16/Flutter-Engine%E4%B8%8ESDK%E7%9A%84%E5%AE%9A%E5%88%B6%E5%8C%96%E4%B8%8E%E7%BC%96%E8%AF%91/

你可能感兴趣的:(flutter engine编译,方便阅读源码)