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 或者桌面,否则后面同步会出各种奇怪的路径错误。

安装步骤其实就三步:

  1. 克隆 depot_tools 仓库
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git ~/depot_tools
  2. 加入 PATH 环境变量
    echo 'export PATH="$PATH:$HOME/depot_tools"' >> ~/.bashrc
    source ~/.bashrc

    如果你用 zsh,记得改 ~/.zshrc。我踩过这个坑,折腾了十分钟才发现 shell 不对。

  3. 验证安装
    gclient --version

    能输出版本号,就说明装好了。

小技巧:我建议在 ~/.bashrc 里再加一行 export DEPOT_TOOLS_UPDATE=0。这样 depot_tools 不会自动更新,避免某天突然升级导致不兼容。你想想看,项目正赶进度呢,工具链突然罢工,那得多闹心。

2.2 获取 WebRTC 源码:git clone 与首次同步

工具链就绪,接下来拉 WebRTC 源码。这里有个关键点——WebRTC 不是直接 git clone 一个仓库就完事的,它依赖几十个第三方库和工具链。

标准流程是这样的:

  1. 创建目录并进入
    mkdir ~/webrtc_build
    cd ~/webrtc_build
  2. 获取源码
    fetch --nohooks webrtc

    这条命令会做两件事:先拉取 WebRTC 的主仓库(大概 2-3GB),然后生成 .gclient 配置文件。我第一次跑的时候等了将近半小时,网络不好的话更久。

  3. 同步依赖
    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 版本管理的核心逻辑

讲到这里,我觉得有必要画一张图,把整个流程串起来。你一看就明白了。

WebRTC 源码获取与版本管理流程 depot_tools 安装 fetch --nohooks webrtc gclient sync git checkout branch-heads/98 git checkout branch-heads/114 gclient sync --with_branch_heads gclient sync --with_branch_heads ⚠ 关键提醒 切换分支后必须重新同步依赖

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。如果对不上,说明分支没切干净,重新来一遍。