探讨如何在AS上构建webrtc(1)再谈webrtc的下载&编译

想少些坑就搞台Ubuntu机器,其次是用WSL或者Docker之类的沙箱搞一套Ubuntu环境;

全程科学上网,别跟我说搞什么国内镜像,作为一个程序员,科学上网都不愿意,还当什么程序员。

1、安装必要工具

sudo apt-get update
sudo apt-get install git

2、安装depot_tools

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

然后,将depot_tools的路径添加到环境变量中,以便在任何目录都能使用fetchgclient命令。vim编辑~/.bashrc文件最后添加一下行:

export PATH=$PATH:${your path}/depot_tools

然后,使更改生效:

source ~/.bashrc

3、获取WebRTC源码

mkdir webrtc_android
cd webrtc_android
fetch --nohooks webrtc_android

这个命令会下载名为.gclient的源码下载配置文件,然后就可以开始下载完整的源码库,然后使用命令同步代码:

gclient sync

这个过程可能需要一些时间,具体取决于网络速度和服务器响应。

4、切换分支

https://chromiumdash.appspot.com/branches  在这里查询稳定版本分支。

基于不用最新用次新的默认守则,我这里选择m122。执行git的分支切换。

cd webrtc_android/src
git branch -r
git checkout  branch-heads/6261
gclient  sync  -D

5、编译准备

进入同步更新好的源码目录 ./webrtc_android/src,执行两个编译前的环境准备命令。

1、这个是编译器环境依赖。

./build/install-build-deps.sh

2、这个是Android交叉编译的环境依赖

./build/install-build-deps-android.sh

如果没有这个目录文件,那就执行下面这个

source ./build/android/envsetup.sh

6、新手式编译

1、新手/经验不足的同学,建议直接使用自带的编译脚本。如下命令即可满足需求。

 ./tools_webrtc/android/build_aar.py     (默认参数编译)
 ./tools_webrtc/android/build_aar.py -h  (查看编译参数)
 ./tools_webrtc/android/build_aar.py  --output "out/aar/libwebrtc.aar" --arch "arm64
-v8a" --build-dir out/aar/arm64-v8a/     (自定义编译参数)

最后终端输出如下所示

zzr@PC-H93R:/mnt/e/webrtc/src$ ./tools_webrtc/android/build_aar.py  --output "out/aar/libwebrtc.aar" --arch "arm64-v8a" --build-dir out/aar/arm64-v8a/

INFO:root:Building: arm64-v8a
Done. Made 6143 targets from 352 files in 6465ms
ninja: Entering directory `/mnt/e/webrtc/src/out/aar/arm64-v8a/arm64-v8a'
[4415/4415] SOLINK ./libjingle_peerconnection_so.so
INFO:root:Collecting common files.
INFO:root:Collecting: arm64-v8a
INFO:root:List of licenses: webrtc, abseil-cpp, android_deps, android_sdk, androidx, base64, boringssl, cpu_features, crc32c, dav1d, fft, fiat, g711, g722, ijar, jdk, jni_zero, kotlin_stdlib, libaom, libc++, libc++abi, libevent, libjpeg_turbo, libsrtp, libunwind, libvpx, libyuv, ooura, opus, pffft, protobuf, rnnoise, sigslot, spl_sqrt_floor, zlib
INFO:root:Skipping compile time or internal dependency: android_deps
INFO:root:Skipping compile time or internal dependency: androidx
INFO:root:Skipping compile time or internal dependency: jdk

zzr@PC-H93R:/mnt/e/webrtc/src$

至此正式生成构建产物,存放在 --output "out/aar/libwebrtc.aar"。

7、折腾式编译

进阶编译并不是说比新手编译强多少,主要是通过整个编译过程,理解编译了什么,需要的产物是什么等,后续的把webrtc_android工程化并进行二次开发,都是建立在进阶编译这个阶段。

cd进入src源码目录,然后使用 GN 命令生成项目。

gn gen out/build --args='target_os="android" target_cpu="arm64" is_debug=false'
  • out/buid 是gn项目的目录,如果要对不同的编译参数进行编译,那么指定不同的工程目录以便并行管理多个配置。
  • target_os : 编译目标平台 android、ios、unix、windows等
  • target_cpu : CPU架构平台 arm、arm64、x86、x64等
  • is_debug : Release模式或者Debug模式

PS::可以使用以下命令进行gn工程目录的清洗,注意操作不可逆。

gn clean out/build

看见控制台输出如下提示之后

Done. Made 7139 targets from 375 files in 7056ms

就可以进行正式的编译,使用如下命令。注意out/build 要和上面配置的gn项目目录一致

ninja -C out/build

之后会看到类似如下打印输出

ninja: Entering directory `out/build/'
[12251/12251] STAMP obj/default.stamp

对是的, 12251/12251之后就没然后了。。。此时可以命令find过滤编译目录下,搜索关心的文件类型。

find . -type f \( -iname "*.a" -o -iname "*.so" -o -iname "*.h" -o -iname "*.hpp" \)
  • .  是你要搜索的目录路径,请替换为实际的路径。
  • -type f 表示只查找文件。
  • $ -iname "*.a" -o -iname "*.so" -o -iname "*.h" -o -iname "*.hpp" $ 是查找条件,使用 -iname 进行不区分大小写的匹配,并用 -o(或)连接多个条件。

产物何其之多,根本分不清单靠新手是很难分清主次,所以说新手式编译更适合工程入门。接下来我们将进入一个思考题:如何工程化WebRTC-Android并如何方便其进行二次开发?

