WebRTC-Android編譯

一、利用docker的ubantu鏡像安裝

1、安裝docker
2、下載docker鏡像

docker run --rm -v <WebRTC Android/Linux 代碼庫的絕對路徑>:/webrtc  -it piasy/webrtc-build

上面的piasy/webrtc-build是docker上制作的一個ubantu鏡像。
<WebRTC Android/Linux 代碼庫的絕對路徑>這個括號里的目錄是自己電腦上的真實目錄,后面的:/webrtc意思是會docker上會有個webrtc目錄映射到剛才那個真實目錄。以后改真實目錄的文件也會體現(xiàn)在docker上的,在docker上改動也會體現(xiàn)在電腦上,非常方便。

首次執(zhí)行會下載Docker鏡像,需要等會兒。啟動成功后,命令行會變成Docker鏡像實例的命令行,這個命令行里已經(jīng)配置好了WebRTC Android/Linux開發(fā)所需要的環(huán)境了。

3、更新depot_tools代碼

cd /depot_tools && git pull 

4、務(wù)必確保翻墻能力來下載源碼

cd webrtc
fetch --nohooks webrtc_android
#上條命令執(zhí)行完后,可以編輯當(dāng)前目錄下的.gclient文件
#在taget_os里加上linux,這樣這套代碼也就可以用于Linux開發(fā)了

5、如果中途失敗,就執(zhí)行以下命令gclient sync
6、執(zhí)行./build/install-build-deps.sh,這里會下載很多依賴

二、利用虛擬機(jī)的Ubantu安裝

1、安裝VMware Workstation
2、下載Ubantu鏡像,選擇18.04版本的
3、利用VMware安裝虛擬機(jī),注意:磁盤容量一定要40G以上,因為系統(tǒng)本身就很大,加上源碼下載完就要20G,隨便就超過30G了。
4、下載depot_tools

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

下載完之后需要設(shè)置環(huán)境變量vi ~/.bashrc,增加以下內(nèi)容

export PATH=$PATH:/path/depot_tools  #在當(dāng)前環(huán)境變量追加路徑,
#path是自己的depot_tools文件夾的上級路徑

完了,執(zhí)行source ~/.bashrc,然后執(zhí)行which gn或者which gclient測試下,有過有內(nèi)容說明設(shè)置成功
5、務(wù)必確保在翻墻環(huán)境下載源碼

cd webrtc
fetch --nohooks webrtc_android
#上條命令執(zhí)行完后,可以編輯當(dāng)前目錄下的.gclient文件
#在taget_os里加上linux,這樣這套代碼也就可以用于Linux開發(fā)了

6、如果中途失敗,就執(zhí)行以下命令gclient sync
7、執(zhí)行./build/install-build-deps.sh,這里會下載很多依賴
8、當(dāng)所有依賴都下載完成的界面是這樣

Syncing projects: 100% (307/307), done. 

Hook 'vpython src/build/landmines.py --landmine-scripts src/tools_webrtc/get_landmines.py --src-dir src' took 11.30 secs
Running hooks:  50% (11/22) clang                         
________ running 'vpython src/tools/clang/scripts/update.py' in '/webrtc'
Downloading https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-n356235-f7f1abdb-1.tgz .......... Done.
Hook 'vpython src/tools/clang/scripts/update.py' took 27.31 secs
Running hooks:  86% (19/22) test_fonts        
________ running 'download_from_google_storage --no_resume --extract --no_auth --bucket chromium-fonts -s src/third_party/test_fonts/test_fonts.tar.gz.sha1' in '/webrtc'
0> Downloading src/third_party/test_fonts/test_fonts.tar.gz@cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb...
0> Extracting 33 entries from src/third_party/test_fonts/test_fonts.tar.gz to src/third_party/test_fonts/test_fonts
Downloading 1 files took 34.387538 second(s)
Hook 'download_from_google_storage --no_resume --extract --no_auth --bucket chromium-fonts -s src/third_party/test_fonts/test_fonts.tar.gz.sha1' took 34.47 secs
Running hooks:  90% (20/22) msan_chained_origins
________ running 'vpython src/third_party/depot_tools/download_from_google_storage.py --no_resume --no_auth --bucket chromium-instrumented-libraries -s src/third_party/instrumented_libraries/binaries/msan-chained-origins-trusty.tgz.sha1' in '/webrtc'
0> Downloading src/third_party/instrumented_libraries/binaries/msan-chained-origins-trusty.tgz@92ab0ac3915bc2b50e6a8d7a990522d7355d1ef0...
Downloading 1 files took 96.771148 second(s)
Hook 'vpython src/third_party/depot_tools/download_from_google_storage.py --no_resume --no_auth --bucket chromium-instrumented-libraries -s src/third_party/instrumented_libraries/binaries/msan-chained-origins-trusty.tgz.sha1' took 97.55 secs
Running hooks:  95% (21/22) msan_no_origins     
________ running 'vpython src/third_party/depot_tools/download_from_google_storage.py --no_resume --no_auth --bucket chromium-instrumented-libraries -s src/third_party/instrumented_libraries/binaries/msan-no-origins-trusty.tgz.sha1' in '/webrtc'
0> Downloading src/third_party/instrumented_libraries/binaries/msan-no-origins-trusty.tgz@b02322f976be38aa177febfc8616546b7a23b25e...
Downloading 1 files took 67.776867 second(s)
Hook 'vpython src/third_party/depot_tools/download_from_google_storage.py --no_resume --no_auth --bucket chromium-instrumented-libraries -s src/third_party/instrumented_libraries/binaries/msan-no-origins-trusty.tgz.sha1' took 68.71 secs
Hook 'download_from_google_storage --directory --recursive --num_threads=10 --no_auth --quiet --bucket chromium-webrtc-resources src/resources' took 14.28 secs
Running hooks: 100% (22/22), done.

