【WebRtc】Android編譯

前言

webrtc是谷歌收購併開源的一個支持實時音視頻對話的技術。
官網是:https://webrtc.org 。
 

準備工作

如果不打算修改webrtc相關源碼,建議不要去折騰編譯這個源碼工程。
直接引用已經編譯好的中央庫(Maven或者Gradle):

認準官方渠道:(只示例Gradle方式的)

compile 'org.webrtc:google-webrtc:1.0.+'   // + 可以換成對應版本號

相關版本可以在 https://bintray.com/google/webrtc/google-webrtc 這裏查詢,這個應該會持續更新。
PS:+替換的版本號一定要去上面網址裏面查詢是否存在該版本。

有歷史的民間渠道:

compile 'io.pristine:libjingle:11139@aar'

相關版本可以在 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文件夾所在的地址,需要替換爲正確的路徑。

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文件的依賴分析查看源碼文件夾的引用路徑。

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