WebRTC 開發實踐:編譯 Android 平臺源碼

前面兩篇文章分別介紹瞭如何利用 WebRTC API 實現一對一視頻通話和多人視頻會議,並給出了相應的 demo 程序,該 demo 是基於官方預編譯好的庫開發的。如果要想深入學習和研究 WebRTC,僅僅掌握偏上層的 API 接口是遠遠不夠的,而是應該做到能自己編譯和修改 WebRTC 源碼,這樣才能不受限制地根據自己的需要優化和改進產品的質量和效果。

網上有很多介紹 WebRTC 源碼編譯的文章,我這裏也不會贅述太多,只介紹些關鍵經驗。總體來說,有下面幾個點先提前說明一下:

1. 最靠譜的編譯指南是官方的指導文章:https://webrtc.org/native-code/android/

2. WebRTC Android 的編譯只支持在 Linux 環境中進行,推薦安裝 Ubuntu 16.04 的物理機或者 VPS,不建議在 Mac/Windows 上使用 Docker 或者虛擬機等方式來編譯,容易遇到很多奇怪的問題。當然,我下面也還是會介紹下 Mac 下如何利用虛擬機來編譯。

3. WebRTC Android 的源碼和配套工具大約 16 GB 左右,國內由於 GFW 的原因,需要配置代理來下載和同步,由此可能帶來很多奇奇怪怪的問題。

4. 時間就是金錢,由於配置代理同步代碼容易遇到各種坑,比較推薦的方式是在 Linode 或者 Vultr 購買一臺位於國外的 VPS 虛擬機,基本上參照 WebRTC 官方文檔,半天時間就可以順利走通整個源碼同步和編譯流程了。

一、編譯步驟和過程

下面先介紹下編譯步驟和過程,假設你使用了國外的 VPS 或者已經解決好了代理,編譯環境是  Ubuntu 16.04。

首先,通過 ssh 登錄到 VPS

1 安裝配置編譯環境

// 安裝一些基礎的軟件依賴
$ sudo apt-get update
$ sudo apt-get install -y openssl vim git gcc g++ curl python build-essential inetutils-ping net-tools sudo lsb-release libxml2

// 下載和配置 Google 提供的相關工具和腳本
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ vi ~/.bashrc
// 添加如下內容
export DEPOT_TOOLS_PATH=~/depot_tools
export PATH=${PATH}:${DEPOT_TOOLS_PATH}

// 執行腳本使其生效 
$ source ~/.bashrc

2 拉取代碼並安裝相關依賴

$ mkdir webrtc
$ cd webrtc
$ fetch --nohooks webrtc_android
$ gclient sync // 異常斷開後,可多執行幾次

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

3 創建編譯工程文件並執行編譯

$ . build/android/envsetup.sh
$ gn gen out/release/armeabi-v7a --args='target_os="android" target_cpu=“arm" is_debug=false'
$ ninja -C out/release/armeabi-v7a

如果要編譯其他 CPU 架構的參數配置如下:

  • ARM64: target_cpu="arm64"

  • 32-bit x86: target_cpu="x86"

  • 64-bit x64: target_cpu=“x64"

編譯成功後,輸出的關鍵文件如下:

out/release/armeabi-v7a/lib.java/sdk/android/libwebrtc.jar
out/release/armeabi-v7a/libjingle_peerconnection_so.so

二、Mac 下利用 Vagrant 打造編譯環境

1 前置環境

實現命令行能使用 shadowsocks 代理,有如下三種方案:

  • Proxifier

  • privoxy

  • polipo

關於如何使用和配置它們的文章很多,這裏不再贅述,這一步至關重要。

2 安裝 Vagrant 和 Virtual Box

在官網下載 Vagrant 和 VirtualBox 並安裝它們。

3 安裝 Ubuntu 16.04 虛擬機

$ mkdir webrtc-builder
$ cd webrtc-builder
$ vagrant init ubuntu/xenial64

4 配置共享目錄

這裏可以使用 Mac 下的磁盤目錄,利用 NFS 掛載到 vagrant 虛擬機裏進行代碼同步,這樣就可以很方便地在 Mac 系統下修改和編輯 WebRTC 源碼了。

$ cd webrtc-builder
$ vi Vagrantfile

// 前者是主機的目錄,後者是虛擬機內掛載的目錄,注意要使用 NFS 方式掛載
config.vm.network "private_network", ip: "192.168.50.4"
config.vm.synced_folder “/Volumes/fs/webrtc", "/webrtc", type: "nfs"

$ vagrant reload

// 注: 這個過程需要給 iTerm 控制檯完全的磁盤訪問權限:設置 -> 安全性與隱私 -> 隱私,添加 iTerm 控制檯程序

注意:由於 Mac OS 使用的 APFS 文件系統默認是大小寫不敏感的,而 WebRTC 源碼目錄下不僅存在了大寫名字的這些文件,也同時存在了對應的小寫名字的對應的文件,所以 APFS 系統無法將這兩種文件區分開來,導致同步代碼的時候 git 出現:“You have unstaged changes.” 這樣的錯誤,例如,常見的一個錯誤提示如下:

Syncing projects:  85% (114/134) src/third_party/android_tools

src/third_party/android_ndk (ERROR)
----------------------------------------
[0:02:21] Started.
----------------------------------------
Error: 83>
83> ____ src/third_party/android_ndk at 4e2cea441bfd43f0863d14f57b1e1844260b9884
83>     You have unstaged changes.
83>     Please commit, stash, or reset.

解決方案:打開 Mac 電腦的 “磁盤工具”,新建一個卷宗(假設叫:fs)用於放置 webrtc 源碼,如:/Volumes/fs/webrtc,注意選擇格式爲:APFS(區分大小寫)這種配置。

5 啓動並進入虛擬機

$ cd webrtc-builder
$ vagrant up
$ vagrant ssh

剩下的步驟就參考上面的“編譯步驟和過程”章節即可,編譯完成後,可以通過 vagrant suspend 或者 vagrant halt 命令掛起或者關閉虛擬機。

三、小結

關於如何編譯 WebRTC Android 平臺源碼就分享到這裏了,如有疑問的小夥伴歡迎來信 [email protected] 交流。另外,也歡迎大家關注我的新浪微博 @盧_俊 或者 微信公衆號 @Jhuster 獲取最新的文章和資訊。

weixin_jhuster.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章