文章

在 MacOS 上编译安卓版本 WebRTC

按照WebRTC 官方的编译指导,安卓版本的 WebRTC 只支持在 Ubuntu 中编译。在 Ubuntu 上编译安卓的 WebRTC 代码,可能会比较繁琐,之前都是安装虚拟机,改代码特别不方便。为了简化编译过程,可以将编译环境迁移到 macOS 上,并进行适当的修改以适应 M1 或 x86 架构。

1. 代码准备

首先,准备好两份代码,网上介绍比较多,不是本文重点,不做介绍:

1
2
fetch webrtc_android
fetch webrtc_ios

整个移植的思路是这样:

WebRTC 安卓和 iOS 代码实际上是一份,只是依赖的三方和工具链不太一样。准备webrtc_ios是为了下载配置基本的 webrtc 编译环境,包括依赖和工具链。然后再将之前 Ubuntu 版本的工具链替换成 Mac 版本即可。

2. 依赖和工具

2.1. 拷贝Android 目录

webrtc_android/third_party 目录下以 “android” 开头的目录复制到 webrtc_ios/third_party 目录下,覆盖同名目录。

2.2. R8目录

webrtc_android/third_party/r8 目录复制到 webrtc_ios/third_party/r8 目录下。

2.3. NDK

webrtc_android/third_party/android_ndk 目录复制到 webrtc_ios/third_party/android_ndk 目录下。

下载 macOS 版本的 NDK,然后替换 webrtc_ios/third_party/android_ndk 目录。注意要保留该目录中的 android_ndk 子目录下的 BUILD.gn 文件。

2.4. JDK

webrtc_android/third_party/jdk/current 目录复制到 webrtc_ios/third_party/jdk/current 目录

手动下载 JDK,并选择版本11或更高版本,然后将其替换 webrtc_ios/third_party/jdk/current 目录下的内容。

2.5. LLVM

将 macOS 版本的以下文件复制到 third_party/llvm-build/Release+Asserts/lib/clang/15.0.0/lib 目录下:

1
android_ndk/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/12.0.9/lib/linux

2.6. 编译脚本修改

修改 third_party/ijar/BUILD.gn 文件,在 if (is_linux || is_chromeos || is_apple) 块中添加 || is_apple 判断条件。

if (is_linux || is_chromeos || is_apple) {
  config("ijar_compiler_flags") {
    if (is_clang) {
      cflags = [

修改 third_party/llvm-build/Release+Asserts/bin 目录下的以下文件名:

1
2
3
llvm-nm
llvm-strip
llvm-objcopy

2.7. 其他错误

经过上述修改,编译过程中由于环境配置导致的错误应该已经很少了。如果仍然出现错误,请具体分析问题并进行相应的修改。总体而言,所需修改的内容并不多。

3. 编译

使用以下命令进行编译,由于 WebRTC 编译参数也比较多,比较复杂,后期有时间专门写一篇关于 WebRTC 编译的文章。

1
gn gen out/armv8 --args='target_os="android" target_cpu="arm64" is_component_build=false is_debug=false rtc_enable_protobuf=false rtc_include_tests=false rtc_build_examples=false rtc_enable_sctp=false rtc_enable_libevent=false rtc_build_tools=false disable_android_lint=false use_errorprone_java_compiler=false use_custom_libcxx=false android32_ndk_api_level=18'

4. 参考资料

  1. OSX(Macos) 下编译 WebRTC - Android - 简书
  2. 在 macOS 中编译 webrtc android 端代码
本文由作者按照 CC BY 4.0 进行授权