Android 音视频开发实践系列-05-从官方下载WebRTC源码编译并发布aar包到GitHubPackages

前言

想必有编译WebRTC官方源码经验的同学,因为无法直接连接外网,导致实际上大部分时间不是花在编译上,而是花在下载WebRTC源码上。正所谓,万事开头难,在踩过不知道多少个坑后,本文应运而生,希望帮助到你。

温馨提示:如果你没有稳定的科学上网工具,建议不要尝试从官网下载源码编译WebRTC了,因为depot_tools有些程序必须连接外网才能下载到本地,如果无法连接外网,就算使用国内镜像也会有很多报错, 后面的常见报错解决方案章节会提到这些错误。

准备工作

系统要求

官方推荐建议使用以下系统版本进行编译:

  • Ubuntu 14.04 LTS (trusty with EoL April 2022)
  • Ubuntu 16.04 LTS (xenial with EoL April 2024)
  • Ubuntu 18.04 LTS (bionic with EoL April 2028)
  • Ubuntu 20.04 LTS (focal with Eol April 2030)
  • Ubuntu 19.04 (disco)
  • Ubuntu 19.10 (eoan)

如何得知?源码里有个脚本 ./build/install-build-deps.sh,执行它,如果你的系统版本不匹配,那就会报下面这个错误。

ERROR: The only supported distros are
        Ubuntu 14.04 LTS (trusty with EoL April 2022)
        Ubuntu 16.04 LTS (xenial with EoL April 2024)
        Ubuntu 18.04 LTS (bionic with EoL April 2028)
        Ubuntu 20.04 LTS (focal with Eol April 2030)
        Ubuntu 19.04 (disco)
        Ubuntu 19.10 (eoan)

磁盘:推荐准备20GB磁盘空间,大家看着办。
image.png
内存:推荐至少8GB吧,想起编译Android时32G都给干爆了。

题外话:不管编译什么源码,建议都与官方推荐的编译环境保持一致,因为有很多莫名其妙的问题,其实是编译环境导致的,不值得花费太多时间去踩这些坑。

温馨提示,下载WebRTC源码和编译的教程主要来自于:https://webrtc.github.io/webrtc-org/,笔者使用的是Ubuntu 20.04.5 LTS 64系统,配置了一块国产致态2T的PCIE 3.0 固态硬盘,电脑内存是32G,CPU是AMD 5900X。在开始前,请再次确认你是否准备了稳定的科学网上网工具,如果没有,请不要轻易尝试。

重要的事情再说一遍,强烈建议使用官方推荐的Ubuntu版本来编译源码,编译Android也是一样,一致的编译环境往往事半功倍,让你少走更多弯路。
至于Windows笔者暂时没精力尝试,网上搜一搜,已经有很多大佬出过教程了。这里推荐草上爬大佬的WebRTC笔记之二:编译(2021年3月更新)

什么是depot_tools

官方是这么介绍的:
Chromium and Chromium OS use a package of scripts called depot_tools to manage checkouts and code reviews.
The depot_tools package includes gclient, gcl, git-cl, repo, and others.
View the updated depot_tools set-up documentation in the depot_tools tutorial. Then continue with the tutorial or see the depot_tools documentation for usage. These same docs are also available as man pages.
See also How-To: Using depot_tools
机器翻译:
Chromium 和 Chromium OS 使用一个名为 depot_tools 的脚本包来管理签出和代码审查。
depot_tools包包括gclient,gcl,git-cl,repo等。
查看depot_tools教程中更新的depot_tools设置文档。然后继续学习本教程或查看depot_tools文档以了解用法。这些相同的文档也可作为手册页提供。
另请参阅操作方法:使用 depot_tools

扩展阅读:
freeabc今天说说构建工具 depot_tools,对depot_tools有一个基本的了解。
太上绝情depot_tools原理和实现,了解depot_tools的原理,这有助于自主解决遇到的报错问题。

下载depot_tools

第一步,当然是安装depot_tools,很多教程这个步骤都是一笔带过的,但实际上,这看似简单的一步,却包含许多坑,这些坑后面会提到。

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

很简单吧,通过Git工具Clone即可,你不会还没有Git的吧。

笔者这里新建了一个webrtc目录,如下:

在这里插入图片描述

打开命令行终端,执行以下 命令:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
图片.png
你以为会很顺利?过不了多久,超时大礼包马上奉上。
你可能会说,depot_tools.git不是也有国内镜像吗?为啥不用?你说对了,咱们马上安排。

# 声网Agora WebRTC团队提供的 WebRTC 镜像源
git clone https://webrtc.bj2.agoralab.co/webrtc-mirror/depot_tools.git depot_tools_agoralab

# Qualcomm Innovation Center团队提供的 WebRTC 镜像源
git clone https://source.codeaurora.org/quic/lc/chromium/tools/depot_tools.git depot_tools_quic -b chromium.org/main

经过测试,声网Agora WebRTC团队提供的 WebRTC 镜像源是最快的。
图片.png
Qualcomm Innovation Center团队提供的 WebRTC 镜像源也不差,但是默认不是master分支,需要通过-b指定分支。
图片.png

注意:source.codeaurora.org 已经迁移到git.codelinaro.org
Note: Qualcomm Innovation Center Inc. maintained repositories have migrated to git.codelinaro.org. QUIC repositories on this site will not receive any updates after March 31, 2022, and will be deleted on March 31, 2023. If your project depends on these repositories, please adjust your tooling configuration to use the new, up-to-date project location.

depot_tools工具这就下载下来了,不过事情远远没有那么顺利,因为有些工具需要连接外网才能下载,后面使用到的时候会告诉大家。

安装depot_tools

depot_tools的安装,设置下可执行程序的路径到环境变量即可。首先,设置当前目录为工作空间。

export WORKSPACE=`pwd`

紧接着,设置depot_tools目录的环境变量。cipd也修改为可执行权限。

#WORKSPACE变量是前面设置的,如果你有多个depot_tools源,注意修改为实际你要用的depot_tools路径
chmod +x $WORKSPACE/depot_tools/cipd
export PATH=$PATH:$WORKSPACE/depot_tools

注意,在当前命令行执行export命令设置的环境变量都是临时的(因为笔者要尝试使用不同的depot_tools源,因此使用临时环境变量会比较方便)。

如果想设置永久环境变量(推荐),建议把环境变量添加到~/.bashrc 文件中。具体是,将如下命令加入到 ~/.bashrc 中,并输入 source ~/.bashrc 重载 bash。其中的 /path/to/ 需要你替换为 depot_tools 的所在路径。

export PATH=/path/to/depot_tools:$PATH

所在目录截图如下:
图片.png更多关于环境变量设置的知识,感兴趣的同学自己搜索学习。

命令行执行gclinet,没有报错找不到命令行说明环境变量配置成功。
图片.png或者执行which gclient命令,找到路径即可。
图片.png

配置Git

这一步一般大家都已经设置了,主要是设置Git的全局账号信息。

$ git config --global user.name "XXX"
$ git config --global user.email "[email protected]"
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ # and for fun!
$ git config --global color.ui true

下载同步WebRTC源码

使用国内WebRTC镜像(不推荐)

事实上,由于墙的存在,笔者第一次尝试编译WebRTC源码是跟着声网Agora WebRTC团队的WebRTC镜像教程来的,教程来自:https://webrtc.org.cn/mirror/。为了尽可能把踩过的坑告诉大家,笔者按照这个教程重新走一遍方便大家跳过这些坑。当然,同步Google官方仓库和Github WebRTC镜像源码的步骤也会手把手教学。

使用到的命令行:

export WORKSPACE=`pwd`

cd $WORKSPACE