四、編譯

1、設(shè)置編譯參數(shù),生成ninja文件

gn gen out/build --args='target_os="android" target_cpu="arm" is_debug=false'
#out/build : 編譯生成文件的目錄,隨意指定
#target_os : 編譯目標(biāo)平臺 android ios 等
#target_cpu : CPU架構(gòu)平臺 arm arm64 x86 x64等
i#s_debug : Release模式或者Debug模式

2、編譯

#全量編譯
ninja -C out/build
#debug編譯
ninja -C out/Debug AppRTCMobile

3、生成aar

cd webrtc/src
python tools_webrtc/android/build_aar.py --output "libwebrtc.aar" --arch "armeabi-v7a" "arm64-v8a" --build-dir out/Release
#成功后你會在src目錄下看到libwebrtc.aar文件,里面就是Android開發(fā)需要用到的SDK了。
#out/Release目錄是編譯目錄,第一編譯會全量編譯速度很慢(預(yù)計30~40分鐘),以后就增量編譯很快(預(yù)計10s內(nèi))。

4、生成動態(tài)庫.so文件,生成so文件首次會全量編譯,后續(xù)增量編譯速度非??臁H绻院笾桓腃層代碼不生成Java或者Object-C的API,這種方法非常適合測試。

ninja -C out/Debug sdk/android:libjingle_peerconnection_so

5、生成靜態(tài)庫.a文件

ninja -C out/Debug

生成的.a文件在out/Debug/obj/libwebrtc.a

五、編譯錯誤錦集

1、No such file or directory: '/webrtc/src/build/util/LASTCHANGE.committime
解決方式如下:
python build/util/lastchange.py build/util/LASTCHANGE
2、third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory

ninja: Entering directory `out/ios'
[1/2732] CXX obj/api/audio_codecs/audio_codecs_api/audio_codec_pair_id.o
FAILED: obj/api/audio_codecs/audio_codecs_api/audio_codec_pair_id.o 
../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD -MF obj/api/audio_codecs/audio_codecs_api/
/bin/sh: ../../third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory
...
/bin/sh: ../../third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory
...
isystem../../buildtools/third_party/libc++abi/trunk/include -fvisibility-inlines-hidden -Wnon-virtual-dtor -Woverloaded-virtual -c ../../api/audio_codecs/ilbc/audio_encoder_ilbc.cc -o obj/api/audio_codecs/ilbc/audio_encoder_ilbc/audio_encoder_ilbc.o
/bin/sh: ../../third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory
ninja: build stopped: subcommand failed.

解決方式如下:
python src/tools/clang/scripts/update.py

3、E: Unable to locate package lib32gcc-s1

E: Unable to locate package lib32gcc-s1
The following command failed:  apt-get --just-print install libasound2:i386 
libcap2:i386 libelf-dev:i386 libfontconfig1:i386 libglib2.0-0:i386 libgpm2:i386 
libncurses5:i386 libnss3:i386 libpango-1.0-0:i386 libpci3:i386 libssl-dev:i386 
libssl1.0.0:i386 libtinfo-dev:i386 libudev1:i386 libuuid1:i386 libx11-xcb1:i386
 ...

這個是因為之前下載依賴的時候部分失敗,解決方式:gclient sync,繼續(xù)同步下載代碼
4、ld.lld: error: ../../build/linux/debian_sid_amd64-sysroot/usr/lib/x86_64-linux-gnu/libdl.so:1: unknown directive: XSym

itcayman@ubuntu:~/webrtc/src$ ninja -C out/build sdk/android:libjingle_peerconnection_so 
ninja: Entering directory `out/build'
[1/533] LINK clang_x64/protoc
FAILED: clang_x64/protoc 
../../third_party/llvm-build/Release+Asserts/bin/clang++ -Wl,--fatal-warnings -Wl,--build-id -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,-z,defs -Wl,--as-needed -fuse-ld=lld -Wl,--icf=all -Wl,--color-diagnostics -m64 -Wl,-O2 -Wl,--gc-sections -rdynamic -nostdlib++ --sysroot=../../build/linux/debian_sid_amd64-sysroot -L../../build/linux/debian_sid_amd64-sysroot/usr/local/lib/x86_64-linux-gnu -L../../build/linux/debian_sid_amd64-sysroot/lib/x86_64-linux-gnu -L../../build/linux/debian_sid_amd64-sysroot/usr/lib/x86_64-linux-gnu -pie -Wl,--disable-new-dtags -Werror -o "clang_x64/protoc" -Wl,--start-group @"clang_x64/protoc.rsp"  -Wl,--end-group  -ldl -lpthread -lrt
ld.lld: error: ../../build/linux/debian_sid_amd64-sysroot/usr/lib/x86_64-linux-gnu/libdl.so:1: unknown directive: XSym
>>> XSym
>>> ^
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

