WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(Chrome\FireFox…)轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任何插件,Web开发者也无需关注多媒体的数字信号处理过程,只需编写简单的Javascript程序即可实现,W3C等组织正在制定Javascript 标准API,目前是WebRTC 1.0版本,Draft状态;另外WebRTC还希望能够建立一个多互联网浏览器间健壮的实时通信的平台,形成开发者与浏览器厂商良好的生态环境。同时,Google也希望和致力于让WebRTC的技术成为HTML5标准之一,可见Google布局之深远。
WebRTC提供了视频会议的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android。
首先,请移步至WebRTC Android源码目录下这个位置: \src\tools_webrtc\android\ ,你会看到有2个python脚本,一个是build_aar.py,另外一个是release_aar.py。有了这两个脚本,打包制作aar和pom文件就变得十分简单了。
下面我们分别来介绍这两个脚本。
build_aar.py
这个脚本输入的参数主要包括以下几个:
--build-dir :顾名思义,不解释。如果不指定,会自动创建一个临时的。
--output:产生的aar文件名。不指定使用默认的:libwebrtc.aar
--arch:可以取值 armeabi、armeabi-v7a、arm64-v8a、x86、x86_64。值用双引号引上,多个值之间加个空格。
--use-goma:指定后表示使用Goma。
--verbose:指定后表示开启调试日志。
--extra-gn-args:在使用gn生成ninja时候附加的参数。例如:build_aar.py --extra-gn-args='is_debug=true'
--extra-ninja-switches:附加的ninja开关。例如:build_aar.py --extra-ninja-switches='-v'
--extra-gn-switches:附加的gn开关。例如:build_aar.py --extra-gn-switches='-v'
使用build_aar.py会生成一个本地aar文件(默认文件名:libwebrtc.aar),将这个aar文件以文件引用的方式添加到工程中使用即可。
但是这样有个问题:如果整个工程从上到下都是你自己维护还好,但如果你的代码是作为SDK发布出去给别人用的,由于WebRTC的aar并不是独立的,它还依赖了一些其他的库和内容,并且使用本地文件的方式,也有诸多不便,别人在使用的时候还需要修改引用路径等等。所以最好的方式是模拟WebRTC官方发布的那种直接在线引用的方法。
如何做呢?让我们来看看另外一个脚本:
release_aar.py
这个脚本输入的参数主要包括以下几个:
--build-dir :顾名思义,不解释。如果不指定,会自动创建一个临时的。
--use-goma:指定后表示使用Goma。
--verbose:指定后表示开启调试日志(打包过程中输出的信息)。
--skip-tests:指定后表示跳过运行测试程序。
--publish:指定后表示如果测试通过就自动发布。
通过阅读ReleaseAar()这个函数,我们可以简单地将整个脚本工作流程分为以下几个部分:
读取用户执行py指定的附加命令行参数
通过git命令获取当前commit版本号、准备各种变量
调用build_aar.py执行编译(默认会编译armeabi-v7a、arm64-v8a、x86、x86_64这四种处理器架构),这个阶段耗时稍微久一些
生成pom配置文件(注:pom来自一个模板文件,位于:\src\tools_webrtc\android\templates\pom.jinja)
调用_UploadFile()函数将build后产生的google-webrtc-1.0.XXXXX.aar、google-webrtc-1.0.XXXXX.pom、LICENSE.md这几个文件依次上传到https://api.bintray.com
如果没有附加忽略测试的开关,则使用AppRTCMobile(众所周知的WebRTC示例工程)来验证刚刚制作的aar包是否工作正常。如果测试不通过,则调用_PublishAAR()和_DeleteUnpublishedVersion()清理刚才上传但未发布的文件。
如果指定了publish开关,则调用_PublishAAR()完成发布请求。
默认的pom文件中的groupId是org.webrtc,你可以根据需要修改成你的。例如:com.yourcompany.yourproduct
脚本中需要上传和发布到api.bintray.com的权限,我相信大部分人都没有这个权限,所以,可以把相关代码都注释掉。最后其实就只需要保留对build_aar.py进行编译打包,以及产生pom文件的部分即可。
修改完成后,在Terminal中执行release_aar.py:
root@ubuntu:~/google/webrtc_android/src$ tools_webrtc/android/release_aar.py --verbose
INFO:root:Releasing AAR version 1.0.25979 with hash 60446b8d5f30dc0d696efd150ab3370b428deea4
INFO:root:Building at /tmp/tmpdHqdVu
INFO:root:Building: armeabi-v7a
DEBUG:root:Running: ['/usr/bin/python', '/home/root/google/webrtc_android/src/third_party/depot_tools/gn.py', 'gen', '/tmp/tmpdHqdVu/aar-build/armeabi-v7a', '--args=arm_version=7 use_goma=false target_cpu="arm" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 3005 targets from 250 files in 1311ms
DEBUG:root:Running: ['/home/root/google/webrtc_android/src/third_party/depot_tools/ninja', '-C', '/tmp/tmpdHqdVu/aar-build/armeabi-v7a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `/tmp/tmpdHqdVu/aar-build/armeabi-v7a'
[3234/3234] SOLINK ./libjingle_peerconnection_so.so
INFO:root:Building: arm64-v8a
DEBUG:root:Running: ['/usr/bin/python', '/home/root/google/webrtc_android/src/third_party/depot_tools/gn.py', 'gen', '/tmp/tmpdHqdVu/aar-build/arm64-v8a', '--args=use_goma=false target_cpu="arm64" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 2973 targets from 249 files in 1193ms
DEBUG:root:Running: ['/home/root/google/webrtc_android/src/third_party/depot_tools/ninja', '-C', '/tmp/tmpdHqdVu/aar-build/arm64-v8a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `/tmp/tmpdHqdVu/aar-build/arm64-v8a'
[3168/3168] SOLINK ./libjingle_peerconnection_so.so
INFO:root:Building: x86
DEBUG:root:Running: ['/usr/bin/python', '/home/root/google/webrtc_android/src/third_party/depot_tools/gn.py', 'gen', '/tmp/tmpdHqdVu/aar-build/x86', '--args=use_goma=false target_cpu="x86" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 3001 targets from 250 files in 1262ms
DEBUG:root:Running: ['/home/root/google/webrtc_android/src/third_party/depot_tools/ninja', '-C', '/tmp/tmpdHqdVu/aar-build/x86', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `/tmp/tmpdHqdVu/aar-build/x86'
[3389/3389] SOLINK ./libjingle_peerconnection_so.so
INFO:root:Building: x86_64
DEBUG:root:Running: ['/usr/bin/python', '/home/root/google/webrtc_android/src/third_party/depot_tools/gn.py', 'gen', '/tmp/tmpdHqdVu/aar-build/x86_64', '--args=use_goma=false target_cpu="x64" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 3001 targets from 250 files in 1622ms
DEBUG:root:Running: ['/home/root/google/webrtc_android/src/third_party/depot_tools/ninja', '-C', '/tmp/tmpdHqdVu/aar-build/x86_64', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `/tmp/tmpdHqdVu/aar-build/x86_64'
DEBUG:root:Running: ['/usr/bin/python', '/home/root/google/webrtc_android/src/third_party/depot_tools/gn.py', 'desc', '--all', '--format=json', '/tmp/tmpdHqdVu/aar-build/armeabi-v7a', 'sdk/android:libwebrtc']
…… 省略大片输出内容
INFO:root:List of licenses: webrtc, abseil-cpp, android_deps:android_support_annotations.*, android_deps:com_android_support_support_annotations.*, android_tools, auto, base64, bazel, boringssl, errorprone, fft, fft4g, fiat, g711, g722, guava, ijar, libc++, libc++abi, libevent, libjpeg_turbo, libsrtp, libvpx, libyuv, opus, protobuf, rnnoise, sigslot, spl_sqrt_floor, usrsctp, yasm, zlib
INFO:root:Skipping compile time or internal dependency: android_deps:com_android_support_support_annotations.*
INFO:root:Skipping compile time or internal dependency: yasm
我没有指定build-dir,默认会输出到一个临时目录下: /tmp/tmpdHqdVu。包括以下文件:
注意aar-build文件建议手动打个包存一下,里面有四种处理器命名的子文件夹,其中有个文件夹叫lib.unstripped,里面存放着带有符号表的libjingle_peerconnection_so.so。未来如果你的程序发生了crash等问题,堆栈如果指向WebRTC底层库的话,可以通过这个带有符号表的文件来定位问题(使用addr2line命令)。或者如果你的产品集成了腾讯bugly的话,也可以在产品后台发布版本时上传该符号表文件。
OK,接下来,如果你有自己的maven仓库,将aar和pom发布到你自己的仓库中。然后在代码中就可以直接使用implementation的方式来引用了。例如:
implementation 'com.baijia.player:google-webrtc:1.0.25979'
当然,还需要配置maven地址。这样,任何时候任何工程都可以很方便地引用到我们编译好的webrtc aar了。
好了,今天就说这么多了,希望小伙伴们能从这篇文章中学到东西,也真心希望能够帮助正在苦学WebRTC Android源码编译的小伙伴们,你们的成长是我最大的幸福。很感谢您能够在百忙之中浏览我的文章,有疑问的小伙伴可以私信我。