rm -rf depot_tools_agoralab && git clone https://webrtc.bj2.agoralab.co/webrtc-mirror/depot_tools.git depot_tools_agoralab

chmod +x $WORKSPACE/depot_tools_agoralab/cipd

export PATH=$PATH:$WORKSPACE/depot_tools_agoralab

which gclient

mkdir -p $WORKSPACE/webrtc-agoralab && cd $WORKSPACE/webrtc-agoralab

solutions = [
  { "name"        : "src",
    "url"         : "https://webrtc.bj2.agoralab.co/webrtc-mirror/src.git@65e8d9facab05de13634d777702b2c93288f8849",
    "deps_file"   : "DEPS",
    "managed"     : False,
    "safesync_url": "",
    "custom_deps": {
    },
  },
]
target_os = ["android"]


过程截图:
image.png明明用了国内镜像,但是仍然要连接国外的网址,那不就报错了嘛!

curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443: 连接超时
curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443: 连接超时
/media/xiangang/Repository/webrtc/depot_tools_agoralab/bootstrap_python3: 行 32: bootstrap-3.8.0.chromium.8_bin/python3/bin/python3: 没有那个文件或目录
/media/xiangang/Repository/webrtc/depot_tools_agoralab/gclient: 第 32 行: exec: python:未找到

到头来,还是要使用科学上网工具(我要是有,我早就用了,用你说)。可以不用吗?理论上应该可以的。比如笔者下载好后把完整版的depot_tools上传到Github给大家下载使用,那不就可以了?笔者在Github上搜索了depot_tools,发现都是直接fork或者clone上传的,没有包含bootstrap-3.8.0.chromium.8_bin。可能这样做确实意义不大,因为真正同步WebRTC源码的时候也要用科学上网工具,那还不如从头到尾都用科学上网工具,避免意想不到的坑。

那就开启科学上网工具,开启网络代理。
image.png注意,需要先执行下curl cip.cc查看当前终端是否生效,如果ip还是显示国内的,需要重新开启新的终端。
image.png由于为了演示,笔者使用了国内的depot_tools镜像,所以depot_tools的环境变量是临时的,所以打开的新的终端要重新配置环境变量量。一顿操作后,可以看到curl cip.cc变成国外ip了。

gclient: 第 32 行: exec: python:未找到的问题。解决方法:命令行执行export GCLIENT_PY3=1即可。

这时候就可以重新执行:gclient sync了。但是实际上,可能代理网络不太稳定,建议是写个脚本,循环执行gclient sync命令,等过一段时间同步完成后退出执行即可。

#!/bin/bash
gclient sync
while [ $? -ne 0 ]
do
echo "======gclient sync failed ,gclient sync again======"
sleep 3
gclient sync
done

使用:

touch sync.sh  # 1. 创建 sync.sh 文件
vim sync.sh # 2. 复制上面的脚本内容到 sync.sh 里面,这里你可以使用你自己喜欢的方法打开并修改文件,比如 vscode
chmod a+x sync.sh #3. 修改权限
./sync.sh # 4. 运行脚本,万事大吉

经过一段时间的不懈努力,源码就可以正常下载同步了(实际不一定那么顺利,祝你好运)。但是,笔者强烈不推荐使用国内镜像,不出问题还好,出问题就很浪费时间了。而且国内镜像你甚至不知道镜像是否同步更新,更新到哪个版本。

使用Google官方WebRTC源码(推荐)

前提:开启科学上网工具,开启网络代理。

开启后,执行命令curl cip.cc 检查终端是否处于代理状态。为什么不用ping google,因为ping是ICMP报文,代理不转发,所以不能用ping的方式来检测中终端的网络代理是否成功,切记切记。
扩展阅读:编程大KLinux 让终端走代理的几种方法
图片.png注意,如果执行命令curl cip.cc显示的还是国内ip,可以打开新的命令行终端再操作。

下载安装depot_tools就不多说了,也是从Google官方上获取,设置好环境变量。

创建一个名为webrtc-checkout的目录和depot_tools目录同级。
图片.png
进入webrtc-checkout的目录执行,执行以下命令

#手动创建目录则跳过,直接在对应目录打开命令行终端
mkdir webrtc-checkout && cd webrtc-checkout
#fetch是用来初始化项目配置的工具,一般会在第一次拉取项目时用到,这里配置获取webrtc android平台的代码
fetch --nohooks webrtc_android
#此命令主要负责拉取项目代码、执行代码hook等操作,是gclient最重要的功能。
gclient sync

#其他平台的
linux : fetch --nohooks webrtc
android: fetch --nohooks webrtc_android
ios: fetch --nohooks webrtc_ios

再次强调,如果你没有稳定的科学上网工具,建议就不要折腾自己了。不然就像下面这样,走一步,错一步,一步错,步步错。图片.png
可能会提示你更新depot_tools,选择N即可。
要禁用自动更新,可以设置环境变量:DEPOT_TOOLS_UPDATE=0。

OK to update it to https://chromium.googlesource.com/chromium/tools/depot_tools.git ? [Y/n] n

接下来就是等待源码同步完成了。要是失败了可以尝试多执行几次,一般是比较顺利的。

使用Github上的WebRTC镜像

镜像来自:https://github.com/ibaoger/webrtc.git
新建一个webrtc-github目录,进入目录新建一个.gclient文件,写入内容如下:

solutions = [
  { "name"        : 'src',
    "url"         : 'https://github.com/ibaoger/webrtc.git',
    "deps_file"   : 'DEPS',
    "managed"     : True,
    "custom_deps" : {
    },
    "custom_vars": {},
  },
]
target_os = [ 'android' ]

打开命令行终端执行gclient sync,完整的执行过程如下:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github$ gclient sync

________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://github.com/ibaoger/webrtc.git /media/xiangang/Repository/webrtc/webrtc-github/_gclient_src_rubntize' in '/media/xiangang/Repository/webrtc/webrtc-github'
Cloning into '/media/xiangang/Repository/webrtc/webrtc-github/_gclient_src_rubntize'...
remote: Enumerating objects: 425721, done.
remote: Counting objects: 100% (2220/2220), done.
remote: Compressing objects: 100% (901/901), done.
Receiving objects:   9% (41042/425721), 18.85 MiB | 43                                                                                                                                                                                                                                                                                                                                                                Receiving objects:   9% (41042/425721), 19.80 MiB | 65                                                                                                                                                     Receiving objects:   9% (41044/425721), 22.65 MiB | 54                                                                                                                                                                                                                                                                                                                                                                Receiving objects:   9% (41044/425721), 23.39 MiB | 49                                                                                                                                                                                                                                                                                                                                                                Receiving objects:   9% (41045/425721), 24.10 MiB | 46                                                                                                                                                     remote: Total 425721 (delta 1361), reused 2092 (delta 1307), pack-reused 423501
Receiving objects: 100% (425721/425721), 262.00 MiB | 52.00 KiB/s, done.
Resolving deltas: 100% (345232/345232), done.
Syncing projects:   0% ( 1/246) src
[1:25:38] Still working on:
[1:25:38]   src/base
[1:25:38]   src/build
[1:25:38]   src/buildtools
[1:25:38]   src/examples/androidtests/third_party/gradle
[1:25:38]   src/testing
[1:25:38]   src/third_party
[1:25:38]   src/tools

...省略

Syncing projects:   3% ( 8/246) src/examples/androidtests/third_party/gradle
src/buildtools (ERROR)
----------------------------------------
[1:24:37] Started.
[1:24:37] 

________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' in '/media/xiangang/Repository/webrtc/webrtc-github'

