2、开发环境搭建:Android Studio配置、NDK与CMake安装、WebRTC源码编译与AAR生成、项目结构初始化

说实话,很多同学刚开始接触WebRTC开发,第一反应就是去GitHub上clone一个项目,然后直接编译。结果呢?卡在环境搭建这一步就放弃了。我当年第一次搞WebRTC的时候,光NDK版本不对就折腾了两天。所以这一章,咱们把地基打牢。

环境搭建说白了就四件事:配好Android Studio、装对NDK和CMake、搞定WebRTC源码编译、搭出项目骨架。每一步都有坑,我会把踩过的坑都指出来。

核心要点:WebRTC的Android编译依赖链非常长,建议严格按照我给的版本号来,不要自己随意升级。

2.1 Android Studio配置

我个人习惯用Android Studio Arctic Fox或更高版本。为什么?因为新版本对CMake和NDK的集成更友好,少很多手动配置的麻烦。

安装完成后,你需要确认几个关键配置:

  • SDK版本:建议API 21以上,太低的话WebRTC有些特性不支持
  • Build Tools:30.0.3或更高
  • Gradle版本:7.0+,配合AGP 7.0+使用

嗯,这里要注意:不要用Android Studio自带的SDK Manager去装NDK,后面我们会单独讲NDK的安装。我试过用自带的,结果版本对不上,编译WebRTC时各种报错。

小技巧:在Android Studio的local.properties文件中,手动指定SDK和NDK路径,这样切换项目时不会乱。

2.2 NDK与CMake安装

WebRTC对NDK版本有严格要求。我踩过的坑是:用了NDK r23,结果编译到一半报undefined reference,折腾半天才发现是版本不兼容。

推荐版本组合:

组件 推荐版本 备注
NDK r21e 或 r22b r23以上有ABI兼容问题
CMake 3.18.1+ 不要用3.22,有已知bug
Ninja 1.10+ WebRTC编译必须

安装步骤其实很简单:

  1. 从官网下载NDK r22b,解压到/usr/local/ndk/(Linux/Mac)或C:\ndk\(Windows)
  2. CMake直接用Android Studio的SDK Manager装,版本选3.18.1
  3. Ninja用包管理器装:brew install ninja(Mac)或apt install ninja-build(Linux)

警告:Windows用户注意,WebRTC编译强烈建议用WSL2。我试过直接在Windows上编译,各种路径问题、符号链接问题,最后放弃了。用WSL2,省心很多。

2.3 WebRTC源码编译与AAR生成

这是最核心的一步。WebRTC的源码编译,说白了就是跑一个Python脚本。但这里面的门道可不少。

首先,你需要安装depot_tools,这是Google的源码管理工具集。我建议把它加到PATH环境变量里,方便后续操作。

# 克隆depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:/path/to/depot_tools

# 获取WebRTC源码
mkdir webrtc_android
cd webrtc_android
fetch --nohooks webrtc_android
gclient sync

这里有个坑:fetch命令会下载大概10GB的数据,网络不好的话很容易中断。我建议用代理,或者选择凌晨网络好的时候跑。我曾经在公司网络下跑了三次都失败,最后回家用家庭宽带一次成功。

源码下载完成后,开始编译:

# 进入源码目录
cd src

# 生成Android编译配置
gn gen out/Android --args='target_os="android" target_cpu="arm64"'

# 开始编译
ninja -C out/Android

# 生成AAR文件
ninja -C out/Android webrtc_android

编译时间取决于你的机器配置。我的是MacBook Pro M1,大概需要40分钟。如果是老款Intel机器,做好2小时的准备。

关键点:编译完成后,AAR文件在out/Android/lib.java/webrtc_android.jarout/Android/lib.java/webrtc_android.aar。别找错了地方,我第一次找了好久。

你可能会问:为什么要自己编译,直接用Google的预编译包不行吗?说实话,预编译包确实方便,但有两个问题:一是版本更新慢,二是无法定制。比如你想开启H.264编码,或者关闭某些不需要的模块,就必须自己编译。

2.4 项目结构初始化

好了,现在我们有AAR了,该搭项目了。我习惯用模块化的方式组织项目,这样后期维护起来方便。

推荐的项目结构:

WebRTCApp/
├── app/                    # 主应用模块
│   ├── src/
│   │   ├── main/
│   │   │   ├── java/       # Java/Kotlin源码
│   │   │   ├── res/        # 资源文件
│   │   │   └── jniLibs/    # 存放.so文件
│   │   └── test/           # 单元测试
│   └── build.gradle
├── webrtc-sdk/             # WebRTC SDK模块
│   ├── src/
│   │   └── main/
│   │       └── java/       # 封装WebRTC API
│   ├── libs/               # 存放AAR文件
│   └── build.gradle
├── signaling-server/       # 信令服务器模块(可选)
├── build.gradle            # 根构建文件
└── settings.gradle

webrtc-sdk模块的build.gradle中,引入AAR:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar'])
    implementation 'org.webrtc:google-webrtc:1.0.32006' // 或者用本地AAR
}

我个人建议把AAR文件放在libs目录下,而不是用远程依赖。为什么?因为远程依赖的版本更新不受你控制,万一哪天Google更新了不兼容的版本,你的项目就炸了。本地AAR虽然麻烦点,但稳定。

避坑指南:我曾经遇到过一个问题:编译时提示Duplicate class错误。后来发现是因为同时引用了远程依赖和本地AAR。解决办法是只保留一种引用方式。

最后,别忘了在app/build.gradle中配置NDK和CMake:

android {
    compileSdk 33
    defaultConfig {
        minSdk 21
        targetSdk 33
        ndk {
            abiFilters 'arm64-v8a', 'armeabi-v7a'
        }
    }
    externalNativeBuild {
        cmake {
            path 'src/main/cpp/CMakeLists.txt'
        }
    }
}

这里有个细节:abiFilters只保留arm64-v8aarmeabi-v7a就够了。x86架构的模拟器虽然也需要,但实际真机很少用到。我一般只在调试时加x86,发布时去掉。

总结一下:环境搭建这件事,说白了就是「版本对齐」。Android Studio、NDK、CMake、WebRTC源码,这四个东西的版本必须匹配。任何一个版本不对,都会导致编译失败。我建议你把版本号记下来,下次搭建环境时直接复用。

WebRTC Android 开发环境搭建流程 Android Studio IDE 配置 NDK + CMake 原生编译工具链 depot_tools 源码管理工具 WebRTC 源码下载 fetch --nohooks webrtc_android GN 生成编译配置 gn gen out/Android --args='target_os="android" target_cpu="arm64"' AAR 文件生成 webrtc_android.aar

这张图把整个流程串起来了。你看,从工具链到源码,再到编译配置,最后输出AAR,每一步都环环相扣。哪个环节出问题,后面的都跑不起来。

好了,环境搭建就讲到这里。记住:版本对齐是王道,耐心是美德。第一次编译失败很正常,别灰心,对照着错误日志一步步排查,总能搞定。

公众号:蓝海资料掘金营,微信deep3321