2. WebRTC 源码获取与版本管理:depot_tools 工具链安装、git clone 与同步、分支切换(M98/M114)
好,咱们正式开始动手。这一章要解决一个很实际的问题——怎么把 WebRTC 源码搞到手,并且能精准地切到我们需要的版本。
WebRTC 的源码管理方式跟普通开源项目不太一样。它用了 Google 内部那套 depot_tools 工具链,说白了就是一套 Python 脚本的集合,帮你把 Chromium 系项目的上百个仓库一次性拉下来、同步、打补丁。我第一次接触的时候也觉得有点绕,但用顺手了就会发现,这套工具在管理超大型项目上确实有一套。
2.1 depot_tools 安装与环境配置
先装 depot_tools。这是所有操作的前提。
核心要点:depot_tools 必须放在一个不会被移动的路径下,我习惯放在 $HOME/depot_tools。千万别放 /tmp 或者桌面,否则后面同步会出各种奇怪的路径错误。
安装步骤其实就三步:
- 克隆 depot_tools 仓库
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git ~/depot_tools - 加入 PATH 环境变量
echo 'export PATH="$PATH:$HOME/depot_tools"' >> ~/.bashrc source ~/.bashrc如果你用 zsh,记得改
~/.zshrc。我踩过这个坑,折腾了十分钟才发现 shell 不对。 - 验证安装
gclient --version能输出版本号,就说明装好了。
小技巧:我建议在 ~/.bashrc 里再加一行 export DEPOT_TOOLS_UPDATE=0。这样 depot_tools 不会自动更新,避免某天突然升级导致不兼容。你想想看,项目正赶进度呢,工具链突然罢工,那得多闹心。
2.2 获取 WebRTC 源码:git clone 与首次同步
工具链就绪,接下来拉 WebRTC 源码。这里有个关键点——WebRTC 不是直接 git clone 一个仓库就完事的,它依赖几十个第三方库和工具链。
标准流程是这样的:
- 创建目录并进入
mkdir ~/webrtc_build cd ~/webrtc_build - 获取源码
fetch --nohooks webrtc这条命令会做两件事:先拉取 WebRTC 的主仓库(大概 2-3GB),然后生成
.gclient配置文件。我第一次跑的时候等了将近半小时,网络不好的话更久。 - 同步依赖
gclient sync这一步才是真正的重头戏。它会根据
.gclient文件里的配置,把几十个依赖仓库全部拉下来,总大小轻松超过 10GB。我建议你找个网络稳定的时段跑,最好是晚上挂机。
注意:国内网络访问 Google 源经常不稳定。我曾经遇到过同步到一半卡住的情况。解决方案是配置代理,或者使用国内镜像。如果你在公司内网,记得先确认能否访问外网。
2.3 分支切换:M98 与 M114
源码拉下来了,但默认是最新主干(master/main)。我们做嵌入式开发,需要稳定的里程碑版本。这里我选了 M98 和 M114 两个版本,分别对应不同的 ARM 平台需求。
为什么选这两个版本?
| 版本 | 特点 | 适用场景 |
|---|---|---|
| M98 | 稳定,API 变动少,文档齐全 | ARMv7 平台、资源受限设备 |
| M114 | 支持 AV1 编码、Simulcast 改进 | ARMv8 平台、多路通话场景 |
切换分支的命令很简单:
# 查看所有可用分支
git branch -r
# 切换到 M98
git checkout branch-heads/98
# 切换到 M114
git checkout branch-heads/114
但这里有个坑——切换分支后必须重新同步。因为不同分支依赖的第三方库版本可能不一样。
gclient sync --with_branch_heads
这个 --with_branch_heads 参数很重要,它会拉取分支对应的依赖版本。我刚开始做的时候忘了加这个参数,结果编译时报了一堆莫名其妙的链接错误,排查了半天才发现是依赖版本不匹配。
2.4 版本管理的核心逻辑
讲到这里,我觉得有必要画一张图,把整个流程串起来。你一看就明白了。
2.5 避坑指南与个人经验
做嵌入式交叉编译,版本管理这块我踩过的坑不少。挑几个典型的说说:
- 磁盘空间不足:WebRTC 完整源码加编译产物,轻松超过 30GB。我建议至少预留 50GB 空间。曾经有学员在 20GB 的虚拟机上跑,同步到一半就报错了。
- 分支切换后编译失败:这通常是因为
.gclient文件里的依赖版本没更新。解决办法是删掉src/目录下的.gclient_entries文件,然后重新gclient sync。 - 网络超时:Google 源在国内访问不稳定。我个人的做法是配置
git config --global http.postBuffer 524288000,把缓冲区调到 500MB,能减少不少超时问题。
我的习惯:每次切换分支后,我会先跑 gclient runhooks 再编译。这个命令会重新生成编译配置,避免一些隐性的配置残留问题。虽然多花一两分钟,但能省下后面排查错误的时间。
2.6 验证版本是否正确
最后一步,确认你确实切到了目标版本:
# 查看当前分支
git branch
# 查看详细版本信息
git log --oneline -5
# 查看 WebRTC 版本号
cat src/DEPS | grep "webrtc_version"
M98 对应的版本号是 98.4758,M114 是 114.5735。如果对不上,说明分支没切干净,重新来一遍。