自己编译Android WebRTC源码后,如何发布aar?

WebRTC Android提供了官方编译好的库(https://bintray.com/google/webrtc/google-webrtc),在AS中直接使用implementation引用过来即可(implementation 'org.webrtc:google-webrtc:1.0.+')。但如果我们是修改了WebRTC的源码,之后想发布自己编译好的aar该怎么做呢?

首先,请移步至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()这个函数,我们可以简单地将整个脚本工作流程分为以下几个部分:

  1. 读取用户执行py指定的附加命令行参数
  2. 通过git命令获取当前commit版本号、准备各种变量
  3. 调用build_aar.py执行编译(默认会编译armeabi-v7a、arm64-v8a、x86、x86_64这四种处理器架构),这个阶段耗时稍微久一些
  4. 生成pom配置文件(注:pom来自一个模板文件,位于:\src\tools_webrtc\android\templates\pom.jinja
  5. 调用_UploadFile()函数将build后产生的google-webrtc-1.0.XXXXX.aar、google-webrtc-1.0.XXXXX.pom、LICENSE.md这几个文件依次上传到https://api.bintray.com
  6. 如果没有附加忽略测试的开关,则使用AppRTCMobile(众所周知的WebRTC示例工程)来验证刚刚制作的aar包是否工作正常。如果测试不通过,则调用_PublishAAR()和_DeleteUnpublishedVersion()清理刚才上传但未发布的文件。
  7. 如果指定了publish开关,则调用_PublishAAR()完成发布请求。

默认的pom文件中的groupId是org.webrtc,你可以根据需要修改成你的。例如:com.yourcompany.yourproduct

脚本中需要上传和发布到api.bintray.com的权限,我相信大部分人都没有这个权限,所以,可以把相关代码都注释掉。最后其实就只需要保留对build_aar.py进行编译打包,以及产生pom文件的部分即可。

修改完成后,在Terminal中执行release_aar.py:

xuyu@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/xuyu/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/xuyu/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/xuyu/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/xuyu/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/xuyu/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/xuyu/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/xuyu/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/xuyu/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/xuyu/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。包括以下文件:

自己编译Android WebRTC源码后,如何发布aar?_第1张图片

注意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)