开篇导读,工程目录在 https://github.com/MrZhaozhirong/AppWebRTC 自行拾取。工程环境是Gradle4.0.x+Androidx,是手动重新fork整个WebRTCdemo,官方源码在这里。
一、源码下载
关于Android-WebRTC的源码下载编译很多教程。相关注意两个点:必须是用Linux系统,源码站点需要正确的上网方式,或者找国内镜像代替;根据实际情况把下载编译源码的过程记录在此,方便有需要的同学排忧解难。
有什么问题可以私信访问。以下是本文的无脑教程:
1、环境准备
正确科学严谨的上网方法,建议代理系统所有网络。
2、安装基础软件依赖
检查更新依赖库:$ sudo apt-get update
安装vim:$ sudo apt-get install vim
安装git:$ sudo apt-get install git
3、安装google工具和脚本
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
正常情况下,这个depot_tools下载是比较顺畅的。如果网络不通畅下载超时,可以为git配置以下代理
git config --global http.proxy = (通常是127.0.0.1):端口
git config --global https.proxy = (通常是127.0.0.1):端口
再专业一点,
export HTTPS_PROXY=http://proxy_ip:proxy_port #科学的上网方式设置参数
export HTTP_PROXY=http://proxy_ip:proxy_port #科学的上网方式设置参数
env GIT_SSL_NO_VERIFY=true #如果fetch代码遇到ssl报错,请设置这个环境变量
vim ~/.boto
增加.boto代理出口文件,内容如下
[Boto]
proxy=ip
proxy_port=端口
export NO_AUTH_BOTO_CONFIG=~/.boto #结合自己的情况设置路径
4、下载完成之后,配置环境变量
$ vim ~/.bashrc
在文件最底下追加以下内容:
export DEPOT_TOOLS_PATH=~/depot_tools(自己写全绝对路径也可以啊)
export PATH=${PATH}:${DEPOT_TOOLS_PATH}
保存退出vim,使环境变量生效:$ source ~/.bashrc
5、开始拉取Android webrtc源码
$ mkdir webrtc
$ cd webrtc
$ fetch --nohooks webrtc_android
$ gclient sync //若遇到问题中断,可多执行几次
等待......这个过程会比较久,我下载的大小是18.7G左右。
可以使用指令:du -h --max-depth=0 查看当前根文件夹webertc/src的大小。
网上大神们都建议切换的稳定的分支拉取文件,做法就是一些git的操作:
git branch -r // 查看所有远程分支
git checkout m79 // 选择一个对应的稳定版,切换到稳定版本m79
gclient sync// .... .... 等待同步完成之后
git checkout master
git pull origin master// 又冲突的就merge一下
git merge master
6、下载过程中的异常处理
在下载过程中,大部分问题就是源地址访问失败失效,举个自己的栗子:在下载到最后一个src / third_party / libunwindstack 出现失效的错误提示。从终端显示的日志上找到对应的git路径,访问后确实已经不存在任何的源码文件,重定向到这里了 :https://chromium.googlesource.com/chromium/src/third_party/libunwindstack/+/refs/heads/master,那自己手动下载下来放到对应路径的文件夹就完事了。思路无非两种:网络原理导致的失败,确认网络通畅重来;源地址失效问题,手动找新的源地址,下载放到源码目录对应的位置。]
多留意控制台下载出错的日志,出现意外中断(Unexpected terminal)就继续gclient sync。如果看见某个子项频繁try later,那就查看webrtc/src同级目录下存在的_bad_scm目录,里面寄存着还没下载完成or超时的子工程。_bad_scm为空或目录不存在,可以说明项目下载已下载完整。如果下载过程中出现停留在某个进度一直没啥改变,也可以尝试手动把_bad_scm里面的内容全部删除后再尝试。
出现 RPC failed transiently. Will retry in 1s。{"error":"failed to send request: .....} 那可以尝试设置 export DEPOT_TOOLS_UPDATE=0
(給多点耐心,給多点耐心,給多点耐心。)
PS:当你觉得下载已经完成了之后,想尝试进行编译前,可以把整个webrtc文件夹打个压缩包,方便重头再来(别问我重头再来了多少次)
二、编译Android-Webrtc
1、编译前安装依赖
$ cd src
$ ./build/install-build-deps.sh
$ ./build/install-build-deps-android.sh
$ ./build/android/envsetup.sh
执行如上指令,我遇到了几处坑:
1.1 如上图所示,执行./build/install-build-deps.sh 提示,主要原因是可能是本地机器安装过相同的依赖,但是没有安装成功,缓存在本地机器了。ubuntu18.04更新源失败,“无法安全地用该源进行更新,所以默认禁用该源”的解决办法_maxg1206的博客-CSDN博客_无法安全的用该源进行更新,所以默认禁用该源 参照这哥们中的方法2,删除etc/apt/sources.list.d 目录下的所有文件。
1.2 排除了上述的问题之后,还是执行./build/install-build-deps.sh,会出现如上2图所示,但是这个问题好解,人家已经給提示了,指令后追加 --no-chromeos-fonts,就是不安装chrome系统的字体。
1.3 执行第二条指令没遇到问题,到了第三条指令,提示ERROR:envsetup must be sourced. 直接翻译是 “环境设置必须来源”,理解其意思应该是环境变量相关。但其实 .sh 就是shell脚本,可以用文本编辑器vim直接打开阅读源码。如上3图所示,开头注释写明其实这一步是配置Android SDK tools到环境变量PATH,Use like:source build/android/envsetup.sh。重新执行该命令,之后可以输入$PATH 查看一下环境变量,看看android_sdk是否设置到位。
2、编译依赖准备好之后,就可以开始编译了。
2.1 编译前,先安装gn
https://chrome-infra-packages.appspot.com/dl/gn/gn/linux-amd64/+/latest,放到/webrtc/src/buildtools/linux64路径下。
// 首先执行如下命令
gn gen out/debug/arm64-v8a --args='tartget_os="android" target_cpu="arm64" is_debug=true' // 注意单引号双引号
// 控制台没有问题反馈之后,执行如下指令
ninja -C out/debug/arm64-v8a
其中,--args后面跟随的是配置参数,target_cpu表示AndroidCPU架构,编译其他CPU架构如下:
ARM: target_cpu="arm"
ARM64: target_cpu="arm64"
32-bit x86: target_cpu="x86"
64-bit x64: target_cpu=“x64"
亦可以使用另外一种更方便的方式,编译脚本为webrtc/src/tools_webrtc/android/build_aar.py文件,编译命令行如下:
需要在src目录下执行(我自己是选择这种编译方式)
./tools_webrtc/android/build_aar.py --build-dir out --arch "armeabi-v7a" "arm64-v8a"
2.2 编译执行可能会遇到以下错误集锦:
- LASTCHANGE.committime , FileNotFoundError,具体如下图所示:
解决方法:到src目录下执行以下指令
./build/util/lastchange.py build/util/LASTCHANGE
PS:可能会出现很多FileNotFoundError,分清楚究竟是自己下载还没完整,还是需要手动执行一些前置脚本。
- build_install-sysroot 具体如下图所示:
控制台已给出解决方法:
到src目录下执行以下指令
./build/linux/sysroot_scripts/install-sysroot.py --arch=arm64
PS:这个类似的错误可能会出现多次,解决方法都是执行这个指令,但是--arch的参数可能是不一样!一定要仔细观察。
- treat_warnings_as_errors 具体如下图所示:
这个问题主要是编译java文件的时候使用了一些过时的API,把waning也当成error的级别上报了,控制给出了修改的提示。“You can oftern set treat_warnings_as_errors=false”,但是如何set treat_warnings_as_errors=false?没有详细说明,解决方法如下:
到webrtc/src/build/config/compiler/目录下打开compiler.gni,找到treat_warnings_as_errors修改赋值为false。
3、编译成功后,有哪些是对我们真正有用的?
到了这一步,恭喜你,已经把整个下载编译成功的完成了。留意控制台输出build完成后,我们可以到 src / out 下找到armeabi-v7a和arm64-v8a的产物。
out/arm64-v8a/lib.java/sdk/android/libwebrtc.jar 是能在Android上使用的jar文件。
out/arm64-v8a/libjingle_peerconnection_so.so 是能在Android上使用的so文件。
但其实这些产物其实都不需要我们费尽心思去自己下载源码编译,在之前的文章中我们在gradle.dependencies{ implementation 'org.webrtc:google-webrtc:1.0.32006' }就可以下载到所有可依赖的库文件。
我们真正需要的是什么?
如果在我们深入了解阅读源码的时候,sdk/android这个目录的一些文件中,引入到一些头文件,但是在源码目录里面你是找不到这些头文件的。譬如sdk/android/generated_peerconnection_jni/PeerConnectionFactory_jni.h,类似很多generated_***_jni这样的文件,网上说是通过执行py脚本生成的。其实这些是都是通过编译过程中,生成的中间文件。
这些才是我们真正需要的,在深入安卓版的webrtc源码分析,会让我们更好的理解整个代码流程。
这些头文件生成在 out / arn64-v8a / gen / sdk / android 的目录下,你在这会看到很多generated打开头的分级目录,这里就是源码引入的头文件相对路径。
还有什么不懂的,遇到困难的,接受私信,一起研究,扩充到错误集锦。
(附赠这次我自己编译的源码 pan.baidu.com/s/1vrVdY8BDirY0uY7w15XSSg 提取码: rzhd )
参阅资料:(还有网上许多前人的帮助贴,就不一一贴上。)
https://webrtc.googlesource.com/src/+/refs/heads/master
https://chromium.googlesource.com/chromium/src/third_party/+/refs/heads/main