[1:24:37] Cloning into '/media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs'...
[1:26:48] fatal: unable to access 'https://chromium.googlesource.com/chromium/src/buildtools/': Failed to connect to chromium.googlesource.com port 443: Connection timed out
[1:26:50] 
________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' in '/media/xiangang/Repository/webrtc/webrtc-github' attempt 2 / 2

[1:26:50] Cloning into '/media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs'...
[1:29:01] fatal: unable to access 'https://chromium.googlesource.com/chromium/src/buildtools/': Failed to connect to chromium.googlesource.com port 443: Connection timed out
Traceback (most recent call last):
  File "/work/depot_tools/gclient_scm.py", line 1177, in _Clone
    self._Run(clone_cmd,
  File "/work/depot_tools/gclient_scm.py", line 1518, in _Run
    gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
  File "/work/depot_tools/gclient_utils.py", line 715, in CheckCallAndFilter
    raise subprocess2.CalledProcessError(
subprocess2.CalledProcessError: Command 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' returned non-zero exit status 128 in /media/xiangang/Repository/webrtc/webrtc-github
[1:29:05] _____ Conflicting directory found in /media/xiangang/Repository/webrtc/webrtc-github/src/buildtools. Moving to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildtools5aonwdxq.
----------------------------------------


Warnings:
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/buildtools moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildtools5aonwdxq.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/tools moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/toolsqsruy_96.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/testing moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/testingzzl4y5lf.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/base moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/base0c3qxg31.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/build moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildadru8ysv.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/third_party moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/third_partyrwxgp826.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/examples/androidtests/third_party/gradle moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/examples/androidtests/third_party/gradlexnkdvm5p.
Traceback (most recent call last):
  File "/work/depot_tools/gclient_scm.py", line 647, in update
    self._Clone(revision, url, options)
  File "/work/depot_tools/gclient_scm.py", line 1177, in _Clone
    self._Run(clone_cmd,
  File "/work/depot_tools/gclient_scm.py", line 1518, in _Run
    gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
  File "/work/depot_tools/gclient_utils.py", line 715, in CheckCallAndFilter
    raise subprocess2.CalledProcessError(
subprocess2.CalledProcessError: Command 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' returned non-zero exit status 128 in /media/xiangang/Repository/webrtc/webrtc-github

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 791, in move
    os.rename(src, real_dst)
FileNotFoundError: [Errno 2] No such file or directory: '/media/xiangang/Repository/webrtc/webrtc-github/src/buildtools' -> '/media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildtools5aonwdxq/buildtools'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/work/depot_tools/metrics.py", line 291, in print_notice_and_exit
    yield
  File "/work/depot_tools/gclient.py", line 3489, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/work/depot_tools/gclient.py", line 3475, in main
    return dispatcher.execute(OptionParser(), argv)
  File "/work/depot_tools/subcommand.py", line 252, in execute
    return command(parser, args[1:])
  File "/work/depot_tools/gclient.py", line 3026, in CMDsync
    ret = client.RunOnDeps('update', args)
  File "/work/depot_tools/gclient.py", line 2020, in RunOnDeps
    work_queue.flush(revision_overrides,
  File "/work/depot_tools/gclient_utils.py", line 1013, in flush
    reraise(e[0], e[1], e[2])
  File "/work/depot_tools/gclient_utils.py", line 70, in reraise
    raise value
  File "/work/depot_tools/gclient_utils.py", line 1090, in run
    self.item.run(*self.args, **self.kwargs)
  File "/work/depot_tools/gclient.py", line 1005, in run
    self._got_revision = self._used_scm.RunCommand(command, options, args,
  File "/work/depot_tools/gclient_scm.py", line 128, in RunCommand
    return getattr(self, command)(options, args, file_list)
  File "/work/depot_tools/gclient_scm.py", line 650, in update
    self._DeleteOrMove(options.force)
  File "/work/depot_tools/gclient_scm.py", line 203, in _DeleteOrMove
    shutil.move(self.checkout_path, dest_path)
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 811, in move
    copy_function(src, real_dst)
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 435, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 264, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: '/media/xiangang/Repository/webrtc/webrtc-github/src/buildtools'

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github$                                                                                                                                                                                                               

可以看到报错了:

fatal: unable to access 'https://chromium.googlesource.com/chromium/src/buildtools/': Failed to connect to chromium.googlesource.com port 443: Connection timed out

还是有一些工具比如这个buildtoosl需要从https://chromium.googlesource.com下载的,因为WebRTC镜像并没有包含这工具。
怎么办?简单的方法就是从其他国内镜像手动下载这些工具,但很麻烦,因为还有很多工具需要这样处理,你看吧,有这么多,真的要哭死。

https://chromium.googlesource.com/chromium/src/base
https://chromium.googlesource.com/chromium/src/build
https://chromium.googlesource.com/chromium/src/buildtools
https://chromium.googlesource.com/external/github.com/gradle/gradle
https://chromium.googlesource.com/chromium/src/ios
https://chromium.googlesource.com/chromium/src/testing
https://chromium.googlesource.com/chromium/src/third_party
https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format
https://chromium.googlesource.com/chromium/llvm-project/libcxx
https://chromium.googlesource.com/chromium/llvm-project/libcxxabi
https://chromium.googlesource.com/external/llvm.org/libunwind
https://chromium.googlesource.com/android_ndk
https://chromium.googlesource.com/android_tools
https://chromium.googlesource.com/external/github.com/google/auto
https://chromium.googlesource.com/catapult
https://chromium.googlesource.com/external/github.com/google/compact_enc_det
https://chromium.googlesource.com/external/colorama
https://chromium.googlesource.com/chromium/tools/depot_tools
https://chromium.googlesource.com/chromium/third_party/errorprone
https://chromium.googlesource.com/chromium/third_party/ffmpeg
https://chromium.googlesource.com/chromium/deps/findbugs
https://chromium.googlesource.com/chromium/src/third_party/freetype2
https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz
https://chromium.googlesource.com/external/github.com/google/gtest-parallel
https://chromium.googlesource.com/external/github.com/google/googletest
https://chromium.googlesource.com/chromium/deps/icu
https://chromium.googlesource.com/external/jsr-305
https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp
https://chromium.googlesource.com/external/junit
https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer
https://chromium.googlesource.com/chromium/deps/libjpeg_turbo
https://chromium.googlesource.com/chromium/deps/libsrtp
https://chromium.googlesource.com/webm/libvpx
https://chromium.googlesource.com/libyuv/libyuv
https://chromium.googlesource.com/linux-syscall-support
https://chromium.googlesource.com/external/mockito/mockito
https://chromium.googlesource.com/chromium/deps/nasm
https://chromium.googlesource.com/external/github.com/cisco/openh264
https://chromium.googlesource.com/external/github.com/kennethreitz/requests
https://chromium.googlesource.com/external/robolectric
https://chromium.googlesource.com/chromium/third_party/ub-uiautomator
https://chromium.googlesource.com/external/github.com/sctplab/usrsctp
https://chromium.googlesource.com/chromium/deps/yasm/binaries
https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm
https://chromium.googlesource.com/chromium/src/tools
https://chromium.googlesource.com/infra/luci/client-py

头铁,尝试继续执行 gclient sync ,结果还是报错如下:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ gclient sync
/media/xiangang/Repository/webrtc/webrtc-github/.gclient_entries missing, .gclient file in parent directory /media/xiangang/Repository/webrtc/webrtc-github might not be the file you want to use.
Syncing projects: 100% ( 1/ 1) src
src (ERROR)
----------------------------------------
[0:00:00] Started.
[0:00:00] Finished running: git config remote.origin.url
[0:00:00] Finished running: git rev-list -n 1 HEAD
[0:00:00] Finished running: git rev-parse --abbrev-ref=strict HEAD
----------------------------------------
Error: Command 'git remote update' returned non-zero exit status 1 in /media/xiangang/Repository/webrtc/webrtc-github/src
fatal: unable to access 'https://github.com/ibaoger/webrtc.git/': GnuTLS recv error (-110): The TLS connection was non-properly terminated.

最省事的,到头来还的是使用科学上网工具。老老实实开启网络代理,重新执行gclient sync。
图片.png大概一个小时候后snyc完成!

其它方式

也许你可以考虑搞一台国外的云服务器,经过一系列的源码同步编译后,将编译产物发布到Maven,何乐而不为?当然这个方式也不是没有缺点,那就是成本高,费钱。人民币玩家可以考虑这种方式,参考官方教程就可以了:https://webrtc.github.io/webrtc-org/native-code/android/

编译WebRTC

如果是用的Ubuntu系统,一般建议gclient sync同步完成后执行:./build/install-build-deps.sh,用于下载安装编译需要的依赖。
准备工作做好了,编译源码就非常简单了。编译流程参考官网的文档即可。
图片.png

生成Ninja项目文件

WebRTC默认使用Ninja作为编译系统,使用GN生成Ninja项目文件。我们可以指定Ninja项目文件在我们选择的目录中生成,如out/Debug或out/Release。

使用默认值(Debug 编译)生成Ninja工程文件,请执行以下命令(生成的项目文件位于checkout源码的src目录中):

gn gen out/Default

演示:
图片.png
Release编译,则执行以下命令来生成Ninja工程文件:

gn gen out/Default --args='is_debug=false'

演示:
图片.png

编译

前面通过GN生成Ninja项目文件后,就可以使用Ninja编译它们。

对于在out/Default中生成的Ninja项目文件,执行以下命令来编译:

ninja -C out/Default

演示:
图片.png可能是电脑性能好,10分钟不到就编译完成。在/webrtc/webrtc-github/src/out/Default/obj目录下可以看到编译生成的静态库文件:libwebrtc.a。
图片.png

生成aar

看官方教程,我们发现Google是有提供现成的WebRTC的aar包供我们直接使用的。
图片.png
但如果我们自己也想打包成aar发布到maven行不行?当然行!在源码/src/tools_webrtc/android目录中有个build_aar.py 脚本就是干这个用的,是不是很贴心?
图片.png由于是python脚本,因此需要python环境,但是往往我们容易踩坑的地方就是使用已经安装好的python(系统自带的)去执行,往往因为版本不匹配导致执行失败。实际上,depot_tools就同时用到了python2和python3。

我们打开build_aar.py:
图片.png发现第一行是#!/usr/bin/env vpython3。你可能会有个疑惑,vpython3是什么,跟python3有什么区别?如果你看了前面提到的太上绝情depot_tools原理和实现博客,你就会知道,vpython是Google的python虚拟化环境,主要用于隔离不同版本的python环境,因为Google项目中使用了大量的python脚本,但是有些python脚本只能运行于特定版本的python中,所以需要同时运行不同版本的python。所以vpython3是Google提供的python3版本的虚拟化环境,他就在depot_tools的[email protected]_bin目录中,如下图:
图片.png因此,非常强烈建议使用depot_tools自带的python3来执行build_aar.py脚本。

注意看脚本的注释:

The script has to be run from the root src folder.
./tools_webrtc/android/build_aar.py

#!/usr/bin/env vpython3

# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Script to generate libwebrtc.aar for distribution.

The script has to be run from the root src folder.
./tools_webrtc/android/build_aar.py

.aar-file is just a zip-archive containing the files of the library. The file
structure generated by this script looks like this:
 - AndroidManifest.xml
 - classes.jar
 - libs/
   - armeabi-v7a/
     - libjingle_peerconnection_so.so
   - x86/
     - libjingle_peerconnection_so.so
"""

也就是在src目录下执行:./tools_webrtc/android/build_aar.py,并不需要通过指定python3路径的方式来执行

/webrtc/depot_tools/[email protected]_bin/python3/bin/python3 tools_webrtc/android/build_aar.py

我们尝试src目录下执行命令:./tools_webrtc/android/build_aar.py
图片.png执行过程:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ ./tools_webrtc/android/build_aar.py
INFO:root:Building: armeabi-v7a
Done. Made 5847 targets from 338 files in 426ms
ninja: Entering directory `/tmp/tmp6ozvfe9z/armeabi-v7a'
[3311/4313] ACTION //sdk/android:base_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/sdk/android/base_java.javac.jar obj/sdk/android/base_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/sdk/android/base_java__compile_java.d --generated-dir=gen/sdk/android/base_java/generated_java --jar-path=obj/sdk/android/base_java.javac.jar --java-srcjars=\[\"gen/sdk/android/base_java.generated.srcjar\"\] --target-name //sdk/android:base_java__compile_java --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/sdk/android/base_java.turbine.jar --classpath=\[\"obj/sdk/android/base_java.turbine.jar\"\] --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/sdk/android/base_java.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/sdk/android/src/java/org/webrtc/RefCountDelegate.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/sdk/android/base_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/sdk/android/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/sdk/android/base_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3315/4313] ACTION //tools/android/errorprone_plugin:errorprone_plugin__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/tools/android/errorprone_plugin/errorprone_plugin__compile_java.d --generated-dir=gen/tools/android/errorprone_plugin/errorprone_plugin/generated_java --jar-path=obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar --java-srcjars=\[\"gen/tools/android/errorprone_plugin/errorprone_plugin.generated.srcjar\"\] --target-name //tools/android/errorprone_plugin:errorprone_plugin__compile_java --header-jar obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar --classpath=\[\"obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar\"\] --classpath=@FileArg\(gen/tools/android/errorprone_plugin/errorprone_plugin.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors @gen/tools/android/errorprone_plugin/errorprone_plugin.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/tools/android/errorprone_plugin/src/org/chromium/tools/errorprone/plugin/NoSynchronizedMethodCheck.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/classes -classpath obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar:obj/third_party/android_deps/com_google_errorprone_javac.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_core.ijar.jar:obj/third_party/android_deps/org_pcollections_pcollections.ijar.jar:obj/third_party/android_deps/com_google_protobuf_protobuf_java.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_type_annotations.ijar.jar:obj/third_party/android_deps/com_google_auto_auto_common.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_check_api.ijar.jar:obj/third_party/android_deps/org_checkerframework_dataflow_errorprone.ijar.jar:obj/third_party/android_deps/io_github_java_diff_utils_java_diff_utils.ijar.jar:obj/third_party/android_deps/org_eclipse_jgit_org_eclipse_jgit.ijar.jar:obj/third_party/android_deps/com_google_auto_value_auto_value_annotations.ijar.jar:obj/third_party/android_deps/com_github_kevinstern_software_and_algorithms.ijar.jar:obj/third_party/android_deps/com_github_ben_manes_caffeine_caffeine.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotation.ijar.jar:obj/third_party/android_deps/com_google_guava_guava.ijar.jar:obj/third_party/android_deps/org_checkerframework_checker_qual.ijar.jar:obj/third_party/android_deps/com_google_j2objc_j2objc_annotations.ijar.jar:obj/third_party/android_deps/com_google_guava_listenablefuture.ijar.jar:obj/third_party/android_deps/com_google_guava_failureaccess.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotations.ijar.jar:obj/third_party/android_deps/com_google_code_findbugs_jsr305.ijar.jar:obj/third_party/android_deps/com_google_auto_service_auto_service_annotations.ijar.jar @obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3322/4313] ACTION //modules/audio_device:audio_device_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/modules/audio_device/audio_device_java.javac.jar obj/modules/audio_device/audio_device_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/modules/audio_device/audio_device_java__compile_java.d --generated-dir=gen/modules/audio_device/audio_device_java/generated_java --jar-path=obj/modules/audio_device/audio_device_java.javac.jar --java-srcjars=\[\"gen/modules/audio_device/audio_device_java.generated.srcjar\"\] --target-name //modules/audio_device:audio_device_java__compile_java --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/modules/audio_device/audio_device_java.turbine.jar --classpath=\[\"obj/modules/audio_device/audio_device_java.turbine.jar\"\] --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/modules/audio_device/audio_device_java.sources
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/modules/audio_device/audio_device_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/modules/audio_device/audio_device_java.turbine.jar:obj/rtc_base/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/modules/audio_device/audio_device_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3336/4313] ACTION //third_party/android_deps:org_jetbrains_kotlin_kotlin_stdlib_java__dex(//build/toolchain/android:android_clang_arm)
ninja: build stopped: subcommand failed.
Traceback (most recent call last):
  File "./tools_webrtc/android/build_aar.py", line 269, in <module>
    sys.exit(main())
  File "./tools_webrtc/android/build_aar.py", line 263, in main
    BuildAar(args.arch, args.output, args.use_goma, args.use_remoteexec,
  File "./tools_webrtc/android/build_aar.py", line 243, in BuildAar
    Build(build_dir, arch, use_goma, use_remoteexec, extra_gn_args,
  File "./tools_webrtc/android/build_aar.py", line 198, in Build
    _RunNinja(output_directory, ninja_args)
  File "./tools_webrtc/android/build_aar.py", line 129, in _RunNinja
    subprocess.check_call(cmd)
  File "/work/depot_tools/.cipd_bin/.cipd/pkgs/0/Gz9krHL6kKjbvGdxI5atUyCuwSXBMIhmVrK6FblTzSIC/3.8/lib/python3.8/subprocess.py", line 364, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/media/xiangang/Repository/webrtc/webrtc-github/src/third_party/ninja/ninja', '-C', '/tmp/tmp6ozvfe9z/armeabi-v7a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']' returned non-zero exit status 1.
xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ 


结果报错了。好在有提示告诉我们解决方法:You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).

好的,那就再试一遍:./tools_webrtc/android/build_aar.py --extra-gn-args “treat_warnings_as_errors=false”
图片.png这次成功了,完整执行过程如下:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ ./tools_webrtc/android/build_aar.py --extra-gn-args "treat_warnings_as_errors=false"
INFO:root:Building: armeabi-v7a
Done. Made 5847 targets from 338 files in 431ms
ninja: Entering directory `/tmp/tmplq7o6un2/armeabi-v7a'
[3314/4313] ACTION //sdk/android:base_java__compile_java(//build/toolchain/android:android_clang_arm)
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/sdk/android/src/java/org/webrtc/RefCountDelegate.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。

...省略

The above stderr output was from:
../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED -XDcompilePolicy=simple '-Xplugin:ErrorProne -XepAllErrorsAsWarnings -XepDisableWarningsInGeneratedCode -Xep:InlineMeInliner:OFF -Xep:InvalidParam:OFF -Xep:InvalidLink:OFF -Xep:InvalidInlineTag:OFF -Xep:EmptyBlockTag:OFF -Xep:PublicConstructorForAbstractClass:OFF -Xep:InvalidBlockTag:OFF -Xep:StaticAssignmentInConstructor:OFF -Xep:MutablePublicArray:OFF -Xep:UnescapedEntity:OFF -Xep:NonCanonicalType:OFF -Xep:AlmostJavadoc:OFF -Xep:ReturnValueIgnored:OFF -Xep:InlineMeSuggester:OFF -Xep:DoNotClaimAnnotations:OFF -Xep:JavaUtilDate:OFF -Xep:IdentityHashMapUsage:OFF -Xep:UnnecessaryMethodReference:OFF -Xep:LongFloatConversion:OFF -Xep:CharacterGetNumericValue:OFF -Xep:ErroneousThreadPoolConstructorChecker:OFF -Xep:StaticMockMember:OFF -Xep:MissingSuperCall:OFF -Xep:ToStringReturnsNull:OFF -Xep:MalformedInlineTag:OFF -Xep:DoubleBraceInitialization:OFF -Xep:CatchAndPrintStackTrace:OFF -Xep:SynchronizeOnNonFinalField:OFF -Xep:TypeParameterUnusedInFormals:OFF -Xep:CatchFail:OFF -Xep:JUnitAmbiguousTestClass:OFF -Xep:DefaultCharset:OFF -Xep:UnrecognisedJavadocTag:OFF -Xep:JdkObsolete:OFF -Xep:FunctionalInterfaceClash:OFF -Xep:FutureReturnValueIgnored:OFF -Xep:OperatorPrecedence:OFF -Xep:ThreadJoinLoop:OFF -Xep:StringSplitter:OFF -Xep:ClassNewInstance:OFF -Xep:ClassCanBeStatic:OFF -Xep:FloatCast:OFF -Xep:ThreadLocalUsage:OFF -Xep:Finally:OFF -Xep:FragmentNotInstantiable:OFF -Xep:HidingField:OFF -Xep:IntLongMath:OFF -Xep:BadComparable:OFF -Xep:EqualsHashCode:OFF -Xep:TypeParameterShadowing:OFF -Xep:ImmutableEnumChecker:OFF -Xep:InputStreamSlowMultibyteRead:OFF -Xep:BoxedPrimitiveConstructor:OFF -Xep:OverrideThrowableToString:OFF -Xep:CollectionToArraySafeParameter:OFF -Xep:ObjectToString:OFF -Xep:UnusedMethod:OFF -Xep:UnusedVariable:OFF -Xep:UnsafeReflectiveConstructionCast:OFF -Xep:MixedMutabilityReturnType:OFF -Xep:EqualsGetClass:OFF -Xep:UndefinedEquals:OFF -Xep:ExtendingJUnitAssert:OFF -Xep:SystemExitOutsideMain:OFF -Xep:TypeParameterNaming:OFF -Xep:UnusedException:OFF -Xep:UngroupedOverloads:OFF -Xep:FunctionalInterfaceClash:OFF -Xep:InconsistentOverloads:OFF -Xep:SameNameButDifferent:OFF -Xep:UnnecessaryLambda:OFF -Xep:UnnecessaryAnonymousClass:OFF -Xep:LiteProtoToString:OFF -Xep:MissingSummary:OFF -Xep:ReturnFromVoid:OFF -Xep:EmptyCatch:OFF -Xep:BadImport:OFF -Xep:UseCorrectAssertInTests:OFF -Xep:InlineFormatString:OFF -Xep:DefaultPackage:OFF -Xep:RefersToDaggerCodegen:OFF -Xep:RemoveUnusedImports:OFF -Xep:UnnecessaryParentheses:OFF -Xep:UnicodeEscape:OFF -Xep:AlreadyChecked:OFF -Xep:BinderIdentityRestoredDangerously:WARN -Xep:EmptyIf:WARN -Xep:EqualsBrokenForNull:WARN -Xep:InvalidThrows:WARN -Xep:LongLiteralLowerCaseSuffix:WARN -Xep:MultiVariableDeclaration:WARN -Xep:RedundantOverride:WARN -Xep:StaticQualifiedUsingExpression:WARN -Xep:StringEquality:WARN -Xep:TimeUnitMismatch:WARN -Xep:UnnecessaryStaticImport:WARN -Xep:UseBinds:WARN -Xep:WildcardImport:WARN' -XDshould-stop.ifNoError=FLOW -proc:none -processorpath lib.java/tools/android/errorprone_plugin/errorprone_plugin.jar:lib.java/third_party/android_deps/com_google_auto_service_auto_service_annotations.jar:lib.java/third_party/android_deps/com_google_code_findbugs_jsr305.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_annotations.jar:lib.java/third_party/android_deps/com_google_guava_failureaccess.jar:lib.java/third_party/android_deps/com_google_guava_listenablefuture.jar:lib.java/third_party/android_deps/com_google_j2objc_j2objc_annotations.jar:lib.java/third_party/android_deps/org_checkerframework_checker_qual.jar:lib.java/third_party/android_deps/com_google_guava_guava.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_annotation.jar:lib.java/third_party/android_deps/com_github_ben_manes_caffeine_caffeine.jar:lib.java/third_party/android_deps/com_github_kevinstern_software_and_algorithms.jar:lib.java/third_party/android_deps/com_google_auto_value_auto_value_annotations.jar:lib.java/third_party/android_deps/org_eclipse_jgit_org_eclipse_jgit.jar:lib.java/third_party/android_deps/io_github_java_diff_utils_java_diff_utils.jar:lib.java/third_party/android_deps/org_checkerframework_dataflow_errorprone.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_check_api.jar:lib.java/third_party/android_deps/com_google_auto_auto_common.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_type_annotations.jar:lib.java/third_party/android_deps/com_google_protobuf_protobuf_java.jar:lib.java/third_party/android_deps/org_pcollections_pcollections.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_core.jar:lib.java/third_party/android_deps/com_google_errorprone_javac.jar -Werror -d obj/sdk/android/peerconnection_java__errorprone.errorprone.stamp.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/sdk/android/peerconnection_java.turbine.jar:obj/modules/audio_device/audio_device_java.turbine.jar:obj/sdk/android/logging_java.turbine.jar:obj/sdk/android/java_audio_device_module_java.turbine.jar:obj/sdk/android/default_video_codec_factory_java.turbine.jar:obj/sdk/android/swcodecs_java.turbine.jar:obj/sdk/android/libvpx_vp9_java.turbine.jar:obj/sdk/android/libvpx_vp8_java.turbine.jar:obj/sdk/android/dav1d_java.turbine.jar:obj/sdk/android/hwcodecs_java.turbine.jar:obj/sdk/android/video_java.turbine.jar:obj/sdk/android/video_api_java.turbine.jar:obj/sdk/android/builtin_audio_codecs_java.turbine.jar:obj/sdk/android/audio_api_java.turbine.jar:obj/rtc_base/base_java.turbine.jar:obj/sdk/android/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/sdk/android/peerconnection_java__errorprone.errorprone.stamp.staging/files_list.txt
[4565/4565] SOLINK ./libjingle_peerconnection_so.so
INFO:root:Collecting common files.
INFO:root:Collecting: armeabi-v7a
INFO:root:Collecting: arm64-v8a
INFO:root:Collecting: x86
INFO:root:Collecting: x86_64
INFO:root:List of licenses: webrtc, abseil-cpp, android_deps, android_ndk, android_sdk, androidx, base64, boringssl, crc32c, dav1d, fft, fiat, g711, g722, ijar, jdk, libaom, libc++, libc++abi, libevent, libjpeg_turbo, libsrtp, libunwind, libvpx, libyuv, nasm, ooura, opus, pffft, protobuf, rnnoise, sigslot, spl_sqrt_floor, zlib
INFO:root:Skipping compile time or internal dependency: android_deps
INFO:root:Skipping compile time or internal dependency: androidx
INFO:root:Skipping compile time or internal dependency: jdk
xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ 


默认生成的aar文件名是:libwebrtc.aar
图片.png打开看看:
图片.png图片.png
对比下Google提供的aar包:
图片.png一样的,并没有什么问题。如果希望了解build_aar.py的更多参数用法,建议还是看下源码,这里就不过多阐述了了。
解析参数的方法在这:

def _ParseArgs():
  parser = argparse.ArgumentParser(description='libwebrtc.aar generator.')
  parser.add_argument(
      '--build-dir',
      type=os.path.abspath,
      help='Build dir. By default will create and use temporary dir.')
  parser.add_argument('--output',
                      default='libwebrtc.aar',
                      type=os.path.abspath,
                      help='Output file of the script.')
  parser.add_argument('--arch',
                      default=DEFAULT_ARCHS,
                      nargs='*',
                      help='Architectures to build. Defaults to %(default)s.')
  parser.add_argument('--use-goma',
                      action='store_true',
                      default=False,
                      help='Use goma.')
  parser.add_argument('--use-remoteexec',
                      action='store_true',
                      default=False,
                      help='Use RBE.')
  parser.add_argument('--use-unstripped-libs',
                      action='store_true',
                      default=False,
                      help='Use unstripped .so files within libwebrtc.aar')
  parser.add_argument('--verbose',
                      action='store_true',
                      default=False,
                      help='Debug logging.')
  parser.add_argument(
      '--extra-gn-args',
      default=[],
      nargs='*',
      help="""Additional GN arguments to be used during Ninja generation.
              These are passed to gn inside `--args` switch and
              applied after any other arguments and will
              override any values defined by the script.
              Example of building debug aar file:
              build_aar.py --extra-gn-args='is_debug=true'""")
  parser.add_argument(
      '--extra-ninja-switches',
      default=[],
      nargs='*',
      help="""Additional Ninja switches to be used during compilation.
              These are applied after any other Ninja switches.
              Example of enabling verbose Ninja output:
              build_aar.py --extra-ninja-switches='-v'""")
  parser.add_argument(
      '--extra-gn-switches',
      default=[],
      nargs='*',
      help="""Additional GN switches to be used during compilation.
              These are applied after any other GN switches.
              Example of enabling verbose GN output:
              build_aar.py --extra-gn-switches='-v'""")
  return parser.parse_args()

比如,我想生成指定平台的so,那就可以这样执行:

./tools_webrtc/android/build_aar.py --extra-gn-args "treat_warnings_as_errors=false" --arch "armeabi-v7a" "arm64-v8a"

最后生成libwebrtc.aar就只包含"armeabi-v7a" 和"arm64-v8a"的so:
图片.pngaar包的大小从41.8M变成17.2M。

发布aar到GitHubPackages

为什么不用Sonatype Nexus Repository Manager?当然是没钱了,额外搞一台云服务器当做Maven仓库还是有一定成本的。
为什么不发布到mavenCentral()仓库?当然是因为太麻烦了,毕竟WebRTC的aar只是编译来自己用用而已。
为什么不用JitPack?因为JitPack不支持直接上传aar,必须搞一个模块放到Github上让JitPack自己编译成aar,虽然也可行,但是依然有些麻烦。
经过一番对比,发现GitHubPackages还是挺好的。
扩展阅读:Github官方文档GitHubPackages

使用Maven Publish插件发布aarGitHubPackages

Maven Publish插件的使用就不多介绍了,见官方文档:https://docs.gradle.org/current/userguide/publishing_maven.html

打开AndroidStudio,新建一个WebRTCAndroidMavenPublish的工程,再新建一个maven_publish_libwebrtc module:
image.png
module的build.gradle完整内容如下:

plugins {
    
    
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
    id 'maven-publish'
}

android {
    
    
    namespace 'com.nxg.maven_publish_libwebrtc'
    compileSdk 33

    defaultConfig {
    
    
        minSdk 24
        targetSdk 33

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
    
    
        release {
    
    
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
    
    
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
    
    
        jvmTarget = '1.8'
    }
}

dependencies {
    
    

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

publishing {
    
    

    repositories {
    
    
        maven {
    
    
            name = "GitHubPackages"
            url = "https://maven.pkg.github.com/xiangang/webrtc-android-maven"
            version = '1.0.0'//版本号
            credentials {
    
    
                username = project.findProperty("GITHUB_ACTOR") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("GITHUB_TOKEN") ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }

    publications {
    
    
        androidWebRTC(MavenPublication) {
    
    
            groupId = 'com.github.xiangang'//域名反写
            artifactId = 'libwebrtc'//aar的名称
            artifact "/work/webrtc-checkout/src/libwebrtc.aar"//aar包的目录
        }
    }
}

首先引用了maven publish插件:

plugins {
    
    
    id 'maven-publish'
}

然后就可以使用这个插件了:

publishing {
    
    
    repositories {
    
    
        maven {
    
    
            name = "GitHubPackages"
            url = "https://maven.pkg.github.com/xiangang/webrtc-android-maven"
            version = '1.0.0'//版本号
            credentials {
    
    
                username = project.findProperty("GITHUB_ACTOR") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("GITHUB_TOKEN") ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }

    publications {
    
    
        androidWebRTC(MavenPublication) {
    
    
            groupId = 'com.github.xiangang'//域名反写
            artifactId = 'libwebrtc'//aar的名称
            artifact "/work/webrtc-checkout/src/libwebrtc.aar"//aar包的目录
        }
    }
}

插件的使用可以参考Github官方文档:使用 Gradle 发布 Java 包,受限于篇幅笔者就不多啰嗦了,照猫画虎就完事了。

你需要新建自己一个仓库,笔者这里是仓库是:webrtc-android-maven,生成这个仓库专用的GITHUB_TOKEN,有关详细信息,请查看“使用 GITHUB_TOKEN 进行身份验证。”

笔者的GITHUB_ACTOR和GITHUB_TOKEN保存在项目中的gradle.properties,当然也可以保存在编译系统的环境变量中。
image.png
publications的androidWebRTC是自己命名的,你可以自定义。因为要发布的aar是现成的,所以需要使用artifact定义aar的路径。

准备就绪,执行对应的gradle task即可发布。
image.png
执行过程截图:
image.png
进入Github页面就可以看到发布的packages了:
image.png打开链接:
image.png上传成功!

Gradle引用GitHubPackages上的aar

gradle怎么引用GitHubPackage的aar?也很简单。
以笔者这篇文章Android 音视频开发实践系列-04-Android WebRTC推流到SRS服务器实现推拉流功能的工程为例子,在项目根目录的build.gradle加上这个maven配置如下:
image.pngimage.png
注意,必须带上credentials,否则获取不到。

allprojects {
    
    
    repositories {
    
    
        jcenter()
        google()
        maven {
    
     url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        maven {
    
    
            name = "GitHubPackages"
            url = "https://maven.pkg.github.com/xiangang/webrtc-android-maven"
            credentials {
    
    
                username = project.findProperty("GITHUB_ACTOR") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("GITHUB_TOKEN") ?: System.getenv("GITHUB_TOKEN")
            }
        }
        maven {
    
     url 'https://jitpack.io' }
    }
}

那你可能会说别人要用你的aar怎么办?公开TOKEN?说对了,可以单独生成引用aar专用的TOKEN并公开,Github控制权限做的挺好的。当然了,你可以直接上传aar,别人直接下载到本地使用,或者上传到其他maven仓库。笔者是不建议使用GitHubPackages的,实在是太慢了。

创建自己的分支

一般使用release分支来创建自己的分支,执行命令查看:git branch -r
image.png创建自己的分支:git checkout -b xiangang_webrtc origin/main
执行同步命令:gclient sync
image.png

代码更新

如果需要更新代码,其实就是跟Git一样使用就好,更新更新之后使用gcient sync命令同步:

git checkout master
git pull origin master
gclient sync
git checkout xiangang_webrtc 
git merge master

常见报错解决方案总结

curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443: 连接超时

解决:需要稳定的科学上网工具,笔者用的是Qv2ray,前面下载同步WebRTC源码的章节有介绍。
image.png

bootstrap_python3: 行 32: bootstrap-3.8.0.chromium.8_bin/python3/bin/python3: 没有那个文件或目录

解决:使用科学上网工具。
为什么?我们打开bootstrap_python3看看:
image.png再看看depot_tools目录,确实没有这个 bootstrap-3.8.0.chromium.8_bin/python3/bin/python3文件。此时,你可能灵机一动(是笔者本人了),这里不是python3吗?我直接安装不就好了,使用pyenv还支持多版本共存,随时切换,岂不是美滋滋。但是对不起,要是真的这样做,就进坑里了。

首先我们得搞明白,为什么 bootstrap-3.8.0.chromium.8_bin/python3/bin/python3没有,是Google忘记了?当然不是。而是bootstrap-3.8.0.chromium.8_bin是大文件,需用使用CIPD工具连接到https://chrome-infra-packages.appspot.com进行下载,depot_tools不包含这些大文件工具。

CIPD全称Chrome Infrastructure Package Deployment(https://chromium.googlesource.com/infra/luci/luci-go/+/main/cipd/README.md)),主要用于管理Google项目构建中用到的二进制文件(例如编译器之类的),你可以简单的认为是针对大文件的git系统。
CIPD管理的所有文件可以在(https://chrome-infra-packages.appspot.com))上查看

因此,即便我们使用的depot_tools是通过国内的镜像下载,我们仍然需要科学上网工具来进一步下载所需的其他大文件工具。看看论坛上这些提供,一样的报错,答案是肯定的,就是需要科学上网工具。
image.png
image.png

gclient: 第 32 行: exec: python:未找到

解决:命令行执行export GCLIENT_PY3=1即可。 打开gclient,可以看到执行了python。
image.png但是本机上没安装python,depot_tools目录下也没有python,只有vpython3。
image.png既然如此,直接用vpython3即可。根据代码得知GCLIENT_PY3==1使用vpython3。

ERROR at //build/config/sysroot.gni:62:7: Assertion failed.

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ gn gen out/Default
ERROR at //build/config/sysroot.gni:62:7: Assertion failed.
      assert(
      ^-----
Missing sysroot (//build/linux/debian_bullseye_amd64-sysroot). To fix, run: build/linux/sysroot_scripts/install-sysroot.py --arch=amd64
See //build/config/sysroot.gni:63:11: 
          exec_script("//build/dir_exists.py",
          ^-----------------------------------
This is where it was set.
See //build/config/linux/pkg_config.gni:5:1: whence it was imported.
import("//build/config/sysroot.gni")
^----------------------------------
See //BUILD.gn:24:1: whence it was imported.
import("//build/config/linux/pkg_config.gni")
^-------------------------------------------

解决:执行build/linux/sysroot_scripts/install-sysroot.py --arch=amd64

ERROR at //build/config/compiler/BUILD.gn:1418:22:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ gn gen out/Default
ERROR at //build/config/compiler/BUILD.gn:1418:22: Script returned non-zero exit code.
    clang_revision = exec_script("//tools/clang/scripts/update.py",
                     ^----------
Current dir: /media/xiangang/Repository/webrtc/webrtc-github/src/out/Default/
Command: python3 /media/xiangang/Repository/webrtc/webrtc-github/src/tools/clang/scripts/update.py --print-revision --verify-version=16
Returned 1 and printed out:

The expected clang version is llvmorg-16-init-17653-g39da55e8-2 but the actual version is 
Did you run "gclient sync"?

See //build/config/BUILDCONFIG.gn:335:3: which caused the file to be included.
  "//build/config/compiler:cet_shadow_stack",
  ^-----------------------------------------

解决:重新执行gclient sync即可。

FAILED: obj/sdk/android/base_java.javac.jar obj/sdk/android/base_java.javac.jar.info

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ ./tools_webrtc/android/build_aar.py
INFO:root:Building: armeabi-v7a
Done. Made 5847 targets from 338 files in 426ms
ninja: Entering directory `/tmp/tmp6ozvfe9z/armeabi-v7a'
[3311/4313] ACTION //sdk/android:base_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/sdk/android/base_java.javac.jar obj/sdk/android/base_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/sdk/android/base_java__compile_java.d --generated-dir=gen/sdk/android/base_java/generated_java --jar-path=obj/sdk/android/base_java.javac.jar --java-srcjars=\[\"gen/sdk/android/base_java.generated.srcjar\"\] --target-name //sdk/android:base_java__compile_java --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/sdk/android/base_java.turbine.jar --classpath=\[\"obj/sdk/android/base_java.turbine.jar\"\] --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/sdk/android/base_java.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/sdk/android/src/java/org/webrtc/RefCountDelegate.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/sdk/android/base_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/sdk/android/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/sdk/android/base_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3315/4313] ACTION //tools/android/errorprone_plugin:errorprone_plugin__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/tools/android/errorprone_plugin/errorprone_plugin__compile_java.d --generated-dir=gen/tools/android/errorprone_plugin/errorprone_plugin/generated_java --jar-path=obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar --java-srcjars=\[\"gen/tools/android/errorprone_plugin/errorprone_plugin.generated.srcjar\"\] --target-name //tools/android/errorprone_plugin:errorprone_plugin__compile_java --header-jar obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar --classpath=\[\"obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar\"\] --classpath=@FileArg\(gen/tools/android/errorprone_plugin/errorprone_plugin.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors @gen/tools/android/errorprone_plugin/errorprone_plugin.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/tools/android/errorprone_plugin/src/org/chromium/tools/errorprone/plugin/NoSynchronizedMethodCheck.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/classes -classpath obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar:obj/third_party/android_deps/com_google_errorprone_javac.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_core.ijar.jar:obj/third_party/android_deps/org_pcollections_pcollections.ijar.jar:obj/third_party/android_deps/com_google_protobuf_protobuf_java.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_type_annotations.ijar.jar:obj/third_party/android_deps/com_google_auto_auto_common.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_check_api.ijar.jar:obj/third_party/android_deps/org_checkerframework_dataflow_errorprone.ijar.jar:obj/third_party/android_deps/io_github_java_diff_utils_java_diff_utils.ijar.jar:obj/third_party/android_deps/org_eclipse_jgit_org_eclipse_jgit.ijar.jar:obj/third_party/android_deps/com_google_auto_value_auto_value_annotations.ijar.jar:obj/third_party/android_deps/com_github_kevinstern_software_and_algorithms.ijar.jar:obj/third_party/android_deps/com_github_ben_manes_caffeine_caffeine.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotation.ijar.jar:obj/third_party/android_deps/com_google_guava_guava.ijar.jar:obj/third_party/android_deps/org_checkerframework_checker_qual.ijar.jar:obj/third_party/android_deps/com_google_j2objc_j2objc_annotations.ijar.jar:obj/third_party/android_deps/com_google_guava_listenablefuture.ijar.jar:obj/third_party/android_deps/com_google_guava_failureaccess.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotations.ijar.jar:obj/third_party/android_deps/com_google_code_findbugs_jsr305.ijar.jar:obj/third_party/android_deps/com_google_auto_service_auto_service_annotations.ijar.jar @obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3322/4313] ACTION //modules/audio_device:audio_device_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/modules/audio_device/audio_device_java.javac.jar obj/modules/audio_device/audio_device_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/modules/audio_device/audio_device_java__compile_java.d --generated-dir=gen/modules/audio_device/audio_device_java/generated_java --jar-path=obj/modules/audio_device/audio_device_java.javac.jar --java-srcjars=\[\"gen/modules/audio_device/audio_device_java.generated.srcjar\"\] --target-name //modules/audio_device:audio_device_java__compile_java --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/modules/audio_device/audio_device_java.turbine.jar --classpath=\[\"obj/modules/audio_device/audio_device_java.turbine.jar\"\] --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/modules/audio_device/audio_device_java.sources
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/modules/audio_device/audio_device_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/modules/audio_device/audio_device_java.turbine.jar:obj/rtc_base/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/modules/audio_device/audio_device_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3336/4313] ACTION //third_party/android_deps:org_jetbrains_kotlin_kotlin_stdlib_java__dex(//build/toolchain/android:android_clang_arm)
ninja: build stopped: subcommand failed.
Traceback (most recent call last):
  File "./tools_webrtc/android/build_aar.py", line 269, in <module>
    sys.exit(main())
  File "./tools_webrtc/android/build_aar.py", line 263, in main
    BuildAar(args.arch, args.output, args.use_goma, args.use_remoteexec,
  File "./tools_webrtc/android/build_aar.py", line 243, in BuildAar
    Build(build_dir, arch, use_goma, use_remoteexec, extra_gn_args,
  File "./tools_webrtc/android/build_aar.py", line 198, in Build
    _RunNinja(output_directory, ninja_args)
  File "./tools_webrtc/android/build_aar.py", line 129, in _RunNinja
    subprocess.check_call(cmd)
  File "/work/depot_tools/.cipd_bin/.cipd/pkgs/0/Gz9krHL6kKjbvGdxI5atUyCuwSXBMIhmVrK6FblTzSIC/3.8/lib/python3.8/subprocess.py", line 364, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/media/xiangang/Repository/webrtc/webrtc-github/src/third_party/ninja/ninja', '-C', '/tmp/tmp6ozvfe9z/armeabi-v7a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']' returned non-zero exit status 1.
xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ 


解决:./tools_webrtc/android/build_aar.py改为./tools_webrtc/android/build_aar.py --extra-gn-args "treat_warnings_as_errors=false"即可。

小结

如果打算从官方下载WebRTC源码来编译,那么无法直接连接外网,你将会遇到很多困难。虽然目前也有WebRTC镜像,但是部分工具如vpython等依然要从国外的服务器下载,像如chromium的buildtools也不在WebRTC的仓库中,因此如果没有科学上网工具,真的不要折磨自己了,真的很坑很麻烦。

很幸运,如果您看到了本文,并且您打算编译WebRTC源码,那么很多常见的坑都可以跳过,帮助您节约大量的时间。

操作 没有科学上网工具 有科学上网工具
下载depot_tools 难易程度:★★☆☆☆ 难易程度:★☆☆☆☆
下载WebRTC源码 难易程度:★★★★☆ 难易程度:★☆☆☆☆
国内镜像 Google仓库 Github镜像
推荐指数:☆☆☆☆☆ 推荐指数:★★★★★ 推荐指数:★☆☆☆☆

总之,最简单,最推荐就是开启网络代理,跟着官方文档走,从Google仓库下载源码,开启你的编译之路。祝大家一切顺利!更多问题,欢迎留言沟通。

写在最后,首先非常感谢您耐心阅读完整篇文章,坚持写原创且基于实战的文章不是件容易的事,如果本文刚好对您有点帮助,欢迎您给文章点赞评论,您的鼓励是笔者坚持不懈的动力。若文章有不对之处也欢迎指正,再次感谢。

参考资料

Google官方WebRTFC:https://webrtc.googlesource.com/src
声网Agora WebRTC团队提供的 WebRTC 镜像源:https://webrtc.org.cn/mirror
Github WebRTC镜像:https://github.com/ibaoger/webrtc.git
南北丶一文搞定 WebRTC|Android 客户端编译

猜你喜欢

转载自blog.csdn.net/xiangang12202/article/details/128962094