编译适用于 Apple Silicon Macs 的 Chromium 教程

本教程将指导你如何在 Apple Silicon Macs 上编译 Chromium,包括所需的系统要求、工具安装、源码获取、环境配置、编译和运行步骤。

一、系统要求

  1. Apple Silicon Mac(如 M1、M2)。
  2. 安装 Xcode 和 macOS SDK(通过 App Store 安装最新版本的 Xcode)。
  3. 使用 APFS 格式的卷。

二、安装 depot_tools

  1. 克隆 depot_tools 仓库:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
  1. depot_tools 添加到 PATH:
export PATH="$PATH:/path/to/depot_tools"

三、获取源码

  1. 创建目录并切换到该目录:
mkdir chromium && cd chromium
  1. 使用 fetch 工具获取源码。fetch 是一个用于下载和配置 Chromium 源码的工具。常用参数包括:

在执行 fetch 时,使用 caffeinate 命令可以防止 Mac 进入睡眠状态,确保下载过程不被打断:

caffeinate fetch chromium

这里的 caffeinate 是一个 macOS 命令,能防止计算机在命令执行期间进入睡眠状态,确保 fetch 命令能够顺利完成。

  • --nohooks:跳过 gclient runhooks 步骤。
  • --no-history:不下载完整的 Git 历史记录。
  • --nohooks--no-history 可以加快初次下载速度。
  1. 切换到 src 目录:
cd src

四、设置编译环境

  1. 生成编译配置:
gn gen out/Default
  1. 配置 args.gn 文件:
    在生成编译配置后,运行以下命令来打开 args.gn 文件:
gn args out/Default

将以下内容添加到 args.gn 文件中,以优化编译过程:

is_debug = false
is_component_build = true
symbol_level = 0
  • is_debug = false:关闭调试模式,生成优化过的发布版本。
  • is_component_build = true:启用组件构建模式,加快链接速度。
  • symbol_level = 0:设置符号级别为 0,减少符号信息,进一步优化编译时间。
  1. 查看可用参数:
    运行以下命令查看可用参数列表:
gn args out/Default --list

此命令会显示所有可配置的构建参数及其默认值和说明,例如:

enable_nacl = true  # 启用 Native Client
target_os = "mac"   # 目标操作系统
target_cpu = "arm64"  # 目标 CPU 架构

根据需求调整这些参数以优化构建配置。

  1. 如果在 Intel Mac 上为 ARM64 构建,添加以下行:
target_cpu = "arm64"
  1. 保存并关闭文件。

五、编译 Chromium

  1. 使用 Ninja 编译 Chromium:
autoninja -C out/Default chrome

六、运行 Chromium

  1. 运行已编译的 Chromium:
out/Default/Chromium.app/Contents/MacOS/Chromium

七、避免系统权限对话框

  1. 通过以下命令运行 Chromium 以避免权限对话框:
out/Default/Chromium.app/Contents/MacOS/Chromium --use-mock-keychain --disable-features=DialMediaRouteProvider

八、创建通用二进制文件

  1. 分别构建 x86_64 和 arm64 版本:
ninja -C out/release_x86_64 chrome
ninja -C out/release_arm64 chrome
  1. 使用 universalizer.py 工具合并两个版本:
mkdir out/release_universal
python3 chrome/installer/mac/universalizer.py \out/release_x86_64/Chromium.app \out/release_arm64/Chromium.app \out/release_universal/Chromium.app

九、构建和运行测试目标

  1. 生成编译配置:
gn gen out/Default
  1. 编译单元测试:
autoninja -C out/Default base_unittests
  1. 运行单元测试:
out/Default/base_unittests
  1. 编译浏览器测试:
autoninja -C out/Default browser_tests
  1. 运行特定的浏览器测试:
out/Default/browser_tests --gtest_filter=BrowserTest.*
  1. 编译所有测试:
autoninja -C out/Default all
  1. 运行所有测试:
out/Default/chrome --run-all-tests
  1. 查看测试结果:
    测试运行后,可以在终端查看测试结果的详细信息,确保所有测试通过,或者根据失败的测试信息进行相应的调试和修复。

十、调试 Chromium

  1. 调试和发布构建
  • 调试构建:使用 is_debug=true 配置生成包含完整调试信息的调试构建。
  • 发布构建:使用 is_debug=false 配置生成不包含符号信息的发布构建。
  • 中间配置:使用 symbol_level=1 配置生成包含最小符号表的构建。
  1. 使用 LLDB 调试
  • 启动 Chromium 并附加调试器:
