乐趣区

关于webrtc:ubuntu1804编译webrtcandroid库

webrtc 是谷歌提供的音视频通信计划, 可能很好的解决音视频互联互通的场景. 本文基于 Ubuntu 18.04 编译 android 版本的过程, 其它平台也能够参考, 根本都大同小异.

编译环境要求

  • 磁盘预留空间不小于 30GB.
  • 编译过程须要确保你能失常拜访 google 相干服务, 如有条件能够在命令行应用代理拜访.

    
    export http_proxy=http://ip:port
    export https_proxy=http://ip:port
    export all_proxy=http://ip:port
    
  • 因为我的项目太大, 倡议应用固态硬盘的电脑, 放慢同步工夫, 缩小超时等出错几率.
  • 以下过程是基于 Ubuntu 18.04 编译.
  • Python3 >= 3.7 版本

编译 webrtc android

装置 depot_tools 工具

depot_tools 工具包蕴含了谷歌 gclient, gcl, git-cl, repo 等工具, 用于治理我的项目源码, 散发及编译等. 装置形式如下:

# 应用 git clone 到本地
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

在环境变量 PATH 中退出门路, 以便方便使用命令. 依据本人应用的 shell 加到不同的启动文件中. (.bashrc 或 .zshrc)

# 指定本人 depot_tools 的具体门路
export PATH=/path/to/depot_tools:$PATH
同步代码

同步代码咱们次要应用的是 gclient 工具, 这是一个 python 脚本文件, 能够对于多模块依赖的我的项目源码进行治理, 能够依据不同零碎同步所有所依赖模块的代码版本.

  • 创立工作目录 mkdir webrtc-checkout
  • 应用 fetch 下载 webrtc android 代码. (如果 fetch 执行出错的话, 也能够持续应用 gclient –with_branch_heads 同步下来 webrtc 源码).

    cd webrtc-checkout
    fetch --nohooks webrtc_android
    
  • 应用 gclient 同步依赖我的项目源码及工具, 同步工夫较长, 几个小时必定要的.

    gclient sync
    

    NOTE:

  • 如果 fetch 没有出错的话, webrtc 源码通过 git branch -av 是能够看到所有的 branch-heads 的分支.
  • 如果 fetch 出错后, 是通过 gclient 不带参数同步下来的 webrtc 源码. 就只能看到 master、infra/config 以及 lkgr 几个分支.
    咱们能够批改仓库的 .git/config 文件,在 [remote “origin”] 节中增加以下内容:

    fetch = +refs/branch-heads/*:refs/remotes/origin/*
装置编译环境依赖库
cd webrtc-checkout/src
./build/install-build-deps-android.sh
抉择源码版本

能够通过官方网站查看到所有的 webrtc 版本, 尽量优先选择稳固版本分支 checkout. https://chromiumdash.appspot.com/branches

我这里是应用 M108 分支进行编译.

应用 gn 编译
  • 应用 gn 设置编译目录及参数. gn 能够指定编译目录及参数, 因而绝对于其它编译工具, 能够同时并行多个编译版本.

    cd src
    gn gen out/my_build --args='target_cpu="arm"target_os="android"android32_ndk_api_level=18'
    

    target_os 参数可应用的值能够通过以下命令查看:

    gn help target_os
    
    # output
    Possible values
    
      - "android"
      - "chromeos"
      - "ios"
      - "linux"
      - "nacl"
      - "mac"
      - "win"
    

    target_cpu 参数可应用的值能够通过以下命令查看:

    gn help target_cpu
    
    # output
    Possible values
    
      - "x86"
      - "x64"
      - "arm"
      - "arm64"
      - "mipsel"
      - "mips64el"
      - "s390x"
      - "ppc64"
      - "riscv32"
      - "riscv64"
      - "e2k"
      - "loong64"
    
  • 应用 gn 执行编译. ninja -C out/my_build . (这个是增量编译, 第一次工夫较长)

编译工夫较长, 有 1w 多个目录须要编译, 预计得 1~2 小时吧.

  • 革除编译生成但留下编译配置. gn clean out/my_build

FAQ

  • 编译依赖组件 ffmpeg 呈现如下谬误:

    ../../third_party/ffmpeg/libavutil/arm/cpu.c:58:25: error: call to undeclared function 'getauxval'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
        unsigned long ret = getauxval(AT_HWCAP);
                            ^
    ../../third_party/ffmpeg/libavutil/arm/cpu.c:58:25: note: did you mean 'get_auxval'?
    ../../third_party/ffmpeg/libavutil/arm/cpu.c:55:12: note: 'get_auxval' declared here
    static int get_auxval(uint32_t *hwcap)
               ^
    1 error generated.
    [3264/9167] ASM obj/third_party/ffmpeg/ffmpeg_internal/fft_vfp.o
    ninja: build stopped: subcommand failed.

    Answer:

    查看了 third_party/ffmpeg/libavutil/arm/cpu.c 源码, getauxval 函数是在以下这个头文件中定义.

    #if HAVE_GETAUXVAL
    #include <sys/auxv.h>
    #endif

    auxv.h 是定义在 android 穿插编译 third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/auxv.h 中, 申明函数时会限度 API 版本为 18 及以上.

    
    #if __ANDROID_API__ >= 18
    unsigned long int getauxval(unsigned long int __type) __INTRODUCED_IN(18);
    #endif /* __ANDROID_API__ >= 18 */
    

    而我在编译时指定的参数是 --args='target_cpu="arm"target_os="android"...' 是 32 位版本, 在 src/.gn 文件中能看到对于 32 位版本的 API 默认 16:

    # The SDK API level, in contrast, is set by build/android/AndroidManifest.xml.
    android32_ndk_api_level = 16
    android64_ndk_api_level = 21
    

    所以如果编译 32 位版本, 解决这个问题的形式就是在编译时指定下 android32_ndk_api_level 的版本为 18 即可. 如:

    gn gen out/my_build --args='target_cpu="arm"target_os="android"android32_ndk_api_level=18' 
    

    对于编译所有的参数, 能够应用 gn args --list out/my_build 具体查看.

  • 编译呈现 ModuleNotFoundError: No module named 'dataclasses' 谬误.

    Answer:

    通过相干材料理解 dataclasses 模块至多须要 python3.7 才反对的, 须要降级 python3 版本. 我看了下本人 ubuntu 18.04 还是 3.6 的版本, 通过 apt-get install 装置 3.8 版本.
    为了切换不便, 能够通过 update-alternatives 进行治理, 相干的执行命令如下:

    # 装置 3.8 版本
    sudo apt-get install python3.8 
    
    # 为 python3 装置可切换的治理版本
    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
    
    # 切换 python3 应用的版本, 依据提醒抉择应用的版本编号
    sudo update-alternatives --config python3
    

References

  • https://webrtc.github.io/webrtc-org/native-code/development/
  • https://webrtc.googlesource.com/src/+/main/docs/native-code/development/index.md
  • https://chromiumdash.appspot.com/branches
  • https://gn.googlesource.com/gn/+/main/docs/quick_start.md
退出移动版