相关资料太多、分散了,本文来自学习过程中笔记,添加一些摘要和索引
本文首发地址 https://blog.csdn.net/CSqingchen/article/details/120016697
最新更新地址 https://gitee.com/chenjim/chenjimblog


相关网址链接

WebRTC Android development
https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/android/index.md

google webrtc source code
https://github.com/chenjim/webrtc-mirror 已同步到4610
https://github.com/haiyangwu/webrtc-mirror
https://webrtc.googlesource.com/src/


Http 全局代理配置

# 修改shell配置文件 `~/.bashrc` `~/.zshrc`等
export http_proxy="http://127.0.0.1:7890"
export https_proxy=$http_proxy

以上地址需要替换为自己的地址
如果不能访问Google,很多相关的文件无法正常下载,也就没有后文的正常编译使用


android webrtc 编译

官方文档 https://webrtc.github.io/webrtc-org/native-code/development/
安卓相关的编译只能在 Linux 环境,推荐 ubuntux 系统,WSL 需要跳过 snap 安装
本文采用的是 Windows + VirtualBox+Ubuntu 2004

  1. git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

  2. ~/.bashrc 添加目录 depot_tools 到环境变量,后续会用其中的命令
    export PATH=$PATH:你的路径/depot_tools

  3. mkdir webrtc_android && cd webrtc_android
    后续命令在 webrtc_android 目录执行

  4. fetch --nohooks webrtc_android

  5. gclient sync

  6. 更新系统的已安装软件,安装 pythonopenjdk-8-jdk
    sudo apt update && sudo apt upgrade && sudo apt install python openjdk-8-jdk

  7. cd src/ && ./build/install-build-deps.sh --no-chromeos-fonts
    可能会出现 botosnapfonts等相关异常参见后文章节
    后续命令在 src 目录执行

  8. 切换到所需分支
    git branch -r 显示所有分支
    git checkout -b m79 branch-heads/m79 切换到分支 branch-heads/m79
    更多Git相关命令
    切换了分支,需要更新依赖,执行 gclient sync --force
    之前最好 gclient status 确认已修改状态,保存提交之前的修改

  9. 执行 tools_webrtc/android/build_aar.py编译
    最好带上参数,如:
    ./tools_webrtc/android/build_aar.py --extra-gn-args 'is_debug=true is_clang=true rtc_include_tests=false rtc_use_h264=true rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false' --build-dir ./out/release-build/ --arch "arm64-v8a"
    build_aar.py 可以看到,最终采用了 gnninja 构建编译

参考自 Compile_WebRTC_Library_For_Android


boto 代理配置

错误提示

NOTICE: You have PROXY values set in your environment, but gsutilin depot_tools does not (yet) obey them.
Also, --no_auth prevents the normal BOTO_CONFIG environmentvariable from being used.
To use a proxy in this situation, please supply those settingsin a .boto file pointed to by the NO_AUTH_BOTO_CONFIG environmentvariable.

解决方案:

  1. Create ~/.boto config file

    [Boto]
    proxy = 127.0.0.1
    proxy_port = 7890
    ca_certificates_file = /path/to/certificate.crt
  2. Export NO_AUTH_BOTO_CONFIG
    在~/.bashrc中添加export NO_AUTH_BOTO_CONFIG=~/.boto
    再执行source ~/.bashrc

  3. Finally run sync the sources
    gclient sync

参考自 https://gist.github.com/nickdiego/2b2faa35f5ab48e7438ee434d2756765


Unable to reach the snap store 问题解决

Interacting with snapd is not yet supported on Windows Subsystem for Linux.

  1. 方案一,直接选择 SKIP 跳过
    这里不需要用到 snap
    Windows的Linux子系统(WSL)- Ubuntu 20.04 默认不支持 snap ,需要 配置一下
  2. 方案二,在 Ubuntu下安装 snap 并配置代理
    相关命令参考 https://blog.csdn.net/qq_26975799/article/details/111411238
    最后测试 snap 是否连接成功 snap debug connectivity

ERROR: The installation of the Chrome OS default fonts failed.

Failed to connect to commondatastorage.googleapis.com port 443: Connection refused

subprocess.CalledProcessError: Command '['curl', '-L', 'https://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/notofonts-20161129.tar.bz2', '-o', '/usr/local/share/fonts/chromeos/notofonts-20161129.tar.bz2']' returned non-zero exit status 7

解决方案:
sudo ./build/install-build-deps.sh --no-chromeos-fonts


WebRTC里用的c++库是libc++,而目前Android中使用的c++库是libstdc++

错误提示

../../rtc_base/checks.cc:108: error: undefined reference to 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*)'