lldb ./out/Default/Chromium.app/Contents/MacOS/Chromium
  • 或者附加到正在运行的进程:
lldb -p <pid>
  1. 传递参数
  • 启动 Chromium 时传递参数:
lldb ./out/Default/Chromium.app/Contents/MacOS/Chromium -- --renderer-startup-dialog
  1. 设置断点
  • 设置简单的函数名断点:
(lldb) b BrowserWindow::Close
  1. 堆栈导航
  • 获取回溯:
(lldb) bt
  • 导航堆栈:
(lldb) up
(lldb) down
  1. 检查执行
  • 单步执行:
(lldb) s
(lldb) n
  • 继续执行:
(lldb) c
  1. 打印值
  • 打印变量值:
(lldb) p <value>
  1. 多进程调试
  • 附加到正在运行的进程:
lldb -p <pid>
  • 使用启动对话框参数调试进程启动:
--renderer-startup-dialog
  1. 使用 Xcode 调试
  • 生成 Xcode 项目:
gn gen --ide=xcode out/Default
  • 打开生成的 Xcode 项目:
open out/Default/all.xcodeproj

详细内容请参考 Chromium 调试指南。

参考资料

  • Chromium Mac 构建指南
  • 适用于 ARM Macs 的 Chromium 构建说明
  • GN 构建配置
  • GN 快速入门
  • Chromium 调试指南

本主页会定期更新,为了能够及时获得更新,敬请关注我:点击左下角的关注。也可以关注公众号:请在微信上搜索公众号“iShare爱分享”并关注,或者扫描以下公众号二维码关注,以便在内容更新时直接向您推送。 

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

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

相关文章

AWDAWFAAFAWAWFAWF

创建两张表&#xff1a;部门&#xff08;dept&#xff09;和员工&#xff08;emp&#xff09; 创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称 创建视图v_dept_emp_count(dept…

Ubuntu使用Nginx部署uniapp打包的项目

使用uniapp导出web项目&#xff1a; 安装&#xff1a; sudo apt install nginx解压web.zip unzip web.zip移动到/var/www/html目录下&#xff1a; sudo cp -r ~/web/h5/ /var/www/html/重启Nginx&#xff1a; sudo service nginx restart浏览器访问&#xff1a;http://19…

基于深度学习的情感分析

基于深度学习的情感分析是一种利用深度学习技术从文本数据中提取情感信息&#xff0c;判断文本的情感倾向&#xff08;如正面、负面或中性&#xff09;的方法。这项技术在市场营销、客户服务、社交媒体分析、产品评价和政治分析等领域有广泛应用。以下是对这一领域的系统介绍&a…

Java高频面试基础知识点整理4

干货分享&#xff0c;感谢您的阅读&#xff01;背景​​​​​​高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09; 最全文章见&#xff1a;Java高频面试基础知识点整理 &#xff08;一&#xff09;Java基础高频知识考点 针对人员&#xff1a; 1.全部人员都…

iOS热门面试题(三)

面试题1&#xff1a;在iOS开发中&#xff0c;什么是MVC设计模式&#xff1f;请详细解释其各个组成部分&#xff0c;并给出一个实际应用场景&#xff0c;包括具体的代码实现。 答案&#xff1a; MVC设计模式是一种在软件开发中广泛使用的架构模式&#xff0c;特别是在iOS开发中…

算法学习笔记(8.4)-完全背包问题

目录 Question&#xff1a; 图例&#xff1a; 动态规划思路 2 代码实现&#xff1a; 3 空间优化&#xff1a; 代码实现&#xff1a; 下面是0-1背包和完全背包具体的例题&#xff1a; 代码实现&#xff1a; 图例&#xff1a; 空间优化代码示例 Question&#xff1a; 给定n个物品…

unity 学习笔记 UI

