当前位置:   article > 正文

一文解决WebRTC|Android 客户端编译_io.github.webrtc-sdk

io.github.webrtc-sdk

目录

  • 前言
  • 重要分支描述
  • 准备工作
  • 验证
  • 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"

关注+后台私信我,领取2022最新最全学习提升资料包《Andoird音视频开发必备手册+音视频最新学习视频+大厂面试真题+2022最新学习路线图+项目实战源码》资料内容包括(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)等等 

准备工作

 

安装 depot_tools(需要用到depot_tools工具来下载webrtc源码)

  • git 命令获取 depot_tools

    1. git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    2. 复制代码

    配置环境变量

    1. echo "export PATH=$PWD/depot_tools:$PATH" > $HOME/.bashrc
    2. source $HOME/.bashrc
    3. 复制代码
  • 检测配置是否成功

    1. echo $PATH
    2. 复制代码

源码下载

  • 创建文件夹

    1. mkdir webrtc_android && cd webrtc_android
    2. 复制代码
  • 获取源码(18G 左右,需要稳定代理)

    1. fetch --nohooks webrtc_android
    2. 复制代码

    fetch --nohooks webrtc_android 失败直接执行gclient sync --nohooks进行同步

  • 分支切换

    1. cd src
    2. git checkout -b m84/4147 branch-heads/4147
    3. 复制代码
  • 同步目标分支代码

    1. cd ..
    2. gclient sync --nohooks
    3. gclient runhooks
    4. 复制代码

    注:gclient sync --nohooks、gclient runhooks 哪个失败,重新执行哪个

源码编译

  • 安装编译依赖(30 分钟左右)

    1. ./src/build/install-build-deps.sh
    2. ./src/build/install-build-deps-android.sh
    3. 复制代码
  • 设置编译参数,生成 ninja 文件

    1. cd src
    2. gn gen out/build --args='target_os="android" target_cpu="arm" is_debug=false'
    3. 复制代码

    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 个小时左右)

  • 全量编译

    1. ninja -C out/build
    2. 复制代码

    非全量编译

    1. ninja -C out/build AppRTCMobile
    2. 复制代码

    注:out/build 即编译生成文件的目录,两者必须一致

  • 主要获取的文件

    • out/build/lib.java/sdk/android/libwebrtc.jar
    • out/build/libjingle_peerconnection_so.so
  • 生成 aar

    1. python tools_webrtc/android/build_aar.py --output "libwebrtc.aar" --arch "armeabi-v7a" "arm64-v8a" --build-dir out/Release 
    2. 复制代码

    成功后会在 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:删除

    1. implementation 'org.webrtc:google-webrtc:1.0.+' 
    2. 复制代码

    替换为 native 步骤编译的 libwebrtc.aar

    1. implementation fileTree(dir'../../../', include: ['libwebrtc.aar'])
    2. 复制代码

Q&A

  • 执行 gclient runhooks 时

    1. python src/build/linux/sysroot_scripts/install-sysroot.py --arch=i386 
    2. 复制代码

    下载失败

    将 install-sysroot.py 中 range(3) 重试次数由 3 调大一些

  • M84/4147 分支编译报错

    1. [996/11199] ACTION //base:base_build_config_gen_...c(//build/toolchain/android:android_clang_arm64)
    2. FAILED: gen/base/base_build_config_gen/java_cpp_template/org/chromium/base/BuildConfig.java 
    3. 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
    4. Traceback (most recent call last):
    5.   File "../../../build/android/gyp/gcc_preprocess.py"line 54in <module>
    6.     sys.exit(main(sys.argv[1:]))
    7.   File "../../../build/android/gyp/gcc_preprocess.py"line 47in main
    8.     DoGcc(options)
    9.   File "../../../build/android/gyp/gcc_preprocess.py"line 31in DoGcc
    10.     build_utils.CheckOutput(gcc_cmd)
    11.   File "../../WebRTC/src/build/android/gyp/util/build_utils.py"line 261in CheckOutput
    12.     sys.stderr.write(stderr)
    13. TypeError: write() argument must be str, not bytes
    14. 复制代码

解决方案:

python 版本不兼容,M84 需要使用 python2 编译

  1. 查看 python 版本

    python --version

  2. 移除原默认 python

    sudo rm -rf /usr/bin/python

  3. 指定新默认 python

    sudo ln -s /usr/bin/python2 /usr/bin/python

  4. 重新编译

  • M93/4577 分支编译报错

    1. Command failed because it wrote to stderr
    2. You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
    3. 复制代码

    重新编译

    1. gn gen out/m89/release --args='target_os="android" target_cpu="arm64" is_debug=false treat_warnings_as_errors=false'
    2. 复制代码
  • 编译报错:ModuleNotFoundError: No module named 'dataclasses'

    • python2

      1. sudo apt install python-pip
      2. pip install dataclasses
      3. 复制代码
    • python3

      1. sudo apt install python3-pip
      2. pip3 install dataclasses
      3. 复制代码
  • 编译报错:ERROR: The installation of the Chrome OS default fonts failed.

    1. 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.
    2. 复制代码

    重新安装依赖

    1. ./src/build/install-build-deps.sh --no-chromeos-fonts
    2. 复制代码
  • M89/4389 编译 aar 报错

    1. Traceback (most recent call last):
    2. ...
    3. File "../../../../../build/android/gyp/compile_java.py"line 501in _RunCompiler
    4. fail_on_output=options.warnings_as_errors)
    5. File "../../WebRTC/src/build/android/gyp/util/build_utils.py"line 292in CheckOutput
    6. raise CalledProcessError(cwd, args, MSG.format(stream_string))
    7. util.build_utils.CalledProcessError: 
    8. ....
    9. You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
    10. [2415/3419] CXX obj/api/libjingle_peer...ection_api/peer_connection_interface.o
    11. ...
    12. 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
    13. 复制代码

    重新编译

    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'
    2. 复制代码

参考

WebRTC官网(webrtc.org/)

Android|WebRTC(webrtc.github.io/webrtc-org/…

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/228308
推荐阅读
相关标签
  

闽ICP备14008679号