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. 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
- webrtc.github.io/webrtc-org/…
- webrtc.googlesource.com/src/+/main/…
- chromiumdash.appspot.com/branches
- gn.googlesource.com/gn/+/main/d…