WebRTC Android 源码编译

环境

Android的编译只能在Linux环境下进行,参考:http://webrtc.github.io/webrtc-org/

Android development is only supported on Linux.

我在Mac上编译过,缺少一些依赖,后来放弃了,建议使用 Ubuntu。
我这里使用 Ubuntu12.04(Parallels Desktop 虚拟机)。

准备

1.安装虚拟机 Ubuntu18.04

代码加编译后大小 25G :

➜ du -sh webrtc
25G webrtc
2.安装配置 JDK8,JDK7 编译时会报错:
util.build_utils.CalledProcessError: Command failed: ( cd /home/ting/dev/webrtc/src; third_party/android_tools/sdk/tools-lint/bin/lint -Werror --exitcode --showall --xml out/Debug/gen/build/android/prepare_android_lint_cache/result.xml --config out/Debug/gen/build/android/prepare_android_lint_cache/config.xml /tmp/tmpaEjNsE/SRC_ROOT1 )
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/tools/lint/Main : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:442)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:64)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:348)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:347)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:312)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

[554/8362] CXX obj/webrtc/pc/peerconnection/rtpsender.o
ninja: build stopped: subcommand failed.

原因是JDK版本不匹配

The reported major numbers are:
49 = Java 5
50 = Java 6
51 = Java 7
52 = Java 8
53 = Java 9
54 = Java 10
55 = Java 11
56 = Java 12
57 = Java 13
58 = Java 14
59 = Java 15
60 = Java 16
61 = Java 17
62 = Java 18
63 = Java 19
64 = Java 20

当然你也可以修改编译的Android SDK Tools和gradle配置来使用jdk7

3.安装 git:
➜ sudo apt-get install git

除此之外,不需要提前安装依赖,install-build-deps.sh 会检测环境并安装所需依赖的。

安装 depot_tools

安装 deport_tools

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

为方便使用,添加环境变量:

➜ sudo gedit /etc/profile

# 在最后添加
export PATH=$PATH:/home/ting/dev/depot_tools

激活生效:

➜ source /etc/profile

验证:

➜ which gclient

获取代码

➜ mkdir webrtc && cd webrtc
➜ fetch --nohooks webrtc_android

这一步会耗时很长,如果你的 VPN 不够快,那么这一步需要极大的耐心和毅力,不要怀疑你的电脑是不是死机了:


webrtc_fetch_source.png

可能几十分钟,可能几小时,你会看到结果:


webrtc_fetch_ok.png

然后同步代码:

➜ gclient sync
webrtc_sync.png

安装编译所需依赖

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

这一步中间需要同意许可,输入root密码等,可能会遇到如下界面:


Snip20170625_4.png

这个按确定没反应,鼠标点击也没有反应,别慌,按 Tab 就可以按确定了。

编译

  • 生成项目:
➜ gn gen out/Debug --args='target_os="android" target_cpu="arm"'

To build for ARM64: use target_cpu="arm64"
To build for 32-bit x86: use target_cpu="x86"
To build for 64-bit x64: use target_cpu="x64"

  • 生成 Release 版本:
➜ gn gen out/Debug --args='is_debug=false'
  • clean 编译内容:
➜ gn clean out/Debug
  • 全部编译:
➜ ninja -C out/Debug

这一步有进度显示,感觉好很多:


Snip20170624_3.png
  • 编译 AppRTCMobile:
➜ ninja -C out/Debug AppRTCMobile

因为上面已经全部编译过了,这里就没什么可编的了。

  • 生成 Android Studio 项目:
➜ build/android/gradle/generate_gradle.py --output-directory $PWD/out/Debug \
--target "//examples:AppRTCMobile" --use-gradle-process-resources \
--split-projects --canary
  • Android Studio 打开项目:

选择使用Android Studio’s SDK:


Snip20170625_5.png
  • 选择使用 Gradle wrapper:
Snip20170625_6.png
  • 测试

手机安装编译后的app:
➜ adb install out/Debug/apks/AppRTCMobile.apk ,电脑打开web页面:https://appr.tc/ ,手机和电脑进入同一个房间就可以视频了。

Snip20170625_17.png

源码结构:

api              ;提供了对外的接口,音视频引擎层和 Module 直接的接口。
audio            ;音频流的一部分抽象,属于引擎的一部分逻辑。
base             ;这一部分还没有学习到,属于 Chromium 项目的一部分,貌似 WebRTC 中用的并不多。
build            ;编译脚本。这里需要注意的是,不同平台的代码在下载的时候,获取的工具集是不一样的。
build_overrides  ;编译工具。
buildtools       ;编译工具链。
call             ;主要是媒体流的接口抽象。为媒体引擎和 codec 层提供桥接。这里说的媒体流是 RTP 流。pc 层也抽象了媒体流,那是编码前、或者解码后。
common_audio     ;音频算法实现,比如 fft。
common_video     ;视频算法实现,比如 h264 协议格式。
data             ;测试数据
examples         ;WebRTC 使用的例子。提供了 peerconnection_client、peerconnection_server、stun、turn 的 demo。
logging          ;WebRTC 的 log 库。
media            ;媒体引擎层,包括音频、视频引擎实现。
modules          ;WebRTC 把一些逻辑比较独立的抽象为 Module,利于扩展维护。
out              ;build 输出目录。
p2p              ;主要是实现 candidate 收集,NAT 穿越。
pc               ;实现 jsep 协议。
resources        ;测试数据
rtc_base         ;包括 Socket、线程、锁等 OS 基础功能实现。
rtc_tools        ;网络监测工具、音视频分析工具。很多工具都是脚本实现。
sdk              ;主要是移动端相关实现。
stats            ;WebRTC 统计模块实现。
style-guide      ;编码规范说明
system_wrappers  ;OS 相关功能的封装,比如 cpu、clock 等。
test             ;单元测试代码实现,用 gmock
testing          ;gmock、gtest等源码,属于整个 Chromium 项目。
third_party      ;第三方库依赖。比如 abseil-cpp、ffmpeg 等
tools            ;公共工具集,整个 Chromium 项目依赖的。
tools_webrtc     ;WebRTC 用到的工具集。
video            ;视频 RTP 流的抽象接口,属于视频引擎的一部分。

参考:

http://webrtc.github.io/webrtc-org/native-code/android/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,140评论 25 707
  • 注1:本文档适用于webrtc和webrtc-android源码的下载和编译; 注2:下载编译所使用的操作系统为U...
    孤独的创作者阅读 9,413评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,517评论 18 139
  • 1, html, CSS, JavaScript的基本区别 HTML is a noun, CSS is the ...
    yanyuchen阅读 188评论 0 0
  • 大饼竟然如此的美味啊大饼 对 就是那个 大饼卷鸡蛋 大饼卷香肠 大饼卷一切的大饼 世上竟存在这样的美味 在我还没有...
    橙树阅读 235评论 0 1