Flutter - 搭建引擎调试环境(iOS)

news2025/1/21 4:57:15

文章目录

  • 前言
  • 开发环境
  • 安装依赖环境
    • 1. python3
    • 2. depot_tools
  • 获取引擎项目
    • 1. 创建engine空目录
    • 2. 创建.gclient文件并配置
    • 3. 指定引擎版本
    • 4. 同步引擎源码
  • 搭建调试环境
    • 1. 构建编译
      • 1.1 生成构建所需文件
        • 1.1.1 主机端
        • 1.1.2 iOS端
      • 1.2 完成构建编译
    • 2. Xcode调试
      • 2.1 设置本地引擎
      • 2.2 导入引擎项目
      • 2.3 测试调试功能
  • 最后


前言

刚开始学Flutter开发时搭建过,没有记录。现在有需要时又忘了,果然好记性不如烂笔头。

注意,调试环境搭建会占用较大硬盘空间。粗略统计,Flutter引擎项目(包含依赖的第三方库)约20GB,host_debug_unopt构建编译后约16GB,ios_debug_xxx构建编译后约5GB。所以如果想搭建成功,至少需要准备41GB的剩余硬盘空间。

开发环境

  • macOS: 13.3.1
  • Flutter: 3.7.12
  • Xcode: 14.3

安装依赖环境

1. python3

后续很多工具依赖python环境,如果执行python3命令失败,那么需要先安装python3。可以通过官网下载安装或brew命令安装:

brew install python

安装过程可能会遇到这样的问题:

Error: python@3.11: the bottle needs the Apple Command Line Tools to be installed.
  You can install them, if desired, with:
    xcode-select --install

执行xcode-select --install命令安装Xcode命令行工具解决。

2. depot_tools

depot_tools是Chromium的源码管理工具,后续获取源码和构建编译都需要用到。

安装流程:

  1. 切换到想要存放的路径执行clone命令(需要代理)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
  1. 配置环境变量

~/.bashrc~/.zshrc文件中加上:

export PATH=[存放的路径]/depot_tools:$PATH

参考文档:

  • Getting dependencies
  • depot_tools_tutorial

获取引擎项目

按Flutter的文档应先fork项目,不过那是针对贡献者的流程,如果你只是调试,可以跳过这一流程。

1. 创建engine空目录

切换到想要存放Flutter引擎源码的位置新建engine目录:

mkdir engine

2. 创建.gclient文件并配置

切换到engine目录下执行:

touch .gclient

配置.gclient文件:

solutions = [{
	"managed": False,
	"name": "src/flutter",
	"url": "git@github.com:<your_name_here>/engine.git",
	"custom_deps": {},
	"deps_file": "DEPS",
	"safesync_url": "",
}, ]

<your_name_here>请按需替换,如果没有fork引擎项目,可以替换为flutter,如果有fork,可以替换为自己的Github账户名。

如果想了解这些配置的作用,参考官方文档:gclient file。

3. 指定引擎版本

前面的配置获取的是最新的Flutter引擎源码,但是Flutter引擎的调试离不开Flutter框架,如果版本不匹配可能会遇到一些问题,所以最好指定Flutter引擎版本为当前Flutter框架所需要的版本。那么这个版本怎么指定呢?

Flutter引擎版本其实就是commit id,可以在Flutter SDK目录/bin/internal/engine.version文件中获得。例如我当前电脑的Flutter版本是3.7.12engine.version文件位于/opt/homebrew/Caskroom/flutter/3.7.12/flutter/bin/internal/目录,引擎版本是:

1a65d409c7a1438a34d21b60bf30a6fd5db59314

既然Flutter引擎版本是commit id,那么就可以通过修改前面的配置指定版本。修改后:

solutions = [{
	"managed": False,
	"name": "src/flutter",
	"url": "git@github.com:<your_name_here>/engine.git@1a65d409c7a1438a34d21b60bf30a6fd5db59314",
	"custom_deps": {},
	"deps_file": "DEPS",
	"safesync_url": "",
}, ]

4. 同步引擎源码

engine目录下执行(需要代理):

gclient sync

项目有点大,大概需要下载10GB,其中很大一部分是在下载依赖的第三方库,后续编译也相当耗时。

同步成功后,engine目录下会有一个src目录,如果在这个路径下执行git log,会发现commit id好像有点不对:

