WebRTC 是谷歌提供的音视频通讯方案, 能够很好的解决音视频互联互通的场景。按照WebRTC官方文档,目前WebRTC For Android只能在Linux系统上编译,笔者也尝试且成功在Mac上编译出了Android版本库,但是Mac系统升级后许多编译链和编译工具失效了,所以还是老老实实按照官方文档在Linux系统上编译吧。笔者Linux环境为Ubuntu 18.04,其他类Linux平台都可参考,基本大同小异。
1. 编译环境要求
-
磁盘预留空间不小于 30GB.
-
编译过程需要确保你能正常访问 google 相关服务, 如有条件可以在命令行使用代理访问.
export http_proxy=http://ip:port export https_proxy=http://ip:port export all_proxy=http://ip:port
-
由于项目太大, 建议使用固态硬盘的电脑, 加快同步时间, 减少超时等出错几率.
-
以下过程是基于 Ubuntu 18.04 编译.
-
Python3 >= 3.7 版本
2. 编译Android WebRTC
安装 depot_tools 工具
depot_tools 工具包包含了谷歌 gclient, gcl, git-cl, repo 等工具, 用于管理项目源码, 分发及编译等. 安装方式如下:
# 使用 git clone 到本地
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
在环境变量PATH 中加入路径, 以便方便使用命令. 根据自己使用的 shell 加到不同的启动文件中. ( .bashrc 或 .zshrc)
# 指定自己 depot_tools 的具体路径
export PATH=/path/to/depot_tools:$PATH
同步代码
同步代码我们主要使用的是 gclient 工具, 这是一个 python 脚本文件, 可以对于多模块依赖的项目源码进行管理, 可以根据不同系统同步所有所依赖模块的代码版本.
-
创建工作目录
mkdir webrtc-checkout
-
使用 fetch 下载 webrtc android 代码. (如果 fetch 执行出错的话, 也可以继续使用 gclient --with_branch_heads 同步下来 webrtc 源码).
cd webrtc-checkout fetch --nohooks webrtc_android
-
使用 gclient 同步依赖项目源码及工具, 同步时间较长, 几个小时肯定要的.
gclient sync
NOTE:
-
如果 fetch 没有出错的话, webrtc 源码通过
git branch -av
是可以看到所有的 branch-heads 的分支. -
如果 fetch 出错后, 是通过 gclient 不带参数同步下来的 webrtc 源码. 就只能看到 master、infra/config 以及 lkgr 几个分支.
我们可以修改仓库的 .git/config 文件,在 [remote "origin"] 节中添加以下内容:fetch = +refs/branch-heads/*:refs/remotes/origin/*
安装编译环境依赖库
cd webrtc-checkout/src
./build/install-build-deps-android.sh
使用 gn 编译
-
使用 gn 设置编译目录及参数. gn 可以指定编译目录及参数, 因此相对于其它编译工具, 可以同时并行多个编译版本.
cd src gn gen out/my_build --args='target_cpu="arm" target_os="android" android32_ndk_api_level=18'
target_os 参数可使用的值可以通过以下命令查看:
gn help target_os # output Possible values - "android" - "chromeos" - "ios" - "linux" - "nacl" - "mac" - "win"
target_cpu 参数可使用的值可以通过以下命令查看:
gn help target_cpu # output Possible values - "x86" - "x64" - "arm" - "arm64" - "mipsel" - "mips64el" - "s390x" - "ppc64" - "riscv32" - "riscv64" - "e2k" - "loong64"
-
使用 gn 执行编译.
ninja -C out/my_build
. ( 这个是增量编译, 第一次时间较长)