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

目录

  • 前语
  • 重要分支描绘
  • 准备工作
  • 验证
  • Other
  • Q&A
  • 参阅

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


前语

之前在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_debugRelease形式或者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.pyrange(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 编译

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

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

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