webRTCAndroid源码拉取与编译与运⾏
前⾔
webRTC源码,有RTC web的,也是默认的,也有RTC android的,还有RTC ios的,可以根据项⽬需要,拉取不同的源码。当然了,其实不同的仓库源码,底层库基本⼀样的,直⽩的说,C++的代码基本⼀样,⼤部分是公共的代码,不然它也不敢宣称⾃⼰是跨平台的。RTC 所谓跨平台,就是底层库(C++实现)是同⼀个,但针对不同的平台,⽐如对android,会包⼀层java API来是适配,给android开发着使⽤,ios或者web也⼀样(web就是包⼀层JS API)。
话不多说,下⾯开始介绍如何拉取源码,以及如何编译。
1 源码拉取
1.1 安装必备⼯具depot
git clone lesource/chromium/tools/depot_tools.git
设置环境变量, home⽬录的.bashrc,末尾添加两句话
export WEBRTC_DEPOT_TOOLS=/home/chenxiaofeng/webRTC_Source/depot_tools
webrtc浏览器export PATH=$PATH:$WEBRTC_DEPOT_TOOLS
使变量⽣效, 命令⾏执⾏
source ~/.bashrc
1.2 拉取源码
创建⼀个⽬录,然后进到⽬录,拉取。
如前⽂说的,webRTC源码,有基于浏览器的,也是最基本的,也有基于android的和ios的。根据你的需要,建议分开拉取。本⽂以android为例⼦说明,命令如下:
mkdir webrtc_android
cd webrtc_android
fetch --nohooks webrtc_android
gclient sync
命令fetch和gclient,甚⾄包括下⾯编译⽤的gn,就是上⾯1.1 安装的⼯具,所以如果你执⾏失败,请确认1.1有没有设置正确喔。
命令执⾏了,会拉取webRTC源码,且额外加了android相关的依赖,例如Android SDK/ NDK。整个⼯程⼤概21G,主要占⽤的是第三⽅依赖,在third_party⽬录下,⼤概17G+,其中third_party/Android相关依赖有6G+。所以拉取时,请确保存储空间充裕。
另外,如果是基于浏览器的,那命令如下:
mkdir webrtc
cd webrtc
fetch --nohooks webrtc
gclient sync
同理,ios的fetch改成fetch --nohooks webrtc_ios就可以了。
三种类型,webRTC的基础代码基本⼀样。只是平台依赖不⼀样。
2 编译
编译以android的webRTC源码来说明。
代码拉下来,就⼀个src⽬录。
进⼊src⽬录,使⽤gn命令,⽣成编译RTC android需要的⽂件。
$ gn gen out/Debug --args='target_os="android" target_cpu="arm"'
然后开始编译:
autoninja -C out/Debug
这个命令是编译代码,⽣成so库。不会⽣成android apk。如果要⽣成demo apk,⽤如下命令:
autoninja -C out/Debug AppRTCMobile
此时,进⼊out⽬录,有apk⽣成:
out/Debug/apks/AppRTCMobile.apk
ps:
如果你之前ubuntu没有下载android sdk/ndk,那么,在源码⽬录下,设置⼀下sdk/ndk的环境变量:
source build/android/envsetup.sh
3 使⽤AndroidStudio开发
这⾥介绍3种开发⽅式。
3.1官⽅推荐⽅式
3.1.1 ⽣成Android demo app源码
⽤如下命令,⽣成⼀个AndroidStudio可以打开的⼯程。
build/android/gradle/generate_gradle.py --output-directory $PWD/out/Debug \
--target "//examples:AppRTCMobile" --use-gradle-process-resources \
--split-projects --canary
3.1.2 引⼊⼯程
打开AndroidStudio,引⼊⼯程,⼯程的⽬录是
out/Debug/gradle
⼀切顺利的话,可以编译成功,但是注意,在2021-04-15左右的master的代码,Sync时会遇到失败。
Cannot resolve external dependency ls.build:aapt2:4.1.1-6503028 because no repositories
很明显,gradle⽂件,确实没有加仓库地址,看来3.1.1的脚本还不够完善。没事,忍住,我们在最外层的adle加下⾯这⼀句:
allprojects {
repositories {
google()
jcenter()
}
}
再Sync,应该过了,但是遇到了新的错误:
Entry name 'org/appspot/apprtc/R.class' collided
也就是说,有同样的R.class在不同的module出现。
这个问题,还没有得到解决。所以下⾯提出另外的开发⽅式。
3.2 拷贝android demo源码 + rtc android java层源码+ RTC底层so
上⾯的⽅法,编译有问题,⽽且⼯程很多是相对路径,要看代码特别不⽅便。所以,我们可以⾃⼰把rtc源码抓出来,⾃⼰编译。
如标题说的,总共需要3个东西:
android demo源码,就是⼀个使⽤RTC android API的例⼦⼯程,在examples/androidapp⽬录下。
rtc android java层源码,指的就是RTC给android封装的JAVA API。当然了,API就是薄薄的⼀层,实际⼯作在so完成,所以还需要⼀个so。so名字是libjingle_peerconnection_so.so。
下⾯给出具体步骤:
3.2.1 创建⼀个⼲净的⼯程,app模块放官⽅的example代码
⼯程创建好了,就有⼀个默认的app 模块。
从webrtc-android/src/examples/androidapp⽬录中,复制⽬录src l 替换到新建的⼯程。
把webrtc-android/src/examples/androidapp/third_party/autobanh/lib的autobanh.jar放到新建的⼯程的app/libs⽬录。(autobanh.jar是WebSocket的java包,rtc android有依赖)
3.2.2 创建⼀个新的Module,存放rtc源码
包名如上。module_name可以⾃⼰随便取。包名⽤org.webrtc,是因为RTC android的java API都是这个包名,咱得⼀致。
该模块都需要拷贝什么⽬录呢?
其实可以根据3.1,⽣成的⼯程来看,⽬前需要如下⽬录:
a) ⾃动⽣成的⽂件
out/Debug/gen/sdk/android/peerconnection_java/generated_java/input_srcjars/org/webrtc
这个数量很少,截⾄2021-5-1,只有3个。
NetworkPreference.java Priority.java VideoCodecType.java
b) sdk/android/src/java/
c) sdk/android/api
d) rtc_base/java/src
e) modules/audio_device/android/java/src
上⾯的⽂件全部拷贝到新模块的org/webrtc⽬录下。
3.2.3 加⼊so库
前⾯第⼆节,提到了编译。会⽣成so库。
out/Debug/libjingle_peerconnection_so.so
在@ 3.2.2 建⽴的模块内,src/main下,建⽴jniLibs/armeabi,然后把上⾯的库,拷贝到⽬录中。
ps:
如果项⽬需要修改so,可以修改对应的c++代码,然后⽤第⼆节的编译命令来编译。
3.2.4 Sync并解决问题
app模块加上对新建模块的依赖,然后Sync,此时可能会有annotation不到。那是因为RTC源码还依赖⽤android-support,⽽最新AS 开发,⼀般都换成androidx的了,所以,两个模块都声明对androidx的依赖:
implementation ‘androidx.appcompat:appcompat:1.2.0’
然后做如下替换:
Edit->Find->Replace In Path
(ps: 当然了,你也可以⾃⼰加上android-support的库,也能Sync过)
3.2.5 收尾
3.3 编译libwebrtc.aar + 创建新⼯程
千万我们⾃⼰⼿动拷贝了android java api和so,其实这个组合在⼀起就是⼀个aar。webRTC的android源码,最后对外输出的就是⼀个aar。所以,如果你不需要修改java api,那也可以直接⽤RTC的⼯具,⽣成aar来使⽤。
所以要跑Demo的话,可以⾃⼰编译aar,然后⽤examples/androidapp的源码,⾃⼰弄⼀个⼯程,⼯程
依赖aar,就可以跑起和3.1⼀样的Demo了。下⾯是具体步骤:
3.3.1 编译aar
执⾏如下脚本:
./tools_webrtc/android/build_aar.py
这个脚本,会把所有平台的so都编译出来
DEFAULT_ARCHS = ['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64']
如果想修改,可以打开脚本⽂件,修改DEFAULT_ARCHS变量。
最后的aar,就⽣成在src根⽬录。叫做libwebrtc.aar。
3.3.2 建⽴⼯程并做⼀些修改
建⽴⼀个新⼯程,包名如下:
创建好了,就有⼀个默认的app⽬录。
从webrtc-android/src/examples/androidapp⽬录中,复制⽬录src l 替换到新建的⼯程。
把webrtc-android/src/examples/androidapp/third_party/autobanh/lib的autobanh.jar和⽣成的libwebrtc.aar放到新建的⼯程的app/libs⽬录。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论