资讯详情

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

请添加图片描述

一、下载引擎代码

(一)工具准备

  • Chromium提供的部署工具depot_tools

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

  • 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 (版本一致)

(三)升级操作

如果已有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

二、编译引擎代码

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个文件

进入到 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 配脚本

执行脚本,build 脚本target

四、Xcode编译项目能debug关键

iOS Runner项目 build 启动, 启动阶段,操作pause programexecution

lldb设置符号断点

键入c 回车,跳过,正常启动 继续键入c,跳过汇编

look, 调试的log信息出来了…

打开ninja编译到 模拟器xcode工程

open flutter_engine/src/out/ios_debug_sim_unopt/flutter_engine.xcodeproj

之前调试是在 创建的fluuter项目/ios工程Runner里添加的调试log

vs

同时在 flutter_engine源码编译的 模拟器项目里 找到了修改的调试log代码

肯定的是,编译调试engine的目的是达到了,接下来就是搞清楚为什么了

out/engine编译的模拟器xcode项目里 touchesBegan 目的代码部分, command + shift + J,导航侧栏显示文件 - finder查看

最终调试改动的代码 存在与 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原生通信

标签: gn丝印三极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台