UI布局相关 需求-卡牌游戏跟着鼠标拖动判定ui是否在其他ui区域内 需求-卡牌游戏 跟着鼠标拖动 实现IDragHandler接口 public void OnDrag(PointerEventData eventData) {Vector3 globalMousePos;if (RectTransformUtility.ScreenPointToWorldPointInRectangle(_mainCanvas, …

Tomcat组件概念和请求流程

Tomcat:是一个Servlet容器(实现了Container接口)&#xff0c;容器分层架构从上到下分为。Engine(List<Host>)->Host(List<Context>)->Context(List<Wrapper>)->Wrapper(List<Servlet>); Engine:引擎&#xff0c;Servlet 的顶层容器&#xff0…

UML建模案例分析-类图中的关系

概要 类图之间的关系比较多&#xff0c;绝大多数情况下重点关注的还是关联关系、组合、聚合这三种&#xff0c;最终是如何对应到代码上的。 例子 以订单为例&#xff1a;订单和订单项之间是组合关系&#xff0c;这和数据库实体之间不一样。数据库实体有主外键&#xff0c;开…

Java聚合跑腿系统对接云洋聚合跑腿系统源码低价快递小程序APP公众号源码

一站式解决方案 &#x1f680;引言&#xff1a;跑腿服务的市场需求与聚合趋势 在快节奏的现代生活中&#xff0c;跑腿服务成为了越来越多人的选择。为了满足这一市场需求&#xff0c;各大跑腿平台纷纷涌现。然而&#xff0c;如何将这些平台进行有效整合&#xff0c;提供更为便…

比特币交易繁忙的一天

早晨:市场开盘与准备工作 6:00 AM - 全球市场监测 交易员们早早起床,开始监测全球市场动态,尤其是亚洲市场的动向。通过查看新闻、分析报告和市场数据,了解可能影响比特币价格的因素。 7:00 AM - 团队会议 召开晨会,讨论当天的交易策略。团队分析前一天的交易情况,评…

HTML网页大设计-家乡天水

代码下载: https://pan.quark.cn/s/6bad4cfaefda

Windows下vscode配置C++环境

一、vscode下载及安装 vscode官网 选安装位置。 勾选这几项。 1.vscode界面中文配置 &#xff08;1&#xff09;点击扩展小图标&#xff0c;搜索插件&#xff0c;找到插件Chinese (Simplified) (简体中文) Language Pack&#xff0c;点击install。 &#xff08;2&#xf…

【vue组件库搭建07】Vitest单元测试

vitest官网 vue-test-utils 我们的测试框架选择的是 Vitest 和 vue-test-utils。两者的关系为&#xff1a; Vitest 提供测试方法&#xff1a;断言、Mock 、SpyOn 等方法。vue-test-utils: 挂载和渲染组件&#xff1a; Vue Test Utils 允许您在隔离中挂载组件&#xff0c;这意…

实用机器学习(快速入门)

前言 因为需要机器学习的助力&#xff0c;所以&#xff08;浅浅&#xff09;进修了一下。现在什么东西和AI结合一下感觉就好发文章了&#xff1b;我看了好多学习视频&#xff0c;发现机器学习实际上是数学&#xff0c;并不是常规的去学习代码什么的&#xff08;虽然代码也很简…

我应该使用 Pinia 还是 Vuex?

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 当项目逐渐变大时,状态管理的问题开始显现了出来。这时,两个强大的状态管理工具:Vuex 和 Pinia。该选择哪一个呢? 今天带各位大佬对比下两者的优势在何处,以及如何选择合适的状态管理库! 什么是 Vuex? Vuex 是 Vue.j…

湖仓一体(Lakehouse)

湖仓一体&#xff08;Lakehouse&#xff09;是一个新兴的数据架构范式&#xff0c;旨在结合数据湖&#xff08;Data Lake&#xff09;和数据仓库&#xff08;Data Warehouse&#xff09;的优点&#xff0c;解决传统数据处理架构中的一些挑战。 数据湖和数据仓库的概念回顾&…

时间管理的6张清单:做个时间清单控,提高时间颗粒度!

时间管理管理的到底是什么&#xff1f;我觉得其根本就是时间的颗粒度。这与大多数行业精英的时间管理不谋而合&#xff0c;也就是身段越高&#xff0c;时间管理的颗粒度越高。比尔盖茨的颗粒度是5分钟&#xff0c;精确到与人握手&#xff0c;按秒来安排&#xff01;接下来&…

Amesim-帮助文件翻译与总结-tigger(滞环)

元件应用说明 滞环一般应用于控制策略制定&#xff0c;该原件类似于一个开关&#xff0c;当输入值大于设置的high input threshold Value时输出high out value&#xff1b;小于low input threshold value时输出low output value。若输出值在high input threshold Value与low i…

大模型应用中CoT(思维链)技术详细介绍

大模型应用中CoT&#xff08;思维链&#xff09;技术详细介绍 1. 背景 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;尤其是语言模型&#xff08;如GPT-3, BERT等&#xff09;的应用中&#xff0c;理解和推理复杂的文本信息变得越来越重要。Chain-of-Thought…