解决方案:
WebRTC使用libstdc++库,在执行gn命令时
加入 use_custom_libcxx=false这个参数
gn gen out/Debug --args='target_os="android" target_cpu="arm" use_custom_libcxx=false'

参考自
[编译WebRTC APM模块静态库 For Android] https://juejin.cn/post/6844904104427421704


Exception: Missing licenses for following third_party targets: openh264, ffmpeg

解决方案:

修改 tools_webrtc/libs/generate_licenses.py 如下,添加 LICENSE

--- a/tools_webrtc/libs/generate_licenses.py
+++ b/tools_webrtc/libs/generate_licenses.py
@@ -69,6 +69,8 @@ LIB_TO_LICENSES_DICT = {
'g722': ['modules/third_party/g722/LICENSE'],
'fft4g': ['common_audio/third_party/fft4g/LICENSE'],
'spl_sqrt_floor': ['common_audio/third_party/spl_sqrt_floor/LICENSE'],
+    'openh264':['third_party/openh264/src/LICENSE'],
+    'ffmpeg':['third_party/ffmpeg/LICENSE.md'],
# TODO(bugs.webrtc.org/1110): Remove this hack. This is not a lib.
# For some reason it is listed as so in _GetThirdPartyLibraries.

引用自
https://blog.jianchihu.net/webrtc-android-native-code-build-error.html


相关命令说明

  • 安装编译 WebRTC 所需的依赖
    ./build/install-build-deps.sh
    ./build/install-build-deps-android.sh

  • 可以查看有哪些编译参数
    ./tools_webrtc/android/build_aar.py -h
    去掉 -h 使用默认参数编译
    ./tools_webrtc/android/build_aar.py --build-dir ./out/release-build/ --arch "arm64-v8a"

  • 查看库中包含的符号
    nm -C -g --defined-only libjingle_peerconnection_so.so
    nm -C -g --defined-only libwebrtc.a


编译静态库 libwebrtc.a 和 libwebrtc.jar

./tools_webrtc/android/build_aar.py 中,我们可以看到如下

TARGETS = [
    'sdk/android:libwebrtc',
    'sdk/android:libjingle_peerconnection_so',
]

我们需要在 [] 中加入 ':webrtc', 默认不会编译 webrtc 模块
再次编译
./tools_webrtc/android/build_aar.py --extra-gn-args 'is_debug=false is_component_build=false is_clang=true rtc_include_tests=true rtc_use_h264=true rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false' --build-dir ./out/release-build/ --arch "armeabi-v7a"
即可在输出目录 ./out/release-build/ 找到 libwebrtc.a
out/release-build/armeabi-v7a/obj/libwebrtc.a

out/release-build/armeabi-v7a/lib.java/sdk/android/libwebrtc.jar
可以找打 libwebrtc.jar

以下命令可以看到支持的所有 TARGETS
ninja -C out/release-build/armeabi-v7a/ -t targets all


编译 libwebrtc.aar

./tools_webrtc/android/build_aar.py --build-dir ./out/release-build/ --output "out/libwebrtc.aar" --arch "arm64-v8a"

加上 --output "out/libwebrtc.aar" 指定aar输出位置,默认在 src 目录
解压 out/libwebrtc.aar 可以看到只有如下内容

 extracting: AndroidManifest.xml     
 extracting: classes.jar             
 extracting: jni/arm64-v8a/libjingle_peerconnection_so.so

webrtc release 分支相关信息

  • webrtc-android-buildlibwebrtc.a 当前(2021年8月18日)是基于分支branch-heads/m79

  • 之后为啥没找到 m 开头的 branch-heads
    在目录 webrtc_android/src 执行
    git log --oneline --all --graph --decorate|grep M8
    从结果中可以看到还是有 M8* 相关的信息
    m78 m79 同步与chromium大版本,webrtc后来用小版本了,如4610等

    chromium release 时间表 https://chromiumdash.appspot.com/releases
    可以从中看到大版本与小版本对应关系,比如 94 对应 4606

  • 当前(2021年8月18日)最新release是 branch-heads/4610
    webrtc 更新日志 https://webrtc.github.io/webrtc-org/release-notes/

  • 查看所有release分支信息Linux命令
    git log --oneline --all --graph --decorate |grep branch-heads

  • 切换到对应的分支并同步代码
    git checkout -b m85 branch-heads/4183
    gclient sync


其它相关文档


本文链接:安卓webrtc在ubuntu 2004下编译使用 - https://chenjim.com/archives/235.html

版权声明:原创文章 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文链接和本声明。

标签: webrtc, mediasoup

添加新评论