Flutter引擎源码分析(一) - 编译调试

·  阅读 3451
Flutter引擎源码分析(一) - 编译调试

一、下载引擎代码

(一)工具准备

git clone chromium.googlesource.com/chromium/to…

注意:科学上网

depot_tools 套件包含许多git工作流增强工具,通过这些工具可以协同工作,任何人都可以熟练地处理Chromium的代码库 image.png

  • github配置SSH

    提示问题

    git@github.com: Permission denied (publickey).

    可能key过期,也就是配置到github上的公钥过期

    也可能本地的私钥删除

    这种情况下,重新配置,easy

    1. cd ~/.ssh

    2. vi known_hosts

    3. 删除里面的github部分

    4. ssh-keygen -t rsa -b 4096 -C "email@qq.com" [生成一对新的公钥,私钥]

    5. vi config

       Host *
      
         AddKeysToAgent yes
         UseKeychain yes
         IdentityFile ~/.ssh/自己生成的私钥文件
      复制代码
    6. ssh-add -K ~/.ssh/自己生成的私钥文件 (默认id_rsa, 避免与其他平台冲突,最好自己起一个) [将您的SSH私钥添加到ssh-agent并将密码短语存储在钥匙串中]

    7. pbcopy < ~/.ssh/id_rsa.pub (或者自己起的名字)

    8. 登录个人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
复制代码

三、配置项目代码

创建一个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原生通信

分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改