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

ubuntu18.04编译webrtc_android库的更多相关文章

  1. Ubuntu18.04编译S3的Linux SDK(Zeta)

    按照S3官方Wiki(http://www.sochip.com.cn/s3)的陈述,推荐使用Ubuntu16.04作为Host端系统,笔者是一名乐于并热衷于尝鲜的搬砖工,于是,尝试在最新的18.04 ...

  2. Win10 WSL Ubuntu18.04 编译安装MySQL5.7

    ---恢复内容开始--- 在win10 商店中选择 ubuntu18.04 下载地址 http://dev.mysql.com/downloads/mysql/ wget https://cdn.my ...

  3. Ubuntu16.04编译libjpeg-turbo库

    一.环境依赖 CMake v2.8.12或以后 NASM or YASM (if building x86 or x86-64 SIMD extensions),如果使用NASM, 依赖2.10之后版 ...

  4. ubuntu18.04 编译fortran出现 ‘没有f951这个文件’处理

    机器自带了gcc所以可以编译fortran文件, 使用时, gcc **.for –o ***.out 提示,没有找到f951. 然后去网上找解决方案,有的人说在其他地方找到了f951,然后把他复制到 ...

  5. ubuntu18.04 编译安装 apache php

    1. apache apache 需要依赖几个模块:apr, apr-util, pcre,也分别源码安装. 1.1 编译安装 1.1.1 apr apr-util 下载地址:http://apr.a ...

  6. Ubuntu18.04编译Fuchsia

    编译环境 系统:Ubuntu 18.04.1 LTS 64-bit 内存:8 GiB CPU:Intel Core i5-4200M CPU @ 2.50GHz × 4 1.安装编译环境 sudo a ...

  7. ubuntu18.04编译openwrt前的准备

    1.获取openwrt源码 git clone https://github.com/openwrt/openwrt.git 2.安装一些库及必备程序: sudo apt-get install li ...

  8. ubuntu18.04编译jdk8

    准备编译环境 sudo apt-get install -y zip unzip build-essential libx11-dev libxext-dev libxrender-dev libxt ...

  9. Ubuntu18.04编译Zircon

    1.获取源代码 git clone https://fuchsia.googlesource.com/zircon 2.安装编译环境 sudo apt-get install texinfo libg ...

  10. Ubuntu18.04 安装32bit库后出现问题

    ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded (cannot open shared ob ...

随机推荐

  1. vscode 更新后重启恢复旧版

    vscode的自动更新自动安装在C:\Users\admin\AppData\Local\,如果之前的vscode不在默认位置,就会更新出两个版本,如果还用了固定在开始屏幕或者任务栏,则一直在打开旧版 ...

  2. Spring Security(5)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 经常上网的人都应该有这样的体验:很多网站或者APP只需要第一次登录时输入用户名和密码之后,后面很长一段时间内就不需要再次输入密码了.这确实是一个 ...

  3. 关于python统计一个列表中每个元素出现的频率

    第一种写法: a = ['h','h','e','a','a'] result = {} for i in a: if i not in result: result[i] = 1 else: res ...

  4. java 定时开始执行程序

    package com.zx.ps.web.gzdb; import java.util.Calendar; import java.util.Date; import java.util.Timer ...

  5. JS逆向实战9——cookies DES加密混淆

    cookie加密 DES 混淆 目标网站:aHR0cHM6Ly90bGNoZW1zaG9wLnlvdXpoaWNhaS5jb20vbWFpbi90ZW5kP05vdGljZUNhdGVJZD0xJk5 ...

  6. 如何使用C#在Excel中插入分页符

    在日常办公中,我们经常会用到Excel文档来帮助我们整理数据.为了方便打印Excel工作表,我们可以在Excel中插入分页符.各种处理软件一般都会自动按照用户所设置页面的大小自动进行分页,以美化文档的 ...

  7. 关于 risrqnis

    这道题里最有用的( Range Insert Subset Range Query [n?] In Set 破案了 我那五个点是因为维护不知道有什么用的东西炸了 删了就过了 题面 [JRKSJ R4] ...

  8. 如何搭建自己的CICD流水线,实现自动编译部署功能?

    之前使用过GitLab的CICD流水线,有多种环境,点击即可编译部署,十分的方便. 如何在个人项目中搭建自己的CICD流水线,实现push代码后自动编译并部署呢?这里使用到阿里云 云效DevOps,阿 ...

  9. Kotlin + SpringBoot + JPA 服务端开发

    Kotlin + SpringBoot + JPA 服务端开发 本篇主要介绍一下 kotlin + springboot的服务端开发环境搭建 1.概述 Kotlin 是一个基于JVM的编程语言, 是I ...

  10. kafka详解(01) - 概述

    kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...