這是因為clang鏈接需要的動態(tài)庫不對,一般是從硬盤copy WebRTC源碼到虛擬機(jī)會出現(xiàn)這個問題。解決方案:

#第一步,刪除src/build/linux/debian_sid_amd64-sysroot目錄
rm -rf build/linux/debian_sid_amd64-sysroot
#第二步,重新下載生成
build/linux/sysroot_scripts/install-sysroot.py --arch="amd64"

5、ERROR at //BUILD.gn:33:17: Can't load input file.

itcayman@ubuntu:~/webrtc/src$ gn gen out/Debug --args='target_os="android" target_cpu="arm" is_debug=false'
ERROR at //BUILD.gn:33:17: Can't load input file.
      deps += [ "examples" ]
                ^---------
Unable to load:
  /home/itcayman/webrtc/src/examples/BUILD.gn
I also checked in the secondary tree for:
  /home/itcayman/webrtc/src/build/secondary/examples/BUILD.gn

這個是因為編譯重復(fù)依賴了examples,我們只需要去掉編譯examples和test模塊就行

gn gen out/Debug --args='target_os="android" target_cpu="arm" is_debug=false rtc_include_tests=false rtc_build_examples=false'

6、gclient sync過程中報錯You have unstaged changes.Please commit, stash, or reset.

Error: 3> 
3> ____ src/build at a03951acb996e9cea78b4ab575896bf1bfcd9668
3>  You have unstaged changes.
3>  Please commit, stash, or reset.

這是因為同步下載依賴的過程中部分文件下載失敗,只需要刪除掉第一行出現(xiàn)的目錄。再次執(zhí)行g(shù)client sync就行,像上面,只需要執(zhí)行

# 第一步,刪除對應(yīng)目錄
rm -rm src/build/
# 第二步,再次同步下載依賴
gclient sync

7、/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found

sudo sudo apt-get install software-properties-common && add-apt-repository ppa:ubuntu-toolchain-r/test && sudo apt update && sudo apt install gcc-9 && sudo apt-get install libstdc++6

還不行的話,參照這篇文章 http://www.itdecent.cn/p/32a86bb08685

六、切換分支

1、查看所有分支

git branch -a

2、切換到具體分支

#切換到4183分支舉例
git checkout remotes/branch-heads/4183  

3、執(zhí)行g(shù)client sync,這個時候會報錯

WARNING: Your metrics.cfg file was invalid or nonexistent. A new one will be created.
Syncing projects:   2% ( 7/307) src/base   

src/third_party (ERROR)
----------------------------------------
[0:00:02] Started.
[0:00:02] Finished running: git config remote.origin.url
[0:00:02] Finished running: git rev-list -n 1 HEAD
[0:00:02] Finished running: git rev-parse --abbrev-ref=strict HEAD
----------------------------------------
Error: 7> 
7> ____ src/third_party at e0df6e10adc084f88dda51c0cbab84645db6c135
7>  Your repo is locked, possibly due to a concurrent git process.
7>  If no git executable is running, then clean up '/webrtc/src/third_party/.git/index.lock' and try again.

然后我們根據(jù)提示刪除掉對應(yīng)目錄重新執(zhí)行g(shù)lient sync就行

rm -rf src/thrid_party
rm -rf src/examples
rm -rf src/tools
rm -rf src/build
gclient sync

友情提示

如果編譯出現(xiàn)其它錯誤,一般都會在命令行寫出解決方案的,只要執(zhí)行上面的提示命令一般能解決問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容