写在前面:
本文修改了编译的版本、增加了安装虚拟机时的注意点。
操作系统:macos11.6
本文分三部分:
一、安装编译环境
二、下载源码
三、执行编译
对于M1芯片的mac,目前还没有研究解决办法,据说VirtualBox不能使用了。等我电脑到了研究一下再更新吧,废话到这里。
正文:
一、安装编译环境
首先我们需要下载并安装 VirtualBox;接着执行 brew install vagrant 安装 vagrant(基于 VirtualBox 搭建开发环境)。
新电脑安装brew:
/bin/bash -c "$(curl -fsSL raw.githubusercontent.com/Homebrew/in…)"
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ansion/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
然后执行如下命令:
创建并切换到 ~/vagrant 目录
mkdir ~/vagrant && cd "_"
初始化虚拟机(目前系统为 Ubuntu 18.04 LTS 64-bit)
$ vagrant init hashicorp/bionic64
启动这个虚拟机
$ vagrant up //这里使用mac需要授权,重启才能生效;
通过 ssh 连接到这个虚拟机
$ vagrant ssh
二、获取源码
$ git clone chromium.googlesource.com/chromium/to…
接着将如下命令加入到 ~/.bashrc 中,并输入 source ~/.bashrc 重载 bash。其中的 /path/to/ 需要你替换为 depot_tools 的所在路径:
export PATH=/path/to/depot_tools:$PATH
# 创建并切换到 ~/webrtc(也可以是自定义路径)
mkdir ~/webrtc && cd "_"
拉取并同步 WebRTC 的最新代码
$ fetch --nohooks webrtc_android
$ gclient sync
下载的代码包含正常的 WebRTC 分支和 Android 分支。Android 分支包含 SDK 和 NDK(大约 8GB),而所有代码大约 16GB。这份代码既可以被用来进行 Android 开发,也可以被用来进行正常的 Linux 开发。因为 WebRTC 使用 Ninja 作为其构建系统,你只需要在不同路径下生成不同的编译配置即可(当然这就是另一个话题了)。
相信你已经执行完上述所有流程了。此时你应该位于 WebRTC 的 master 分支,但我们一般不直接使用 master,而是应该切换到最近一个 release 版本。可以在这里获取到所有 release 信息。截止到本文撰写的时间,最新的 release 版本为 M89,我们用 (branch-heads/4389)。
# 下载的代码位于 ~/webrtc/src
$ cd ~/webrtc/src
创建一个新的分支 m88(注意一定要 sync)
$ git checkout -b m89 branch-heads/4389
$ gclient sync
# 切换到 master 分支
$ git checkout master
$ git pull origin master
$ gclient sync
切换回你自己的分支(有冲突的话自己解决)
$ git checkout my-branch
$ git merge master
三、源码编译:
# 安装编译 WebRTC 所需的依赖
$ ./build/install-build-deps.sh
$ ./build/install-build-deps-android.sh
-h 可以查看有哪些编译参数
$ ./tools_webrtc/android/build_aar.py -h
直接执行脚本,使用默认参数进行编译
$ ./tools_webrtc/android/build_aar.py
编译结果 libwebrtc.aar 默认位于 ~/webrtc/src 目录下,包含了 armeabi-v7a、arm64-v8a、x86 和 x86_64 四种架构的 .so(可以通过 -h 查看如何只编译指定架构的包)
编译可debug的so:
... template("android_clang_toolchain") { ... _prefix = rebase_path("_prefix/clang" cxx = "_prefix/llvm-ar" ld = cxx readelf = _tool_prefix + "readelf" nm = _tool_prefix + "nm"
注释掉下面两行配置,即可实现 unstrip
#strip = rebase_path("//buildtools/third_party/eu-strip/bin/eu-strip",
#root_build_dir) # use_unstripped_as_runtime_outputs = android_unstripped_runtime_outputs ... } ...
$ ./tools_webrtc/android/build_aar.py \
--extra-gn-args "is_debug=true symbol_level=2 android_full_debug=true" \
--arch arm64-v8a
可以把你编译好的文件替换我这个工程的libs/libwebrtc.aar:gitee.com/hychzqyj/we…cp libwebrtc.aar /vagrant 将 libwebrtc.aar 拷贝到 /vagrant 目录,这个目录是虚拟机与宿主机(macOS)的共享文件目录,目录的名字是在第一步中初始化虚拟机目录的时候给的名字;
我这个项目默认用的手机双摄像头的本地回环,注意:
1,有些手机不支持同时打开前后摄像头。
2,需要你手动去开启相机权限。
-------------------
除了编译,还有一种方式可以帮助我们修改webrtc中的java代码:
这种方法分为两步:之后正常编译就可以了
1.把编译好的aar文件中的so复制到工程lib\arm64-v8a和lib\armeabi-v7a两个目录下;
2.把webrtc远吗目录下a\b\c\d\e的文件复制到工程src下的org/webrtc目录,然后没有问题正常编译就可以了:
a) 自动生成的文件
out/Debug/gen/sdk/android/peerconnection_java/generated_java/input_srcjars/org/webrtc
这个数量很少,只有如下三个:
NetworkPreference.java Priority.java VideoCodecType.java
b) sdk/android/src/java/ //音视频采集
c) sdk/android/api
d) rtc_base/java/src //工具类(log、context、thread)
e) modules/audio_device/android/java/src
上面的文件全部拷贝到新模块的org/webrtc目录下
————————————————预祝编译成功----