WSL Ubuntu的安装看这里,Windows10安装WSL Ubuntu
进入WSL
wsl -d Ubuntu-F
默认在挂载windows目录下,如/mnt/c/Users/hyt。正确应该在~目录,可以这样配置
//编辑 .bashrc 文件(这是每次打开终端都会执行的脚本)
nano ~/.bashrc
//按↓(方向键),在文件末尾添加一行
cd ~
然后按Ctrl + O
(字母 O,表示“写入” = 保存) -> 回车键(确认保存文件名)-> Ctrl + X
(退出 nano),最后执行下面命令使配置立即生效:
source ~/.bashrc
确保命令行能访问webRTC源码仓库
安装必要工具
sudo apt update
//如果有需要升级的包,执行下面命令升级,只是升级小版本,快速、安全,不改变系统版本和webRTC环境
sudo apt upgrade -y
//如果要升级大版本,执行这个命令,很大、很慢,非必要不升级
sudo do-release-upgrade
//安装必要工具命令
sudo apt install git python3 python3-pip openjdk-11-jdk unzip zip curl -y
//安装 depot_tools(WebRTC 构建工具)所需依赖
sudo apt install build-essential clang cmake ninja-build pkg-config libgtk-3-dev -y
//WSL访问不了google,配置Ubuntu使用windows的代理,v2rayN是开启“允许来自局域网的连接”
//拉取depot_tools,192.168.1.13是windows的ip地址,若是动态IP,注意修改
git -c http.proxy=http://192.168.1.13:10809 clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
获取webRTC
windows下已经获取了webRTC源码,但复制不了,总是无报错跳出,命令如下
//从windows复制webRTC到WSL--两个命令都没成功,总是无报错自动跳出
cp -r /mnt/f/webRTC_Src ~/webRTC
//或者这个命令。上面的命令中断后也可以用这个命令续传
rsync -avh --progress /mnt/f/webRTC_Src/ ~/webRTC/webRTC_Src/
最后是在WSL下重新拉取,命令如下(注意要开启代理):
//创建工作目录并获取源码
//第一次运行 fetch 会花较长时间下载依赖。
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc_android
cd src
//同步依赖项
gclient sync
设置JAVA_HOME环境变量
//查看java路径
readlink -f $(which java)
//设置JAVA_HOME环境变量,注意要替换为上面获取的真实java路径
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/java' >> ~/.bashrc
或
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
//验证是否成功
echo $JAVA_HOME
安装设置NDK
//下载 NDK zip 包到 WSL
wget https://dl.google.com/android/repository/android-ndk-r25b-linux.zip
unzip android-ndk-r25b-linux.zip
mv android-ndk-r25b $HOME/ndk
//设置环境变量
echo 'export ANDROID_NDK_ROOT=$HOME/ndk' >> ~/.bashrc
echo 'export PATH=$ANDROID_NDK_ROOT:$PATH' >> ~/.bashrc
source ~/.bashrc
//验证
ANDROID_NDK_ROOT
//查看PATH内容,按行显示
echo $PATH | tr ':' '\n'
关闭 WSL 自动继承 Windows PATH
会有两个depot_tools路径:
/root/depot_tools
/mnt/f/depot_tools/depot_tools
所以要关闭 WSL 自动继承 Windows PATH
sudo nano /etc/wsl.conf
//添加
[interop]
appendWindowsPath = false
//保存退出。
//关闭 WSL 并重新启动
wsl --shutdown
//重新打开 WSL
//确认效果
echo $PATH | tr ':' '\n'
构建webRTC的Android项目并编译
//构建
gn gen out/Android --args='target_os="android" target_cpu="arm64"'
gn gen out/Debug --args='target_os="android" target_cpu="arm64" is_debug=true'
gn gen out/Debug --args='target_os="android" target_cpu="arm64" is_debug=true android_ndk_root="/root/ndk"'
//errorprone编译出错,暂时先去掉
gn gen out/Debug --args='target_os="android" target_cpu="arm64" is_debug=true android_ndk_root="/root/ndk" use_errorprone_java_compiler=false'
//编译
ninja -C out/Debug
//ninja编译出错,用autoninja
autoninja -C out/Debug
VS Code编辑webRTC
安装 VS Code 的 Remote - WSL 插件(如果还没装)
打开 VS Code:
-
进入插件市场(侧边栏最左边那一栏 -> Extensions)
-
搜索
Remote - WSL
并安装
配置环境变量:手动给 ~/.bashrc
或 ~/.zshrc
加一行 PATH
如果你不想每次重启 WSL,可以手动把 VS Code 的路径加进 Linux PATH:
echo 'export PATH=$PATH:/mnt/e/install/Microsoft\ VS\ Code/bin' >> ~/.bashrc source ~/.bashrc
注意
/mnt/e/
是 WSL 对E:\
的映射路径。空格要加\
转义,或者用引号包住也行。
运行
wsl里进入到webRTC的src目录,输入code .
-
第一次运行时可能会提示安装 VS Code Server ——按提示安装即可。
-
VS Code 会自动以“WSL 模式”打开,并连接到该 Linux 子系统。
-
此时你在 VS Code 中看到的文件,都是 WSL 下的真实文件,所有修改直接生效。
-
第一次这样运行完,以后直接在VS Code里打开就可以
-
VS Code打开WSL里的webRTC,会运行WSL。命令行里再用wsl -d Ubuntu-F时,连接的是同一个WSL实例,不会产生两个实例消耗内存
关闭
关闭VS Code不会自动退出WSL,你可以在 Windows 终端或 PowerShell 中运行:
wsl --list --running
如果输出包含 Ubuntu
(或你用的发行版),说明它还在运行。
通过以下命令手动完全关闭 WSL:
wsl --shutdown
这会终止所有 WSL 发行版的后台进程,释放占用的内存和 CPU。
打包aar
命令如下:
python3 tools_webrtc/android/build_aar.py --output out/aar/webrtc.aar --build-dir out/Debug
//自定义的只编译java代码且忽略gn的打包aar脚本
python3 tools_webrtc/android/build_java_aar.py --output out/aar/webrtc.aar --build-dir out/Debug
//查看支持的参数
python3 tools_webrtc/android/build_aar.py -h
//查看Logging.w(TAG,"")中TAG为SurfaceTextureHelper的日志
adb logcat -s SurfaceTextureHelper
新的aar运行时错误解决办法
查看奔溃日志命令:adb logcat *:V
执行到
PeerConnectionFactory.initialize(iOption);时奔溃,原因是新版用到了org.jni_zero.JniInit,被R8混淆了,导致native层找不到类
在 proguard-rules.pro
中加上:
# 保留 jni_zero 的类和方法名
-keep class org.jni_zero.** { *; }
Didn't find class "org.webrtc.Environment" on path
在src/sdk/android/BUILD.gn文件的libwebrtc依赖列表中添加:environment_java
附录:管理多版本JDK-安装 JDK 17 并安全切换
尝试自己编译NullAway,好像JDK版本不对,所以安装了多版本。不过最后也没编译成功,暂时去掉了error_prone
-
你可以用 SDKMAN 安装:
curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk install java 17.0.8-tem
-
安装后运行:
sdk use java 17.0.8-tem # 临时切换到 JDK17 java -version # 验证版本
-
构建 NullAway 或 Gradle 项目时,设置:
export JAVA_HOME=$HOME/.sdkman/candidates/java/current
-
不用时恢复默认:
sdk use java 11.0.27-open
附录二:自己下载nullaway
编译时会报错缺少文件third_party/android_build_tools/nullaway/cipd/nullaway.jar,需要自己下载,在src目录下执行下面命令
mkdir third_party/android_build_tools/nullaway/cipd
wget https://repo1.maven.org/maven2/com/uber/nullaway/nullaway/0.12.7/nullaway-0.12.7.jar -O third_party/android_build_tools/nullaway/cipd/nullaway.jar