Flutter Engine 编译与调试(2024)针对iOS真机调试

494 阅读4分钟

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的左侧项目导航区:

image.png

若修改了代码请执行(一定要重新编译)不然没效果 重新编译引擎源码,再看效果:

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