(Android-RTC-2)源码下载编译Android-WebRTC,居然折腾了我那么多天!

开篇导读,工程目录在 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

android webrtc学习 一(源码下载和编译) - 知乎

WebRTC 编译指南 - 知乎

猜你喜欢

转载自blog.csdn.net/a360940265a/article/details/116048337