赞
踩
之前在Linux服务器上编译过Webrtc,现在需要将部分功能移植到Client端,需要重新编译,本文章将介绍如何编译客户端WebRTC、编译过程中遇到了哪些坑,以及编译前的准备工作。
笔者开始是在MAC上虚拟Docker 编译,因机器性能原因,又重新找了台Win本,重装了双系统,在Ubuntu 上最终编译完成。
WebRTC 版本变更频繁,各版本编译时差异较大,本次笔者基于m84分支,文章最后也给出了其他分支编译出现的问题。
关注+后台私信我,领取2022最新最全学习提升资料包《Andoird音视频开发必备手册+音视频最新学习视频+大厂面试真题+2022最新学习路线图+项目实战源码》资料内容包括(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)等等
安装 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 即编译生成文件的目录,两者必须一致
主要获取的文件
生成 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 验证是否可用。
生成动态库.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'])
- 复制代码
执行 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/…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。