WebRTC-Android编译
一、利用docker的ubantu镜像安装
1、安装docker,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目录映射到刚才那个真实目录。以后改真实目录的文件也会体现在docker上的,在docker上改动也会体现在电脑上,非常方便。
首次执行会下载Docker镜像,需要等会儿。启动成功后,命令行会变成Docker镜像实例的命令行,这个命令行里已经配置好了WebRTC Android/Linux开发所需要的环境了。
3、更新depot_tools代码
cd /depot_tools && git pull
4、务必确保翻墙能力来下载源码
cd webrtc
fetch --nohooks webrtc_android
#上条命令执行完后,可以编辑当前目录下的.gclient文件
#在taget_os里加上linux,这样这套代码也就可以用于Linux开发了
5、如果中途失败,就执行以下命令gclient sync
6、执行./build/install-build-deps.sh
,这里会下载很多依赖
二、利用虚拟机的Ubantu安装
1、安装VMware Workstation
2、下载Ubantu镜像,选择18.04版本的
3、利用VMware安装虚拟机,注意:磁盘容量一定要40G以上
,因为系统本身就很大,加上源码下载完就要20G,随便就超过30G了。
4、下载depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
下载完之后需要设置环境变量vi ~/.bashrc
,增加以下内容
export PATH=$PATH:/path/depot_tools #在当前环境变量追加路径,
#path是自己的depot_tools文件夹的上级路径
完了,执行source ~/.bashrc
,然后执行which gn
或者which gclient
测试下,有过有内容说明设置成功
5、务必确保在翻墙环境下载源码
cd webrtc
fetch --nohooks webrtc_android
#上条命令执行完后,可以编辑当前目录下的.gclient文件
#在taget_os里加上linux,这样这套代码也就可以用于Linux开发了
6、如果中途失败,就执行以下命令gclient sync
7、执行./build/install-build-deps.sh
,这里会下载很多依赖
四、编译
1、设置编译参数,生成ninja文件
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等
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"
#成功后你会在src目录下看到libwebrtc.aar文件,里面就是Android开发需要用到的SDK了
4、生成so文件,生成so文件首次会全量编译,后续增量编译速度非常快。如果以后只改C层代码不生成Java或者Object-C的API,这种方法非常适合测试。
ninja -C out/Debug sdk/android:libjingle_peerconnection_so
五、编译错误锦集
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
,继续同步下载代码
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链接需要的动态库不对,一般是从硬盘copy WebRTC源码到虚拟机会出现这个问题。解决方案:
#第一步,删除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
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.
这是因为同步下载依赖的过程中部分文件下载失败,只需要删除掉第一行出现的目录。再次执行gclient sync就行,像上面,只需要执行
# 第一步,删除对应目录
rm -rm src/build/
# 第二步,再次同步下载依赖
gclient sync
友情提示
如果编译出现其它错误,一般都会在命令行写出解决方案的,只要执行上面的提示命令一般能解决问题。