WebRTC-Android编译

2020-08-15  本文已影响0人  itcayman

一、利用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

友情提示

如果编译出现其它错误,一般都会在命令行写出解决方案的,只要执行上面的提示命令一般能解决问题。

上一篇下一篇

猜你喜欢

热点阅读