webrtc-ios 编译流程及问题解决

Webrtc 编译

注1:本文档适用webrtc-ios源码的下载和编译;

注2:下载编译所使用的操作系统为mac 终端;

下载编译工具

Chromium和Chromium OS统一使用一个叫做depot_tools的工具的对其源码进行checkout的管理(这有点类似于Android使用repo工具对其源码进行管理一样),作为Chromium其中一个子模块的webrtc而言,也是使用这个工具对其代码进行checkout。这个depot_rools包里面包含了gclient、gcl、git-cl、repo等工具。

下载depot_tools工具包并放到标准路径PATH上:
首先确保mac上安装了Git 2.2.1以上版本,以及Python 2.7以上版本;

1
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

修改root目录中的.bash_profile文件,.bash_profile文件是一个隐藏文件,可在root目录下使用命令ls -a将隐藏文件显示出来,然后vi .bash_profile 进行编辑,增加:export PATH=$PATH:‘pwd’/depot_tools:$PATH,然后按Esc + shift + 冒号,输入wq,进行保存。注意一定要把depot_tools的位置放在PATH的最前面;

参考:https://dev.chromium.org/developers/how-tos/install-depot-tools

下载 webrtc 源代码

下载webrtc-ios代码及编译流程(首先要先按照以上步骤下载depot_tools ):

1
2
3
4
5
mkdir webrtc-ios

cd webrtc-ios

fetch --nohooks webrtc_ios

gclient sync//代码下载过程中如果发生中断,使用gclient sync同步就可以了

  1. 编译Mac OS AppRTCMobile
1
2
3
gn gen out/Debug

ninja -C out/Debug
  1. 编译64位真机 AppRTCMobile
1
2
gn gen out/ios_64 --args='target_os="ios" target_cpu="arm64"'
ninja -C out/ios_64

WebRTC代码后期更新的三种方式(在src目录下):

  1. 当前代码在某个分支下进行维护,使用git pull可以拉取远程仓库的最新更新;

  2. 当前代码不在分支下,使用git fetch取下来最新的git仓库更新;

  3. 需要定期更新依赖或者其他第三方库,使用gclient sync命令;

参考:https://webrtc.org/native-code/ios/

附录:

  1. webrtc-ios版本下载过程中 $ gclient sync时出现的问题

问题描述:

出现Hook ‘download_from_google_storage –directory –recursive –num_threads=10 –no_auth –quiet –bucket chromium-webrtc-resources src/resources’ took 8760.95 secs 后,不执行了。

解决办法:

找到src/DEPS文件,将下面这几行代码注释掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{

# Download test resources, i.e. video and audio files from Google Storage.

'pattern': '.',

'action': ['download_from_google_storage',

'--directory',

'--recursive',

'--num_threads=10',

'--no_auth',

'--quiet',

'--bucket', 'chromium-webrtc-resources',

'src/resources']

},
  1. 下载代码过程中遇到如下错误:
1
2
________ running 'download_from_google_storage --no_resume --platform=darwin --no_auth --bucket chromium-gn -s src/buildtools/mac/gn.sha1' in '/Users/simon/webrtc'
Failed to fetch file gs://chromium-gn/c2c934d4dda1f470a6511b1015dda9a9fb1ce50b for src/buildtools/mac/gn. [Err: /Library/Python/2.7/site-packages/cryptography/hazmat/backends/__init__.py:7: UserWarning: Module six was already imported from /Users/simon/code/depot_tools/external_bin/gsutil/gsutil_4.26/gsutil/third_party/six/six.py, but /Library/Python/2.7/site-packages/six-1.10.0-py2.7.egg is being added to sys.path

将gs://chromium-gn/c2c934d4dda1f470a6511b1015dda9a9fb1ce50b中的 gs替换为 https://storage.googleapis.com/ 就可以直接在浏览器下载了。前提当然是你还开着翻墙代理。所以任务就变成了下载下面这个地址的文件到刚刚那个目录。

1
https://storage.googleapis.com/chromium-gn/c2c934d4dda1f470a6511b1015dda9a9fb1ce50b

  1. 下载 clang 等文件出错

可以在 bash 中设置代理来解决

  1. gclient sync长时间不响应

遇到如下情况长时间不响应

1
________ running 'download_from_google_storage --no_resume --platform=darwin --no_auth --bucket chromium-luci -d src/tools/luci-go/mac64' in '/Users/simon/webrtc'

先到src/tools/luci-go/mac64找对应的 sha1文件,此处为isolate.sha1文件,文件内容为1966687828a068eee4c5da45bbb8afd91cddda6f,这个是对应文件的散列值,也是文件的标识。 google 通过luci-go标识工具的名称,用散列值标识工具的版本。

然后用luci-go替换下面 url 中的chromium-gn,用 1966687828a068eee4c5da45bbb8afd91cddda6f替换c2c934d4dda1f470a6511b1015dda9a9fb1ce50b,

1
2
3
4
原链接:
https://storage.googleapis.com/chromium-gn/c2c934d4dda1f470a6511b1015dda9a9fb1ce50b
替换后的链接:
https://storage.googleapis.com/chromium-gn/c2c934d4dda1f470a6511b1015dda9a9fb1ce50b

从替换后的链接出下载文件到src/tools/luci-go/mac64中,命名为isolate。然后重新执行 gclient sync 即可。