ubuntu18.04编译webrtc_android库
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
ubuntu18.04编译webrtc_android库的更多相关文章
- Ubuntu18.04编译S3的Linux SDK(Zeta)
按照S3官方Wiki(http://www.sochip.com.cn/s3)的陈述,推荐使用Ubuntu16.04作为Host端系统,笔者是一名乐于并热衷于尝鲜的搬砖工,于是,尝试在最新的18.04 ...
- Win10 WSL Ubuntu18.04 编译安装MySQL5.7
---恢复内容开始--- 在win10 商店中选择 ubuntu18.04 下载地址 http://dev.mysql.com/downloads/mysql/ wget https://cdn.my ...
- Ubuntu16.04编译libjpeg-turbo库
一.环境依赖 CMake v2.8.12或以后 NASM or YASM (if building x86 or x86-64 SIMD extensions),如果使用NASM, 依赖2.10之后版 ...
- ubuntu18.04 编译fortran出现 ‘没有f951这个文件’处理
机器自带了gcc所以可以编译fortran文件, 使用时, gcc **.for –o ***.out 提示,没有找到f951. 然后去网上找解决方案,有的人说在其他地方找到了f951,然后把他复制到 ...
- ubuntu18.04 编译安装 apache php
1. apache apache 需要依赖几个模块:apr, apr-util, pcre,也分别源码安装. 1.1 编译安装 1.1.1 apr apr-util 下载地址:http://apr.a ...
- Ubuntu18.04编译Fuchsia
编译环境 系统:Ubuntu 18.04.1 LTS 64-bit 内存:8 GiB CPU:Intel Core i5-4200M CPU @ 2.50GHz × 4 1.安装编译环境 sudo a ...
- ubuntu18.04编译openwrt前的准备
1.获取openwrt源码 git clone https://github.com/openwrt/openwrt.git 2.安装一些库及必备程序: sudo apt-get install li ...
- ubuntu18.04编译jdk8
准备编译环境 sudo apt-get install -y zip unzip build-essential libx11-dev libxext-dev libxrender-dev libxt ...
- Ubuntu18.04编译Zircon
1.获取源代码 git clone https://fuchsia.googlesource.com/zircon 2.安装编译环境 sudo apt-get install texinfo libg ...
- Ubuntu18.04 安装32bit库后出现问题
ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded (cannot open shared ob ...
随机推荐
- polkit(ploicykit)特权提升漏洞解决方案
一.[概述] polkit 的 pkexec 存在本地权限提升漏洞,已获得普通权限的攻击者可通过此漏洞获取root权限,漏洞利用难度低. pkexec是一个Linux下Polkit里的setuid工具 ...
- 第三方模块的下载与使用、requests模块、爬取链家二手房数据、openpyxl模块、hashlib加密模块
目录 第三方模块的下载与使用 下载第三方模块可能会出现的问题 网络爬虫模块之requests模块 网络爬虫实战之爬取链家二手房数据 自动化办公领域之openpyxl模块 第三方模块的下载与使用 第三方 ...
- Java开发学习(四十二)----MyBatisPlus查询语句之条件查询
一.条件查询的类 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合. 这个我们在前面都有见过,比如查询所有和分页查询的时候,都有看到过一个Wrapper类, ...
- VH6501模板工程介绍(一)
VH6501硬件结构 1.式样 1.正向有5个灯,用来指示干扰的触发状态,干扰类型(数字或模拟),通道通信以及设备状态. 2.两个DB9接口(公头male和母头female),这是CAN或CANFD通 ...
- 万字长文!对比分析了多款存储方案,KeeWiDB最终选择自己来
大数据时代,无人不知Google的"三驾马车"."三驾马车"指的是Google发布的三篇论文,介绍了Google在大规模数据存储与计算方向的工程实践,奠定了业界 ...
- 【Day01】Spring Cloud入门-架构演进、注册中心Nacos、负载均衡Ribbon、服务调用RestTemplate与OpenFeign
〇.课程内容 课程规划 Day1 介绍及应用场景 Day2 组件介绍及 广度 Day3 设计思想.原理和源码 Day4 与容器化的容器(服务迁移.容器编排) 一.业务架构的演进 1.单体架构时代 缺陷 ...
- 【每日一题】【排序sort重载】【工具类】2021年12月23日-31. 下一个排列
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数). 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须 ...
- 【大数据面试】【框架】Flume:Source的断点续传、重复数据、Channel选择
〇.用途 流式结构 获取磁盘日志,拦截器过滤后,传递指定数据,写入HDFS或kafka 一.组成-Source.Channel.Sink 事务(put/take) 1.Source---taildir ...
- MongoDB安全加固,防止数据库攻击删除勒索威胁
前言: 今天发现前段时间自己搭建的一个系统的MongoDB数据找不到了,觉得很奇妙,然后登上MongoDB数据库发现多了一个名为READ__ME_TO_RECOVER_YOUR_DATA的数据库,里面 ...
- xxl-job定时调度任务Java代码分析
简介 用xxl-job做后台任务管理, 主要是快速解决定时任务的HA问题, 项目代码量不大, 功能精简, 没有特殊依赖. 因为产品中用到了这个项目, 上午花了点时间研究了一下运行机制. 把看到的记一下 ...