depot_tools depot_tools是Chromium的源码管理工具,后续获取源码和构建编译都需要用到。
安装流程: 切换到想要存放的路径执行clone命令(需要代理)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
配置环境变量
在~/.bashrc或~/.zshrc文件中加上:
export PATH=[存放的路径]/depot_tools:$PATH
源码Clone
1、fork Flutter Engine到自己的Github仓库
2、创建引擎存放目录、添加.gclient文件(最好在终端打开隐藏文件,这样好操作,打开命令自己搜)
mkdir engine
cd engine
touch .gclient
.gclient内容如下(替换为自己的Github Flutter Engine仓库,就是第一步fork的仓库SSH,没有配置密钥的话,用HTTP)
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "git@github.com:<YOUR_NAME>/engine.git",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
3、同步代码
gclient sync
同步代码过程较为漫长(总共22G左右),当进度为100%时,依然会下载4~5个G的内容,请不要中断,可以在活动监视器中观察网络使用情况。
与官方仓库关联
1、查看当前远程仓库
cd src/flutter
git remote -v
origin git@github.com:<YOUR_NAME>/engine.git (fetch)
origin git@github.com:<YOUR_NAME>/engine.git (push)
2、添加指向官方仓库的upstream 这里没配置SSH的可以拉去Https的网址自己去git找
git remote add upstream git@github.com:flutter/engine.git
3、查看origin和upstream
git remote -v
origin git@github.com:<YOUR_NAME>/engine.git (fetch)
origin git@github.com:<YOUR_NAME>/engine.git (push)
upstream git@github.com:flutter/engine.git (fetch)
upstream git@github.com:flutter/engine.git (push)
4、从原仓库拉取代码并直接合并代码git checkout tags/xxx
git pull upstream
匹配版本
1、在实际开发中,一般不直接使用master的代码直接编译,都是需要获取指定版本的engine代码。可以通过本地安装的Flutter SDK版本来获取所对应的engine版本。
flutter channel stable//切换通道到稳定版
flutter upgrade //升级flutter sdk 到最新
cat dev/flutter/bin/internal/engine.version //获取当前版本commit id
1837b5be5f0f1376a1ccf383950e83a80177fb4e
2、切换分支同步代码
cd engine/src/flutter
git reset --hard 1837b5be5f0f1376a1ccf383950e83a80177fb4e
gclient sync -D --with_branch_heads --with_tags -v
本次 sync 时间较长(本人梯子6-8M/s要等待大概10分钟左右),依然要同步4~5个G的内容,请耐心等待。我的经验是关注活动监视器网络情况,如果收到数据速度小于梯子正常速度,中断后再次执行同步命令即可。
编译
一、创建目标工程
IOS
准备构建文件 cd engine/src
1.1 生成构建所需文件
1.1.1 主机端
./flutter/tools/gn --unoptimized --mac-cpu arm64
1.1.2 iOS端
- 真机调试
./flutter/tools/gn --ios-cpu=arm64 --unoptimized
1.2 完成构建编译
- 真机调试
ninja -C out/ios_debug_unopt_arm64 & ninja -C out/host_debug_unopt_arm64
首次构建编译比较耗时,CPU会满载(冬天很好电脑可以当暖手宝了)。后面调试过程中,如果修改了源码需要重新执行构建编译命令。如果文件有增删,需要重新执行前面生成构建所需文件的命令。
2. Xcode调试
准备一个用于调试的Flutter项目,以下命令都在该项目目录路径下执行。
2.1 设置本地引擎
flutter build ios --local-engine-src-path /xxx/xxx/engine/src --local-engine=ios_debug_unopt --local-engine-host=host_debug_unopt_arm64 --config-only
设置成功后,Flutter项目下的ios/Flutter/Generated.xcconfig文件会增加以下设置:
FLUTTER_ENGINE=/xxx/engine/src
LOCAL_ENGINE=ios_debug_xxx
2.2 导入引擎项目 检查Xcode项目是否存在工作空间 如果用于调试的Flutter项目不存在ios/Runner.xcworkspace文件,可以先随意依赖一个Flutter插件库,然后执行前面的flutter run ...命令快速创建工作空间。注意,不能用Android Studio直接运行Flutter项目,否则项目本地引擎设置会被重置。
导入引擎项目到工作空间(任选一种方式) 简单拖拽 用Xcode打开用于调试的Flutter项目(打开ios/Runner.xcworkspace文件),将ios_debug_xxx目录下的flutter_engine.xcodeproj文件拖到Xcode的左侧项目导航区:
若修改了代码请执行(一定要重新编译)不然没效果 重新编译引擎源码,再看效果:
ninja -C out/xxxxx
因为我flutter调试unity游戏的手势,修改源代码需要上架,所以engine/src目录下的文件要生成release的
./flutter/tools/gn --runtime-mode=release --ios-cpu=arm64 --unoptimized //主机端
./flutter/tools/gn --ios --runtime-mode=release --ios-cpu=arm64 --unoptimized //iOS端
ninja -C out/ios_release_unopt & ninja -C out/host_release_unopt