本文在公众号
音视频进阶之路
首发,阅读约需求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
gitclonehttps://chromium.googlesource.com/chromium/tools/depot_tools.git
装备环境变量
echo"exportPATH=$PWD/depot_tools:$PATH">$HOME/.bashrc source$HOME/.bashrc
-
检测装备是否成功
echo$PATH
源码下载
-
创立文件夹
mkdirwebrtc_android&&cdwebrtc_android
-
获取源码(18G 左右,需求安稳署理)
fetch--nohookswebrtc_android
fetch --nohooks webrtc_android
失利直接履行gclient sync --nohooks
进行同步 -
分支切换
cdsrc gitcheckout-bm84/4147branch-heads/4147
-
同步方针分支代码
cd.. gclientsync--nohooks gclientrunhooks
注:gclient sync –nohooks、gclient runhooks 哪个失利,从头履行哪个
源码编译
-
装置编译依靠(30 分钟左右)
./src/build/install-build-deps.sh ./src/build/install-build-deps-android.sh
-
设置编译参数,生成
ninja
文件cdsrc gngenout/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-Cout/build
非全量编译
ninja -C out/build AppRTCMobile
注:out/build 即编译生成文件的目录,两者有必要共同
-
首要获取的文件
-
- out/build/lib.java/sdk/android/libwebrtc.jar
- out/build/libjingle_peerconnection_so.so
-
生成 aar
pythontools_webrtc/android/build_aar.py--output"libwebrtc.aar"--arch"armeabi-v7a""arm64-v8a"--build-dirout/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
implementationfileTree(dir:'../../../',include:['libwebrtc.aar'])
Q&A
-
履行 gclient runhooks 时
pythonsrc/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--depfilegen/base/base_build_config_gen_BuildConfig.d--include-path../../../--outputgen/base/base_build_config_gen/java_cpp_template/org/chromium/base/BuildConfig.java--template=../../../base/android/java/templates/BuildConfig.template Traceback(mostrecentcalllast): File"../../../build/android/gyp/gcc_preprocess.py",line54,in<module> sys.exit(main(sys.argv[1:])) File"../../../build/android/gyp/gcc_preprocess.py",line47,inmain DoGcc(options) File"../../../build/android/gyp/gcc_preprocess.py",line31,inDoGcc build_utils.CheckOutput(gcc_cmd) File"../../WebRTC/src/build/android/gyp/util/build_utils.py",line261,inCheckOutput sys.stderr.write(stderr) TypeError:write()argumentmustbestr,notbytes
解决方案:
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 分支编译报错
Commandfailedbecauseitwrotetostderr Youcanoftensettreat_warnings_as_errors=falsetonottreatoutputasfailure(usefulwhendevelopinglocally).
从头编译
gngenout/m89/release--args='target_os="android"target_cpu="arm64"is_debug=falsetreat_warnings_as_errors=false'
-
编译报错:ModuleNotFoundError: No module named ‘dataclasses’
-
-
python2
sudoaptinstallpython-pip pipinstalldataclasses
-
python3
sudoaptinstallpython3-pip pip3installdataclasses
-
-
编译报错:ERROR: The installation of the Chrome OS default fonts failed.
ERROR:TheinstallationoftheChromeOSdefaultfontsfailed.Thisisexpectedifyourrepoisinstalledonaremotefilesystem.Itisrecommendedtoinstallyourrepoonalocalfilesystem.YoucanskiptheinstallationoftheChromeOSdefaultfountswiththecommandlineoption:--no-chromeos-fonts.
从头装置依靠
./src/build/install-build-deps.sh--no-chromeos-fonts
-
M89/4389 编译 aar 报错
Traceback(mostrecentcalllast): ... File"../../../../../build/android/gyp/compile_java.py",line501,in_RunCompiler fail_on_output=options.warnings_as_errors) File"../../WebRTC/src/build/android/gyp/util/build_utils.py",line292,inCheckOutput raiseCalledProcessError(cwd,args,MSG.format(stream_string)) util.build_utils.CalledProcessError: .... Youcanoftensettreat_warnings_as_errors=falsetonottreatoutputasfailure(usefulwhendevelopinglocally). [2415/3419]CXXobj/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']'returnednon-zeroexitstatus1
从头编译
pythontools_webrtc/android/build_aar.py--output"libwebrtc-m89.aar"--arch"armeabi-v7a""arm64-v8a"--build-dirout/m89/build/aar--extra-gn-args='treat_warnings_as_errors=false'
参阅
WebRTC官网(webrtc.org/)
Android|WebRTC(webrtc.github.io/webrtc-org/…