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编译必须 |
安装步骤其实很简单:
- 从官网下载NDK r22b,解压到
/usr/local/ndk/(Linux/Mac)或C:\ndk\(Windows) - CMake直接用Android Studio的SDK Manager装,版本选3.18.1
- 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.jar和out/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-v8a和armeabi-v7a就够了。x86架构的模拟器虽然也需要,但实际真机很少用到。我一般只在调试时加x86,发布时去掉。
总结一下:环境搭建这件事,说白了就是「版本对齐」。Android Studio、NDK、CMake、WebRTC源码,这四个东西的版本必须匹配。任何一个版本不对,都会导致编译失败。我建议你把版本号记下来,下次搭建环境时直接复用。
这张图把整个流程串起来了。你看,从工具链到源码,再到编译配置,最后输出AAR,每一步都环环相扣。哪个环节出问题,后面的都跑不起来。
好了,环境搭建就讲到这里。记住:版本对齐是王道,耐心是美德。第一次编译失败很正常,别灰心,对照着错误日志一步步排查,总能搞定。