一、下载引擎代码
(一)工具准备
- Chromium提供的部署工具depot_tools
depot_tools 套件包含许多git工作流增强工具,通过这些工具可以协同工作,任何人都可以熟练地处理Chromium的代码库
[图片上传失败...(image-7f507-1654869060068)]
-
github配置SSH
提示问题
git@github.com: Permission denied (publickey).
可能key过期,也就是配置到github上的公钥过期
也可能本地的私钥删除
这种情况下,重新配置,easy
-
cd ~/.ssh
-
vi known_hosts
-
删除里面的github部分
-
ssh-keygen -t rsa -b 4096 -C "email@qq.com" [生成一对新的公钥,私钥]
-
vi config
Host * AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/自己生成的私钥文件
-
ssh-add -K ~/.ssh/自己生成的私钥文件 (默认id_rsa, 避免与其他平台冲突,最好自己起一个) [将您的SSH私钥添加到ssh-agent并将密码短语存储在钥匙串中]
-
pbcopy < ~/.ssh/id_rsa.pub (或者自己起的名字)
-
登录个人github,头像 - Settings - SSH and GPG Keys - NEW SSH Key - 粘贴
-
-
brew 安装 ant工具
brew install ant
- brew 安装 ninja
brew install ninja
(二)下载引擎
-
新建flutter_engine目录(注意:路径不能有中文)
mkdir flutter_engine
-
创建gclient文件 (通过gclient下载源码)
touch .glient
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "git@github.com:flutter/engine.git@caaafc5604ee9172293eb84a381be6aadd660317",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
执行 glient sync
cat ~/Developer/kit/flutter/bin/internal/engine.versio
caaafc5604ee9172293eb84a381be6aadd660317
用这个结果去替换 .glient 中 'flutter/engine.git@' 后面的长字符串, 此处用的是 3.0.1 (版本一致)
image.png
(三)升级操作
如果已有engine源码,但是版本不一致,通过配置 sync来解决 (M1的话还是再等等吧,目前3.0.1稳定版 M1还做不到完美engine调试)
- cat ~/Developer/kit/flutter/bin/internal/engine.versio 拿到当前flutter引擎版本号
- 粘贴覆盖 .glient 文件 'flutter/engine.git@'后面的长串部分
- 进入到 flutter_engine/src/flutter 目录,
- 执行一次 git pull
- 然后 git reset --hard caaafc5604ee9172293eb84a381be6aadd660317
- 回到 flutter_engine目录,gclient sync --with_branch_heads --with_tags --verbose
二、编译引擎代码
image.png
ninja 构建
#构建iOS设备使用的引擎
#真机debug版本
./gn --ios --unoptimized
#真机release版本
./gn --ios -unoptimized --runtime-mode=release
#模拟器版本
./gn --ios -simulator --unoptimized
#主机端(Mac)构建 -- 热重载
./gn --unoptimized
flutter_engine/src/out 目录下产生4个文件
image.png
进入到 flutter_engine/src/out目录,使用ninja编译工程 (相当耗时....)
ninja -C host_debug_unopt && ninja -C ios_debug_sim_unopt && ninja -C
ios_debug_unopt && ninja -C ios_release_unopt
三、配置iOS项目代码
创建一个flutter项目,运行
xcode启动ios项目 - Runner
配置脚本
temp.png
执行脚本,build 脚本target
temp.png
四、Xcode编译项目能debug关键
iOS Runner项目 build 启动, 启动阶段,操作pause programexecution
temp1.png
lldb设置符号断点
temp.png
键入c 回车,跳过,正常启动
继续键入c,跳过汇编
temp.png
temp.png
look, 调试的log信息出来了...
打开ninja编译到 模拟器xcode工程
open flutter_engine/src/out/ios_debug_sim_unopt/flutter_engine.xcodeproj
temp.png
之前调试是在 创建的fluuter项目/ios工程Runner里添加的调试log
vs
同时在 flutter_engine源码编译的 模拟器项目里 找到了修改的调试log代码
肯定的是,编译调试engine的目的是达到了,接下来就是搞清楚为什么了
out/engine编译的模拟器xcode项目里 touchesBegan 目的代码部分, command + shift + J,导航侧栏显示文件 - finder查看
image.png
最终调试改动的代码 存在与 flutter_engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
VS
而engine源码编译的xcode工程 在
flutter_engine/src/out/ios_debug_sim_unopt
至此,也就是,刚才,engine通过同一份源码,编译出4种xcode工程,源码共享一份
为什么能关联起来,Flutter引擎源码分析(二) - channel原生通信
网友评论