本文在公众号
音视频进阶之路
首发,阅读约需要5分钟.
目录
- 前言
- 重要分支描述
- 准备工作
- 验证
- Other
- Q&A
- 参考
前言
之前在Linux服务器上编译过Webrtc,现在需要将部分功能移植到Client端,需要重新编译,本文章将介绍如何编译客户端WebRTC、编译过程中遇到了哪些坑,以及编译前的准备工作。
笔者开始是在MAC上虚拟Docker 编译,因机器性能原因,又重新找了台Win本,重装了双系统,在Ubuntu 上最终编译完成。
WebRTC 版本变更频繁,各版本编译时差异较大,本次笔者基于m84分支,文章最后也给出了其他分支编译出现的问题。
重要分支描述
- 关键版本对应分支
-
- m84 branch-heads/4147 (2020年6月稳定)
- m89 branch-heads/4389 (2021年2月稳定)
- m93 branch-heads/4577 (2022年1月稳定)
- 关键版本支持的Android 版本
-
- m84/4147 android:minSdkVersion="16" android:targetSdkVersion="23"
- m89/4389 android:minSdkVersion="21" android:targetSdkVersion="23"
- m93/4577 android:minSdkVersion="21" android:targetSdkVersion="23"
准备工作
安装 depot_tools(需要用到depot_tools工具来下载webrtc源码)
-
git 命令获取 depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 复制代码
配置环境变量
echo "export PATH=$PWD/depot_tools:$PATH" > $HOME/.bashrc source $HOME/.bashrc 复制代码
-
检测配置是否成功
echo $PATH 复制代码
源码下载
-
创建文件夹
mkdir webrtc_android && cd webrtc_android 复制代码
-
获取源码(18G 左右,需要稳定代理)
fetch --nohooks webrtc_android 复制代码
fetch --nohooks webrtc_android
失败直接执行gclient sync --nohooks
进行同步 -
分支切换
cd src git checkout -b m84/4147 branch-heads/4147 复制代码
-
同步目标分支代码
cd .. gclient sync --nohooks gclient runhooks 复制代码
注:gclient sync --nohooks、gclient runhooks 哪个失败,重新执行哪个
源码编译
-
安装编译依赖(30 分钟左右)
./src/build/install-build-deps.sh ./src/build/install-build-deps-android.sh 复制代码
-
设置编译参数,生成
ninja
文件cd src gn gen out/build --args='target_os="android" target_cpu="arm" is_debug=false' 复制代码
cd src gn gen out/build --args='target_os="android" target_cpu="arm" is_debug=false'
out/build
:编译生成文件的目录,随意指定``target_os
:编译目标平台
android、ios` 等target_cpu
:CPU架构平台arm、arm64、x86、x64
等is_debug
:Release
模式或者Debug
模式 -
开始编译
编译(1w 多个构建任务,编译时长 2 个小时左右)
-
全量编译
ninja -C out/build 复制代码
非全量编译
ninja -C out/build AppRTCMobile 复制代码
注:out/build 即编译生成文件的目录,两者必须一致
-
主要获取的文件
-
- out/build/lib.java/sdk/android/libwebrtc.jar
- out/build/libjingle_peerconnection_so.so
-
生成 aar
python tools_webrtc/android/build_aar.py --output "libwebrtc.aar" --arch "armeabi-v7a" "arm64-v8a" --build-dir out/Release 复制代码
成功后会在 src 目录下看到 libwebrtc.aar 文件,里面就是 Android 开发需要用到的 SDK 了。out/Release目录是编译目录,第一编译会全量编译速度很慢(预计30~40分钟),以后就增量编译很快(预计10s内)。
验证
验证 aar 是否可用
官方 demo 在 src/examples
目录中,可导入编译生成的 aar 验证是否可用。
Other
-
生成动态库.so文件,生成so文件首次会全量编译,后续增量编译速度非常快。如果以后只改C层代码不生成Java的API,这种方法非常适合测试
ninja -C out/Debug sdk/android:libjingle_peerconnection_so
-
生成静态库.a文件
ninja -C out/Debug
生成的.a文件在out/Debug/obj/libwebrtc.a
-
配置android studio工程
使用Android Studio直接打开webrtc_android/src/examples/aarproject/,编辑app/build.gradle:删除
implementation 'org.webrtc:google-webrtc:1.0.+' 复制代码
替换为 native 步骤编译的 libwebrtc.aar
implementation fileTree(dir: '../../../', include: ['libwebrtc.aar']) 复制代码
Q&A
-
执行 gclient runhooks 时
python src/build/linux/sysroot_scripts/install-sysroot.py --arch=i386 复制代码
下载失败
将
install-sysroot.py
中range(3)
重试次数由 3 调大一些 -
M84/4147 分支编译报错
[996/11199] ACTION //base:base_build_config_gen_...c(//build/toolchain/android:android_clang_arm64) FAILED: gen/base/base_build_config_gen/java_cpp_template/org/chromium/base/BuildConfig.java python ../../../build/android/gyp/gcc_preprocess.py --depfile gen/base/base_build_config_gen_BuildConfig.d --include-path ../../../ --output gen/base/base_build_config_gen/java_cpp_template/org/chromium/base/BuildConfig.java --template=../../../base/android/java/templates/BuildConfig.template Traceback (most recent call last): File "../../../build/android/gyp/gcc_preprocess.py", line 54, in <module> sys.exit(main(sys.argv[1:])) File "../../../build/android/gyp/gcc_preprocess.py", line 47, in main DoGcc(options) File "../../../build/android/gyp/gcc_preprocess.py", line 31, in DoGcc build_utils.CheckOutput(gcc_cmd) File "../../WebRTC/src/build/android/gyp/util/build_utils.py", line 261, in CheckOutput sys.stderr.write(stderr) TypeError: write() argument must be str, not bytes 复制代码
解决方案:
python 版本不兼容,M84 需要使用 python2 编译
查看 python 版本
python --version
移除原默认 python
sudo rm -rf /usr/bin/python
指定新默认 python
sudo ln -s /usr/bin/python2 /usr/bin/python
重新编译
-
M93/4577 分支编译报错
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). 复制代码
重新编译
gn gen out/m89/release --args='target_os="android" target_cpu="arm64" is_debug=false treat_warnings_as_errors=false' 复制代码
-
编译报错:ModuleNotFoundError: No module named 'dataclasses'
-
-
python2
sudo apt install python-pip pip install dataclasses 复制代码
-
python3
sudo apt install python3-pip pip3 install dataclasses 复制代码
-
-
编译报错:ERROR: The installation of the Chrome OS default fonts failed.
ERROR: The installation of the Chrome OS default fonts failed. This is expected if your repo is installed on a remote file system. It is recommended to install your repo on a local file system. You can skip the installation of the Chrome OS default founts with the command line option: --no-chromeos-fonts. 复制代码
重新安装依赖
./src/build/install-build-deps.sh --no-chromeos-fonts 复制代码
-
M89/4389 编译 aar 报错
Traceback (most recent call last): ... File "../../../../../build/android/gyp/compile_java.py", line 501, in _RunCompiler fail_on_output=options.warnings_as_errors) File "../../WebRTC/src/build/android/gyp/util/build_utils.py", line 292, in CheckOutput raise CalledProcessError(cwd, args, MSG.format(stream_string)) util.build_utils.CalledProcessError: .... You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally). [2415/3419] CXX obj/api/libjingle_peer...ection_api/peer_connection_interface.o ... subprocess.CalledProcessError: Command '['../../WebRTC/src/third_party/depot_tools/ninja', '-C', 'out/m89/build/aar/armeabi-v7a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']' returned non-zero exit status 1 复制代码
重新编译
python tools_webrtc/android/build_aar.py --output "libwebrtc-m89.aar" --arch "armeabi-v7a" "arm64-v8a" --build-dir out/m89/build/aar --extra-gn-args='treat_warnings_as_errors=false' 复制代码
参考
WebRTC官网(webrtc.org/)
Android|WebRTC(webrtc.github.io/webrtc-org/…