上一节在完成了基础环境搭建之后,这一节内容是将源码拉取到我们本地,为后续修改chromium源码做准备,这节内容非常漫长,速度快慢取决于你的网络和机器配置,如果网络和机器不好的话,编译和拉取代码的时间可能会超过十几个小时,在我自己的机器上拉取源码过程大约花了40分钟,机器上编译chromium过程花了6个多小时,才编译出chromium浏览器,所以,有一台好的机器和网络非常重要。
设置git全局环境变量
首先在新下载的powershell中执行以下命令,设置一下git全局环境变量,一行一行执行,本地代理端口号改成自己的即可
git config --global http.proxy http://127.0.0.1:10808
git config --global https.proxy http://127.0.0.1:10808
git config --global http.sslVerify false # 禁用 HTTPS 请求的 SSL 证书验证
git config --global core.autocrlf false # 禁用换行符的自动转换
git config --global core.filemode false # 禁用 Git 对文件权限模式(如可执行权限)的检测
git config --global branch.autosetuprebase always # 控制新分支的默认行为,使其在拉取(pull)时自动使用 rebase 而不是 merge
这两个可以选择性开启
git config --global core.fscache true # 启用文件系统缓存功能
git config --global core.preloadindex true # 启用索引预加载功能
设置好了之后,在depot_tools同级目录中新建一个chromium目录
创建boto.cfg和设置boto.cfg
创建boto.cfg文件写入内容,本地代理的端口号proxy_port参数改成自己的就可以
[Boto]
proxy = 127.0.0.1
proxy_port = 10808
新增环境变量NO_AUTH BOTO_CONFIG,值为boto.cfg文件路径
拉取源码
设置好了之后,首先将powershell当前目录切换到我们新建的chromium目录,然后执行以下命令,就可以开始拉取源码了,本地代理的端口号记得改成自己的就可以
$env:HTTP_PROXY="http://127.0.0.1:10808"; $env:HTTPS_PROXY="http://127.0.0.1:10808"
fetch --no-history chromium
拉取中的状态,如果你的网络不好,这将会是一个非常漫长的过程,需要耐心等待
拉取完之后会显示这个
拉取完之后,还会自动执行Hooks
当这2个都是百分之百,就说明成功了,下一步就可以执行编译了。
以下是chromium每个文件夹大概作用的介绍
目录名称 | 描述 |
---|---|
android_webview | 集成 Android 平台的外观展示 |
apps | 参考如何构建 Chrome 应用程序 |
ash | 包含了 Chrome OS 的窗口管理器和其他用户界面相关的代码 |
base | Chromium 中的基础库,包含了许多通用的数据结构、工具函数等 |
build | 包含了构建 Chromium 时使用的脚本和配置文件 |
build_overrides | 用于存放特定配置或定制化构建所需的构建脚本和覆盖文件 |
buildtools | 用于构建和编译 Chromium 项目的工具和脚本 |
cc | Chromium 的渲染合成层 |
chrome | 这个目录包含了 Chrome 浏览器特定的功能和 UI,如书签、扩展程序、设置等 |
chromecast | 与 Google Chromecast 相关的代码和功能 |
chromeos | 负责 Chrome OS 相关的功能和特性 |
codelabs | 用于存储代码示例、教程和演示性的实验项目 |
components | 用于存放浏览器各种组件,如 PDF 渲染器、插件系统、媒体播放器 |
content | Chromium 内层的代码,包含了浏览器核心功能,例如网络通信、多媒体处理等 |
courgette | 数据压缩和差分算法相关的代码 |
crypto | 用于处理加密和密码学相关操作,包含各种加密算法的实现和安全相关的功能 |
dbus | 用于处理 D-Bus(Desktop Bus)相关功能的部分 |
device | 提供跨平台底层硬件 API 抽象层 |
docs | 用于存储各种文档、说明和指南,通常用于开发者、贡献者或者维护者参考 |
extensions | 用来存放浏览器扩展(Extensions)相关代码 |
fuchsia_web | 为 Fuchsia 操作系统提供支持的一部分 |
gin | 一个用于实现 JavaScript 和 C++ 之间的互操作的库 |
google_apis | 用于存储与 Google API 相关的代码和配置 |
google_update | 负责处理 Google 更新相关的功能 |
gpu | Chromium 的 GPU 加速相关的代码,用于提高浏览器的性能 |
headless | 实现 Chromium 的无头(headless)模式 |
infra | 存储与基础设施、自动化测试以及持续集成/持续部署(CI/CD)相关的代码和配置文件 |
internal | 存放一些内部工具、测试或者辅助代码,而不是直接与浏览器的核心功能相关 |
ios | 存储与 iOS 平台相关的代码和资源 |
ios_internal | 存储与 iOS 平台相关的内部实现代码和工具 |
ipc | 用于实现进程间通信(IPC)的关键组件之一 |
media | Chromium 的媒体框架,包括音频和视频播放等功能 |
mojo | 一个跨进程通信框架,用于在 Chromium 浏览器的不同进程之间进行高效的通信 |
native_client | 存放 Native Client(NaCl)相关代码的地方 |
native_client_sdk | Native Client 的软件开发工具包(SDK) |
net | Chromium 开发的网络库,使用 WebKit 下的 test_shell 时可以单独使用 |
out | 编译输出的目录 |
PDF 文档相关的代码和功能 | |
ppapi | Pepper 插件 API(PPAPI)的实现 |
printing | 处理打印相关的功能 |
remoting | 包含与远程桌面相关的代码 |
rlz | 处理 RLZ(Referrer Language Zwiebelbrot)相关功能 |
sandbox | 包含了 Chromium 的沙盒功能,用于增强浏览器的安全性 |
services | 包含了 Chromium 的后台服务代码,处理一些后台任务和服务 |
signing_keys | 用于存储签名密钥相关的文件 |
skia | Chromium 浏览器对图形处理的基础支持,如 2D 图形渲染、图像处理等 |
sql | 提供 SQLite 相关的模块 |
storage | 数据存储和持久性相关的代码,提供了与本地数据交互的功能 |
styleguide | 存放代码风格指南和规范的相关文件 |
testing | 包含了 Chromium 的测试代码,用于自动化测试和测试框架 |
third_party | 包含了 Chromium 使用的第三方库和工具,如 Skia、WebRTC、SQLite 等 |
tools | 包含了用于开发、测试和调试 Chromium 的工具和脚本 |
ui | 包含了 Chromium 的用户界面相关的代码,包括窗口、UI 控件等 |
url | Google 开源的 URL 解析和规范库 |
v8 | Google 开发的一款基于 JavaScript 的解释引擎 |
webkit | 将网页内容转换为可视化的页面,并提供与用户交互的基础功能,用来解析 HTML/CSS 等 |
生成配置
在chromium目录下执行以下命令,设置生成配置
cd src && gn gen out/Default
编辑配置
执行成功之后,运行一下命令编辑配置
gn args out/Default
运行之后他会打开一个txt的文件,这里面就是写后面要编译的条件,这是官方的编译条件配置参考链接https://www.chromium.org/developers/gn-build-configuration
将这些内容粘贴进去,然后保存并关闭记事本,他就会自动执行接下来的操作
# 系统
target_os="win"
# 架构
target_cpu="x64"
# 是否开启调试
is_debug=false
# 不允许远程调试
enable_remoting=false
# 使用Chrome官方的编译优化建议
is_official_build=true
# 分散链接编译
is_component_build=false
#不使用官方API秘钥
use_official_google_api_keys=false
#不使用官方API秘钥
google_api_key=false
#不使用官方API秘钥
google_default_client_secret=false
#关闭支持NACL,这是一种Chrome插件,因为安全性,稳定性存在问题,已经很少使用了
enable_nacl=false
#支持H264编码
proprietary_codecs=true
#解码器
ffmpeg_branding="Chrome"
#使用无符号或最少符号实现更快的构建
symbol_level=0
#删除v8符号
v8_symbol_level=0
#删除WebCore符号
blink_symbol_level=0
#Chrome品牌标识和实验性标志
disable_fieldtrial_testing_config=true
之后可能会报这么一个错误
记事本打开chromium目录下的 .gclient 文件
将内容新增到这个位置
修改保存之后,根据前面报错日志中的提示,再运行一次以下命令
gclient runhooks
gclient runhooks运行成功之后,再从之前的编辑配置步骤重新执行一下
编译chromium
以上都正常之后,就可以开始编译了,执行以下命令即可,这是一个非常漫长的过程,所以如果你是笔记本,请连接好你的电源,保证你的网络一直是畅通的,保持屏幕常亮,关闭所有杀毒软件的目录扫描,关闭所有会让你电脑息屏的软件
autoninja -C out/Default chrome
大约53000多个组件要编译,时间的话,需要几个小时到几十个小时不等,具体看你的机器配置,全程几乎跑满CPU,编译好了之后结果会生成在 chromium目录下的 src/out/Default 目录。然后运行chrome.exe, 正常之后,说明我们编译配置和编译环境是ok的,就可以到下一节修改源码内容了
下一节就是修改chromium源码,实现一些我们想要实现的功能