欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Webrtc 研究: Android编译

程序员文章站 2022-07-01 17:38:56
...

前言

webrtc是谷歌收购并开源的一个支持实时音视频对话的技术。
官网是:https://webrtc.org
OK,介绍就这么多。

准备工作

如果不打算修改webrtc相关源码,建议不要去折腾编译这个源码工程。
直接引用已经编译好的*库(Maven或者Gradle):

认准官方渠道:(只示例Gradle方式的)

compile 'org.webrtc:google-webrtc:1.0.+'   // + 可以换成对应版本号

相关版本可以在 https://bintray.com/google/webrtc/google-webrtc 这里查询,这个应该会持续更新。
PS:+替换的版本号一定要去上面网址里面查询是否存在该版本。

有历史的民间渠道:

compile 'io.pristine:libjingle:[email protected]'

相关版本可以在 http://mvnrepository.com/artifact/io.pristine/libjingle 进行查询,当初更新挺频繁,最近两三年没更新了,权当个缅怀吧。

源码下载

如果想修改源码,恭喜你,你需要自己编译源码。
webrtc编译说起来,编译既困难又简单;困难在源码规模太大,国内同步代码频繁出问题,简单在于谷歌已经将繁杂的编译过程整合成简单明了的编译脚本命令。
强调一点:下面的编译操作是基于Linux环境。

一、安装编译依赖环境
webrtc的编译环境依赖于谷歌的编译环境,也就是 depot_tools。
很简单,就一个clone源码到本地

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

这里需要设置环境变量

export PATH=$PATH:/path/depot_tools  #在当前环境变量追加路径

注意:path是你depot_tools文件夹所在的地址,需要替换为正确的路径。

测试环境变量是否配置成功:

which gn 或者 which gclient  #which指令会在环境变量设置的目录里查找执行文件

如果输出了前面配置的depot_tools文件夹地址,则是配置成功!

官网参考:http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up

二、下载项目源码

1、准备工作
指定一个位置存放webrtc源码,特别需要注意的是当前硬盘存储空间需要不少于20GB。

mkdir webrtc
cd webrtc

2、代码同步

fetch --nohooks webrtc_android
gclient sync

这个大概会15-20GB的文件需要下载(版本持续迭代),同步速度取决于你的VPN给不给力。
3、依赖环境配置(编译环境只需要执行一次)

cd src
./build/install-build-deps.sh

当源码下载完备后,执行环境配置脚本,会帮你检测并安装编译所需要的依赖库和工具。

版本编译

一、编译参数指定

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_debug : Release模式或者Debug模式

二、执行编译
由于是全量编译,所以时间稍微有点长,看机器性能。

ninja -C out/build

生成Gradle项目文件

build/android/gradle/generate_gradle.py --output-directory $PWD/out/build \
--target "//examples:AppRTCMobile" --use-gradle-process-resources \
--split-projects --canary

执行完毕,可以在out/build/目录下会生成一个gradle的文件夹,使用Android studio该gradle目录即可运行demo工程。

Release版本

由于webrtc是持续在master分支开发的,所以我们二次开发webrtc最好基于稳定的release版本。
查找库上的release版本

git branch -r

然后checkout到对应的release版本

git checkout -b my_branch branch-heads/66  #切换到M66版本
gclient sync  #同步对应版本的代码

问题1:
如果查找不到对应的release版本,那可能是本地源码历史太久远了(2015-3-24以前的版本)
需要执行

gclient sync --with_branch_heads
git fetch origin

然后查看 .git/config

fetch = +refs/branch-heads/*:refs/remotes/branch-heads/*

则解决问题。

问题2:
如果checkout了比较早的版本,例如branch-heads/5* 版本
执行 gclient sync 会报同步错误
是因为 depot_tools 的源码太新,导致与webrtc源码不匹配,可以将 depot_tools 工程恢复到与 webrtc目标release版本相近日期的工程源码来进行同步编译。

项目结构

由于生成的gradle工程的源码并不是放在一个位置,而且分散在webrtc各个文件夹中,可以将各个对应文件夹下的源码文件整合到一起。
java源码目录如下:

#android端demo工程源码
examples/androidapp/src  
#lib源码
modules/audio_device/android/java/src  
base/android/java/src  
rtc_base/java/src  
sdk/android/api 
sdk/android/src/java 
#so库,位于编译目录下
libjingle_peerconnection_so.so

PS:可以自己通过gradle文件的依赖分析查看源码文件夹的引用路径。