Android | WebRTC【参考连接1】

8、编译思考进一步

为啥要废章节写那么一个陈旧的话题,其实就是为了说明该如何对WebRTC-Android工程化并方便团队向的二次开发。对于一般的团队开发,最理想的情况就是打开AndroidStudio,嗖嗖的改完代码,点击运行编译,打包生成sdk。步骤6新手式编译是最接近此目标的;

而且通过步骤7我们也知道了,WebRTC的编译实现底层是依赖Ninja进行的。而整个项目是从src\build.gn开始执行,所有依赖都是在各个子目录里配置的build.gn,然后头部根目录去遍历子目录的build.gn,这样整个项目的编译配置就都由各自目录里来管理。

所以方向思路就明确了:

参考步骤6的build_aar.py脚本,搞懂gn生成的各模块build.gn脚本,在AndroidStudio使用or复制Ninja的整个编译流程。

同学们请自行阅读 build_aar.py脚本的内容,不复杂一看就懂,看脚本的目的是要搞清楚:为了方便输出工程化编译时的一些调试信息,减轻编译量提高编译效率。最后我选用了以下这组编译参数进行试验,控制台的输出会被我重定向到aar_build_log.log:

./tools_webrtc/android/build_aar.py  --verbose --build-dir="out/aar" \
--output="out/aar/libwebrtc.aar" --arch="arm64-v8a" \
--extra-gn-args='is_debug=true target_os="android" target_cpu="arm64" rtc_include_tests=false rtc_build_examples=false rtc_build_tools=false is_component_build=false use_custom_libcxx=false rtc_use_h264=true rtc_enable_protobuf=true use_rtti=true treat_warnings_as_errors=false rtc_include_internal_audio_device=true ' \
--extra-gn-switches='-v'   >>  out/aar_build_log.log;   date;

简单介绍编译参数的意义:

1、--verbose和--extra-gn-switches='-v' 是打开编译的详细调试信息;

2、--extra-gn-args里面的参数是指定webrtc-android编译哪些模块,怎么编译。

  • rtc_include_tests=false rtc_build_examples=false rtc_build_tools=false,不包含这三个模块
  • is_component_build=false 编译是否带调试信息
  • use_custom_libcxx=false 编译是否使用自带的cpp库
  • use_rtti=true 启用C++RTTI进行构建,兼容Android的libc++_shared.so,特别重要!!!
  • rtc_use_h264=true 启动openh264
  • rtc_enable_protobuf=true 启动protobuf

这些详细的参数究竟是怎么查阅并解读的呢?我找到了一篇很全的编译参数说明。《WebRTC Android编译参数》为原作者点个赞

问题一:Build with “use_custom_libcxx=false” args for gn will get error: ld.lld: error: undefined symbol: _Unwind_Backtrace

【解决参考】https://issues.webrtc.org/issues/42223745

我主要是修改两处脚本,其一是webrtc\src\build\config\BUILD.gn

if (use_custom_libcxx) {  
  public_deps += [ "//buildtools/third_party/libc++" ]  
} else {  
  public_deps += [ "//buildtools/third_party/libunwind" ]  
}  

其二是webrtc\src\buildtools\third_party\libunwind\BUILD.gn

source_set("libunwind") {
  visibility = [ "//buildtools/third_party/libc++abi" ]
  visibility += [ "//build/config:common_deps" ]
  ... ...
}

问题二:rtc_use_h264=true编译支持H264软编软解报的问题,编译错误打印如下:

 【解决参考】WebRTC 安卓Native code编译问题 - 剑痴乎

ERROR:root:Missing licenses for following third_party targets: openh264, ffmpeg
Traceback (most recent call last):
File "./tools_webrtc/android/build_aar.py", line 234, in <module>
sys.exit(main())
File "./tools_webrtc/android/build_aar.py", line 230, in main
args.build_dir, args.extra_gn_switches, args.extra_ninja_switches)
File "./tools_webrtc/android/build_aar.py", line 219, in BuildAar
GenerateLicenses(license_dir, build_dir, archs)
File "./tools_webrtc/android/build_aar.py", line 197, in GenerateLicenses
builder.GenerateLicenseText(output_dir)
File "/home/jeff/webrtc/src/tools_webrtc/android/../libs/generate_licenses.py", line 204, in GenerateLicenseText
raise Exception(error_msg)
Exception: Missing licenses for following third_party targets: openh264, ffmpeg

问题出在generate_licenses.py里,WebRTC安卓H264启用openh264编码,ffmepg解码,generate_licenses.py里默认是没有openh264和ffmpeg的license,导致编译报如上错误,需要自己手动增加。编辑 webrtc\src\tools_webrtc\libs\generate_licenses.py 其中的LIB_TO_LICENSES_DIC,手动增加ffmpeg和openh264的licenses。

LIB_TO_LICENSES_DICT = {
    'abseil-cpp': ['third_party/abseil-cpp/LICENSE'],
    'android_sdk': ['third_party/android_sdk/LICENSE'],
    'android_toolchain': ['third_party/android_toolchain/NOTICE'],
    ... ...
    'openh264':['third_party/openh264/src/LICENSE'],
    'ffmpeg':['third_party/ffmpeg/LICENSE.md'],
    ... ...
}

然后就没啥问题顺利编译产物了,是不是对整个编译流程的认知又加深了。

下一章我们从上面描述的build.gn脚本入手,看看如何在AndroidStudio上把webrtc-android的本土工程化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Zzr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值