环境
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 不够快,那么这一步需要极大的耐心和毅力,不要怀疑你的电脑是不是死机了:
可能几十分钟,可能几小时,你会看到结果:
然后同步代码:
➜ gclient sync
安装编译所需依赖
➜ cd src
➜ ./build/install-build-deps-android.sh
这一步中间需要同意许可,输入root密码等,可能会遇到如下界面:
这个按确定没反应,鼠标点击也没有反应,别慌,按 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
这一步有进度显示,感觉好很多:
-
编译 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:
-
选择使用 Gradle wrapper:
-
测试
手机安装编译后的app:
➜ adb install out/Debug/apks/AppRTCMobile.apk
,电脑打开web页面:https://appr.tc/ ,手机和电脑进入同一个房间就可以视频了。
源码结构:
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 流的抽象接口,属于视频引擎的一部分。