一文搞定 WebRTC|Android 客户端编译

·  阅读 3596
一文搞定 WebRTC|Android 客户端编译

本文在公众号音视频进阶之路首发,阅读约需要5分钟.

目录

  • 前言
  • 重要分支描述
  • 准备工作
  • 验证
  • Other
  • Q&A
  • 参考

image.png


前言

之前在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 编译

  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 分支编译报错

    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/…

image.png

分类:
开发工具
标签:
收藏成功!
已添加到「」, 点击更改