曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

搭建Flutter引擎源码调试环境

最近在排查问题的时候总会遇到一些和 Flutter 引擎相关的问题,需要直接能在Xcode里面挂在引擎的源码能进行断点Debug,这里记录一下搭建Flutter引擎源码调试环境过程:

环境准备

1、开发工具

(1)下载depot_tools工具包

depot_tools 是 chromium 使用的源码库管理工具,可以方便的管理源码以及对应依赖,通过gclinet可以获取所有的编译需要的源码和依赖

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:/Users/zengjing/flutter_source/depot_tools

(2)安装Ninja

编译工具,负责对项目进行编译生成对应的产物

brew install ninja
2、下载源码

(1)创建engine目录,在目录下创建.gclient配置文件,文件内容如下:

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

目录结构如下:

flutter_source
├── depot_tools
├── engine
│   ├── .gclient

(2)下载Flutter Engine源码

进入engine目录,执行如下命令获取Flutter所有依赖(耗时比较长,可能需要一个多小时):

cd engine
gclient sync

(3)同步Flutter Engine代码

cd engine/src/flutter
git remote add upstream https://github.com/flutter/engine.git
git pull upstream master
3、下载指定的Engine版本源码

(1)获取指定的Engine的版本号

cat $FLUTTER_SDK_PATH/bin/internal/engine.version

2dce47073a378673f6ca095e91b8065544c3a881

(2)切换源码到指定的Commit

cd engine/src/flutter
git reset --hard ${engine.version}

git reset –hard 2dce47073a378673f6ca095e91b8065544c3a881

(3)下载相关的依赖

cd engine/src/flutter
gclient sync --with_branch_heads --with_tags

生成工程

cd engine/src

./flutter/tools/gn --unoptimized # host_debug_unopt
./flutter/tools/gn --runtime-mode=debug --ios --simulator --unoptimized # 模拟器Debug
./flutter/tools/gn --runtime-mode=debug --ios --ios-cpu=arm64 --unoptimized # 设备Debug
./flutter/tools/gn --runtime-mode=release --ios --ios-cpu=arm64 # 设备Release

参数说明:

  • (1)--unoptimized: 是否优化性能,默认优化
  • (2)--runtime-mode: 可选值debug/profile/release/jit_release
  • (3)--target-os: 指定编译产物的平台,可选值android/ios/linux/fuchsia/win/winuwp
  • (4)--ios: iOS设备
  • (5)--ios-cpu: 可选值arm/arm64
  • (6)--simulator: iOS模拟器
  • (7)--simulator-cpu: 可选值x64/arm64
  • (8)--android: Android
  • (9)--android-cpu: 可选值arm/x64/x86/arm64

编译

cd engine/src

ninja -C out/host_debug_unopt
ninja -C out/ios_debug_sim_unopt
ninja -C out/ios_debug_unopt
ninja -C out/ios_release

调试

1、生成测试的工程

flutter create -i objc -a java flutter_demo
flutter run --local-engine-src-path=/Users/zengjing/flutter_source/engine/src --local-engine=ios_debug_sim_unopt --verbose

2、把 ios_debug_sim_unoptios_debug_unopt 里面的 flutter_engine.xcodeproj 拖进需要调试的Demo工程目录

3、在Genrated.xcconfig中加上内容为

FLUTTER_ENGINE=/Users/zengjing/flutter_source/engine/src
LOCAL_ENGINE=ios_debug_sim_unopt

参考资料

1、Compiling the engine

2、怎样的Flutter Engine定制流程,才能实现真正“开箱即用”?

最近的文章

Jenkins多节点同步CocoaPods索引

CocoaPods的索引库更新一直以来是一件很痛苦的事情,为了提升效率在项目中引入了镜像索引库的方案,将项目用到的第三方库的podspec配置自动抽取到一个镜像索引库里面。这个方案确实降低了大家在同步索引库的耗时,但是在构建环境下存在较多的问题。现在是要去多台 Macos 节点 需要定期同步 CocoaPods 的索引。同步索引库直接通过命令 ` pod repo update xxx ` 就能解决,如果要多个节点同步那么使用 Pipeline 的任务每个节点执行脚本就可以了,具体的代码如...…

Note继续阅读
更早的文章

如何将自己的Node.js包发布到npm上面

早前写过一篇《使用Verdaccio搭建npm仓库》介绍如何搭建私有的npm包托管的环境的文章,比较适合将私有的Node.js包发布上去。本文主要记录一下发布一个公开的package到npm的过程。1、注册账号前往https://www.npmjs.com注册账号,并按照要求验证邮箱。2、Node.js包创建package.json文件,如下:{ "name": "gitlab-systemhook-handler", "version": "0.1.0", "description...…

Note继续阅读