commit 8747bce41d0dc6d9dc45c4d1b46d2100bb9ee688 (HEAD)
Author: Jenn Magder <magder@google.com>
Date:   Wed Nov 30 14:05:32 2022 -0800

    Sort macOS SDK paths to keep order stable between runs (#652)
...

别急,真正的引擎项目在src目录下的flutter目录。src目录中的项目是这个buildroot,用于搭建Flutter引擎的构建环境。

参考文档:

  • Getting the source

搭建调试环境

1. 构建编译

注意,以下所有命令都在engine/src目录路径下运行。

1.1 生成构建所需文件

1.1.1 主机端

flutter/tools/gn --unoptimized

生成的文件存放于engine/src/out/host_debug_unopt目录。

1.1.2 iOS端

  • 真机调试
flutter/tools/gn --ios --unoptimized

生成的文件存放于engine/src/out/ios_debug_unopt目录。

  • 模拟器调试
flutter/tools/gn --ios --simulator --unoptimized
# 如果是M系列芯片电脑,建议加上--simulator-cpu=arm64参数,用于支持arm64架构的模拟器
flutter/tools/gn --ios --simulator --simulator-cpu=arm64 --unoptimized

生成的文件存放于engine/src/out/ios_debug_sim_unoptengine/src/out/ios_debug_sim_unopt_arm64目录。

如果是M系列芯片电脑,没有加上--simulator-cpu=arm64参数,后续Xcode模拟器调试可能会遇到没有iOS设备可选择的情况:

screenshot1

解决方法:按这个步骤[Xcode菜单栏] -> [Product] -> [Destination] -> [Destination Architectures] -> [Show Both]操作,显示全部iOS模拟器。

以上只生成了Debug模式相关的文件用于后续调试,如果需要更多模式(Profile/Release等),可以参考文档Flutter’s modes或通过flutter/tools/gn -h命令了解更多用法。

1.2 完成构建编译

  • 真机调试
ninja -C out/ios_debug_unopt && ninja -C out/host_debug_unopt
  • 模拟器调试
ninja -C out/ios_debug_sim_unopt && ninja -C out/host_debug_unopt
# 如果前面使用了--simulator-cpu=arm64参数
ninja -C out/ios_debug_sim_unopt_arm64 && ninja -C out/host_debug_unopt

首次构建编译比较耗时,CPU会满载(电脑买来这么久一直没转过的风扇终于了有表现的机会😂)。后面调试过程中,如果修改了源码需要重新执行构建编译命令。如果文件有增删,需要重新执行前面生成构建所需文件的命令。

参考文档:

  • Compiling for iOS (from macOS)

2. Xcode调试

准备一个用于调试的Flutter项目,以下命令都在该项目目录路径下执行。

2.1 设置本地引擎

官方文档Debugging iOS builds with Xcode是通过flutter build命令设置:

flutter build ios --local-engine ios_debug_unopt --config-only

这种方式对于模拟器调试不是那么好用,所以我选择flutter run命令,设置项目本地引擎后还会运行一遍项目,在后续用Xcode调试时还能提前避免一些问题。

flutter run --local-engine=ios_debug_xxx --local-engine-src-path=/xxx/engine/src -d xxx
  • --local-engine:设置本地引擎名称,例如真机调试为ios_debug_unopt,模拟器调试为ios_debug_sim_unoptios_debug_sim_unopt_arm64
  • --local-engine-src-path:设置本地引擎源路径,engine/src目录所在的绝对路径
  • -d:指定要运行的设备名称,例如模拟器iPhone\ 8(名称有空格时需要转义或加单/双引号)

如果Flutter项目的入口文件路径不是默认的,需要追加-t xxx参数;如果有使用多环境配置,那可能需要追加--flavor xxx参数。

设置成功后,Flutter项目下的ios/Flutter/Generated.xcconfig文件会增加以下设置:

FLUTTER_ENGINE=/xxx/engine/src
LOCAL_ENGINE=ios_debug_xxx

2.2 导入引擎项目

  1. 检查Xcode项目是否存在工作空间

如果用于调试的Flutter项目不存在ios/Runner.xcworkspace文件,可以先随意依赖一个Flutter插件库,然后执行前面的flutter run ...命令快速创建工作空间。注意,不能用Android Studio直接运行Flutter项目,否则项目本地引擎设置会被重置。

  1. 导入引擎项目到工作空间(任选一种方式)
  • 简单拖拽

用Xcode打开用于调试的Flutter项目(打开ios/Runner.xcworkspace文件),将ios_debug_xxx目录下的flutter_engine.xcodeproj文件拖到Xcode的左侧项目导航区:

screenshot2

  • 修改配置

选中ios/Runner.xcworkspace文件,右键显示包内容即可找到contents.xcworkspacedata配置文件。打开后增加一条FileRef配置:

<?xml version="1.0" encoding="UTF-8"?>
<Workspace version = "1.0">
   ...
   <FileRef
      location = "group:/xxx/engine/src/out/ios_debug_xxx/flutter_engine.xcodeproj">
   </FileRef>
</Workspace>

以上两种方式本质是一样的。到此,准备工作都做完了,可以开始调试啦🎉!

2.3 测试调试功能

先找个地方打断点,从AppDelegate.swift文件的FlutterAppDelegate可以来到引擎项目,在这打断点肯定会进到调试:

screenshot3

使用Xcode运行项目一切正常,成功进入调试:

screenshot4

如果调试过程中发现变量列表显示不全,可以将左下角的筛选项Auto改为All

screenshot5

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/522710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt扫盲-QAreaSeries理论总结

QAreaSeries理论总结 一、概述二、使用1. 创建QAreaSeries 对象2. 填充数据3. 设置区域4. 将面积图 与绘图设备关联5. 将绘图设备与 GUI窗口关联 一、概述 QAreaSeries类以面积图的形式显示数据。QAreaSeries用于显示定量数据。它基于QLineSeries 类&#xff0c;边界线条之间的…

二、Docker在Linux下的安装

文章目录 Docker在Linux下的安装Docker安装的前提环境安装1. 卸载旧的版本2. 安装yum-utils包3. 设置镜像的仓库4. 安装Docker相关的内容 启动Docker运行hello-world查看下载的hello-world镜像 了解卸载Docker Docker在Linux下的安装 Docker安装的前提环境 CentOS Docker 安装…

【LLM系列之PaLM】PaLM: Scaling Language Modeling with Pathways

论文题目&#xff1a;《Scaling Instruction-Finetuned Language Models》 论文链接&#xff1a;https://arxiv.org/abs/2204.02311 github链接1&#xff1a;https://github.com/lucidrains/PaLM-pytorch/tree/main; github链接2:https://github.com/conceptofmind/PaLM huggin…

每天一个提高效率的Matlab编程小技巧(1)-dbstop if error

相信在matlab调试程序的时候都遇到过这种情况&#xff1a;运行程序时命令行报错&#xff0c;而且出错的位置在我们自己定义的函数里&#xff0c;比如下面这个例子&#xff1a; 主函数main.m: a[1 2 3]; b[4 5]; csum_squares(a,b); 子函数sum_squares.m function csum_squa…

AI孙燕姿 ?AI东雪莲 !—— 本地部署DDSP-SVC一键包,智能音频切片,本地训练,模型推理,为你喜欢的角色训练AI语音模型小教程

目录 感谢B站UP羽毛布团 演示视频 稻香——东雪莲 虚拟——东雪莲 反方向的钟——东雪莲 晴天龙卷风——东雪莲 DDSP-SVC 3.0 (D3SP) 是什么&#xff1f; 下载资源&#xff1a; 解压整合包 准备数据集 智能音频切片 数据集准备 填写训练设置和超参数 开始训练 推…

这个抓包工具太强了,科来网络分析系统强烈推荐

一直以来抓包工具&#xff0c;都推荐和使用wireshark&#xff0c;简单好用。最近发现一款更强大好用的网络分析工具&#xff0c;科来网络分析系统。且技术交流版是完全免费的&#xff0c;无需注册激活。这里强烈推荐和分享给大家。这可是个网络报文分析和监控神器。有多强大&am…

【CSS系列】第七章 · CSS盒子模型,看这一篇就够了

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Protobuf-net3.2.8中的protogen.exe之使用

目录 protobuf是个好东西 遇到问题 顺便研究一下命令行程序如何调试 protobuf是个好东西 protobuf是一个轻量级的数据格式&#xff0c;相比json&#xff0c;它的数据量为json的1/3&#xff0c;且存储方式为2进制&#xff0c;并进行了压缩&#xff0c;序列化和反序列化更快&…

效率与性能并存——离不开 Visual Studio Code 的前端开发与我

文章目录 &#x1f4cb;前言&#x1f3af;题外话&#xff1a;我与 VSCode 的那些事&#x1f3af;VSCode 的强大之处&#x1f9e9;VSCode 的诞生&#x1f9e9;VSCode 的一些功能 &#x1f3af;优与劣&#xff08;简单小结&#xff09;&#x1f4dd;最后 &#x1f4cb;前言 许久…

JVM 原理简介

JVM一直是java知识里面进阶阶段的重要部分&#xff0c;如果希望在java领域研究的更深入&#xff0c;则JVM则是如论如何也避开不了的话题&#xff0c;本系列试图通过简洁易读的方式&#xff0c;讲解JVM必要的知识点。 运行流程 我们都知道java一直宣传的口号是&#xff1a;一次编…

股票K线基础知识1

K线图 K线图是反映价格在某一时间周期内波动情况的图表&#xff0c;它由开盘价、收盘价、最高价、最低价四个要素构成&#xff0c;若当日收盘价高于开盘价&#xff0c;这表明价格处于上涨状态&#xff0c;此时K线图多用红色表示&#xff1b;若当日收盘价低于开盘价&#xff0c…

(转载)从0开始学matlab(第1天)—变量和数组

MATLAB 程序的基本数据单元是数组。一个数组是以行和列组织起来的数据集合&#xff0c;并且拥有一个数组名。数组中的单个数据是可以被访问的&#xff0c;访问的方法是数组名后带一个括号&#xff0c;括号内是这个数据所对应行标和列标。标量在 MATLAB 中也被当作数组来处理——…

JavaScript实现输入文字,指定输出遍数的代码

以下为实现输入文字&#xff0c;指定输出遍数的程序代码和运行截图 目录 前言 一、实现输入文字&#xff0c;指定输出遍数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.…

Prometheus+Alertmanager+webhook-dingtalk实现钉钉告警

文章目录 一、前提准备及规划二、安装及启动2.1 Prometheus安装启动2.2 Node_export安装启动2.3 Alertmanager安装启动2.4 Webhook-dingtalk安装启动 三、配置及测试3.1 Webhook-dingtalk配置钉钉webhook地址3.2 Alertmanager配置钉钉告警3.3 Prometheus集成Alertmanager及告警…

基于Docker的深度学习环境部署以及WSL和linux镜像问题

基于Docker的深度学习环境部署 1. 什么是Docker&#xff1f;2. 深度学习环境的基本要求3. Docker的基本操作3.1 在Windows上安装Docker3.2 在Ubuntu上安装Docker3.3 拉取一个pytorch的镜像3.4 部署自己的项目3.5 导出配置好项目的新镜像 4. 分享新镜像4.1 将镜像导出为tar分享给…

android应用的一种图标隐藏

在Android10之前&#xff0c;应用程序通过调用PackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)函数来实现图标隐藏。 但是在android10之后&#xff0c;所有具有四大组件和需要申请…

C语言函数

C语言函数 一 函数的分类举例&#xff1a;*比较两个整数的大小**交换两个整数的值*&#xff08;传地址&#xff09; 二 参数实参形参 三 练习1.写一个函数判断一个数是不是素数2.写一个函数判断这一年是不是闰年3.写一个函数实现一个整型有序数组的二分查找4.写一个函数&#x…

两种方法教你在postman设置请求里带动态token

问题描述 在使用postman调试接口时&#xff0c;遇到一些需要在请求里加上token的接口&#xff0c;若token出现变化&#xff0c;需要手动修改接口的token值&#xff0c;带来重复的工作量&#xff0c;翻看postman使用手册后&#xff0c;我发现了两种方法可以解决这个问题。 01 …

自动化测试开发年薪30w+?我对自己的职业规划产生了质疑

咱们还是开门见山&#xff0c;今天我们主要讲这几个问题&#xff1a; 1-测试开发都干些啥&#xff1f; 2-为什么那么多公司都要招聘测试开发&#xff1f; 3-测试开发的薪资 一、测试开发是什么&#xff1f; 所谓测试开发&#xff0c;是用更为全面的技术手段来提高测试效率&…

java学习笔记——线程池、Lambda表达式

第一章 等待唤醒机制 1.1 线程间通信 概念&#xff1a;多个线程在处理同一个资源&#xff0c;但是处理的动作&#xff08;线程的任务&#xff09;却不相同。 比如&#xff1a;线程A用来生成包子的&#xff0c;线程B用来吃包子的&#xff0c;包子可以理解为同一资源&#xff0…