前面两篇文章分别介绍了如何利用 WebRTC API 实现一对一视频通话和多人视频会议,并给出了相应的 demo 程序,该 demo 是基于官方预编译好的库开发的。如果要想深入学习和研究 WebRTC,仅仅掌握偏上层的 API 接口是远远不够的,而是应该做到能自己编译和修改 WebRTC 源码,这样才能不受限制地根据自己的需要优化和改进产品的质量和效果。

网上有很多介绍 WebRTC 源码编译的文章,我这里也不会赘述太多,只介绍些关键经验。总体来说,有下面几个点先提前说明一下:

1. 最靠谱的编译指南是官方的指导文章:https://webrtc.org/native-code/android/

2. WebRTC Android 的编译只支持在 Linux 环境中进行,推荐安装 Ubuntu 16.04 的物理机或者 VPS,不建议在 Mac/Windows 上使用 Docker 或者虚拟机等方式来编译,容易遇到很多奇怪的问题。当然,我下面也还是会介绍下 Mac 下如何利用虚拟机来编译。

3. WebRTC Android 的源码和配套工具大约 16 GB 左右,国内由于 GFW 的原因,需要配置代理来下载和同步,由此可能带来很多奇奇怪怪的问题。

4. 时间就是金钱,由于配置代理同步代码容易遇到各种坑,比较推荐的方式是在 Linode 或者 Vultr 购买一台位于国外的 VPS 虚拟机,基本上参照 WebRTC 官方文档,半天时间就可以顺利走通整个源码同步和编译流程了。

一、编译步骤和过程

下面先介绍下编译步骤和过程,假设你使用了国外的 VPS 或者已经解决好了代理,编译环境是  Ubuntu 16.04。

首先,通过 ssh 登录到 VPS

1 安装配置编译环境

// 安装一些基础的软件依赖
$ sudo apt-get update
$ sudo apt-get install -y openssl vim git gcc g++ curl python build-essential inetutils-ping net-tools sudo lsb-release libxml2

// 下载和配置 Google 提供的相关工具和脚本
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ vi ~/.bashrc
// 添加如下内容
export DEPOT_TOOLS_PATH=~/depot_tools
export PATH=${PATH}:${DEPOT_TOOLS_PATH}

// 执行脚本使其生效 
$ source ~/.bashrc

2 拉取代码并安装相关依赖

$ mkdir webrtc
$ cd webrtc
$ fetch --nohooks webrtc_android
$ gclient sync // 异常断开后,可多执行几次

$ cd src
$ ./build/install-build-deps.sh
$ ./build/install-build-deps-android.sh

3 创建编译工程文件并执行编译

$ . build/android/envsetup.sh
$ gn gen out/release/armeabi-v7a --args='target_os="android" target_cpu=“arm" is_debug=false'
$ ninja -C out/release/armeabi-v7a

如果要编译其他 CPU 架构的参数配置如下:

  • ARM64: target_cpu="arm64"

  • 32-bit x86: target_cpu="x86"

  • 64-bit x64: target_cpu=“x64"

编译成功后,输出的关键文件如下:

out/release/armeabi-v7a/lib.java/sdk/android/libwebrtc.jar
out/release/armeabi-v7a/libjingle_peerconnection_so.so

二、Mac 下利用 Vagrant 打造编译环境

1 前置环境

实现命令行能使用 shadowsocks 代理,有如下三种方案:

  • Proxifier

  • privoxy

  • polipo

关于如何使用和配置它们的文章很多,这里不再赘述,这一步至关重要。

2 安装 Vagrant 和 Virtual Box

在官网下载 Vagrant 和 VirtualBox 并安装它们。

3 安装 Ubuntu 16.04 虚拟机

$ mkdir webrtc-builder
$ cd webrtc-builder
$ vagrant init ubuntu/xenial64

4 配置共享目录

这里可以使用 Mac 下的磁盘目录,利用 NFS 挂载到 vagrant 虚拟机里进行代码同步,这样就可以很方便地在 Mac 系统下修改和编辑 WebRTC 源码了。

$ cd webrtc-builder
$ vi Vagrantfile

// 前者是主机的目录,后者是虚拟机内挂载的目录,注意要使用 NFS 方式挂载
config.vm.network "private_network", ip: "192.168.50.4"
config.vm.synced_folder “/Volumes/fs/webrtc", "/webrtc", type: "nfs"

$ vagrant reload

// 注: 这个过程需要给 iTerm 控制台完全的磁盘访问权限:设置 -> 安全性与隐私 -> 隐私,添加 iTerm 控制台程序

注意:由于 Mac OS 使用的 APFS 文件系统默认是大小写不敏感的,而 WebRTC 源码目录下不仅存在了大写名字的这些文件,也同时存在了对应的小写名字的对应的文件,所以 APFS 系统无法将这两种文件区分开来,导致同步代码的时候 git 出现:“You have unstaged changes.” 这样的错误,例如,常见的一个错误提示如下:

Syncing projects:  85% (114/134) src/third_party/android_tools

src/third_party/android_ndk (ERROR)
----------------------------------------
[0:02:21] Started.
----------------------------------------
Error: 83>
83> ____ src/third_party/android_ndk at 4e2cea441bfd43f0863d14f57b1e1844260b9884
83>     You have unstaged changes.
83>     Please commit, stash, or reset.

解决方案:打开 Mac 电脑的 “磁盘工具”,新建一个卷宗(假设叫:fs)用于放置 webrtc 源码,如:/Volumes/fs/webrtc,注意选择格式为:APFS(区分大小写)这种配置。

5 启动并进入虚拟机

$ cd webrtc-builder
$ vagrant up
$ vagrant ssh

剩下的步骤就参考上面的“编译步骤和过程”章节即可,编译完成后,可以通过 vagrant suspend 或者 vagrant halt 命令挂起或者关闭虚拟机。

三、小结

关于如何编译 WebRTC Android 平台源码就分享到这里了,如有疑问的小伙伴欢迎来信 lujun.hust@gmail.com 交流。另外,也欢迎大家关注我的新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。

WebRTC 开发实践:编译 Android 平台源码_Android