LinPhone Android SDK 编译过程

VoIp

由于工作上的需求,需要找一个Android VOIP的客户端sdk,网上找了找用的最多的基本就是LinPhone了。简单介绍一下VoIp,其实能来看这篇文章的应该已经具备了Voip的基础知识,但我在这还是简单的介绍一下吧,必经我刚开始接触的时候(2020年)还是有点懵的。

VoIp是网络语音通话技术方案的统称,它不是指某种具体的技术,而是所有符合这个要求的都可以称为VoIp。广义上来讲qq、微信、等各种通讯App自带的语音聊天,视频聊天都可以称为Voip。但是对于现在的年轻用户来说很少会接触到Voip这个概念,这也就导致了大家一直在用Voip却不知道Voip是什么。为什么上边说广义上来讲,这其实就要看VoIp技术的流行时间了。VoIp的流行时间是移动互联网、4G时代爆发之前,大概2012、2013年之前的时候。那个时候移动互联网还不发达,大家的语音交流方式基本上还是通过电话,于是高昂的电话费用催生出了基于IP的网络的语音通信技术VoIp,VoIp的两个客户端基于IP连接,避开了昂贵的通信网络,数据依靠Intent网络传输,大大的降低了通信费用。但是如果只是这样Voip的实用性还是不大,因为通信双方必须有两台能够上网,且接入同一个Voip服务的客户端,满足这个条件的一般只有企业内部间通信场景,对于普通用户来说还是很麻烦。于是这也就催生了VoIP的另外一个特点,可以接入通信网。也就是个ip网络的客户端,除了可以给同在ip网络的客户端打电话以外,还可以给传统通信网内的手机、固话用户打电话。这也就是为什么qq微信等只能说从广义上来讲算是VoIp,因为他们只能在各自的用户之间通信,是没有办法接入传统通信网的。经典的Voip技术基本上都是使用了SIP协议作为会话启动协议,在网上查询资料室SIP和VoIp是两个经常一起出现的词语。但是这两个名称其实是没有可比性的,Voip泛指一类技术,SIP则指的是这类技术中经常用到的一个协议规范。SIP协议不是Voip系统必须要用的,并且即使系统中使用SIP协议,SIP协议也只是Voip系统中众多协议的一个,主要负责处理会话控制部分。这两者的关系需要理解一下。

LinPhone

Linphone是一款基于标准SIP的开源VoIP电话工具,是一款遵循GPL的开源的网络视频电话系统。它能够让你通过internet来查询朋友的IP,并通过IP给他打电话的软件,功能非常强大,既支持桌面系统,也支持移动终端,还能支持WEB浏览器。但也正式繁多的功能,导致了LinPhone SDK的源码架构复杂,体积庞大。下面是LinPhone项目的架构图:


LinPhone Android SDK 编译过程_第1张图片
general.jpg

处于业务需求,我们需要修改BELLE-SIP模块的代码,修改完之后就要进入编译环节了。这个项目过于过于古老,网上查到的资料很多都是三四年前的,早期LinPhone只提供工程源码,跑一个Demo都需要自己编译sdk,还好最近LInPhone已经开始提供编译好之后的sdk,托管在他们自己的maven仓库,Android 工程可以直接用gradle引用。这也导致很多之前的资料早已不适用了,所以在这简单记录一下编译过程,帮助其他有类似需求的同学们少走弯路。

编译环境

系统 Ubuntu 20.04 LTS

Android SDK r24.4.1

Android NDK r21

LInPhone SDk Release 4.4.6

cmake 3.16.3

python 2.7.18

Android 环境准备:

安装 Android SDK NDK

下载地址 ndk:https://developer.android.google.cn/ndk/downloads?hl=en

Android sdk:http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz

由于我使用的Android sdk版本号是24还需要额外单独下载SDK Manager Command-tools命令行工具,

下载地址:https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip

这三个压缩包下载之后,将ndk和sdk解压,commandlinetools-linux-6200805_latest.zip 解压后将解压出来的tools文件夹放在sdk根目录的cmdline-tools文件夹里边,如果没有cmdline-tools文件夹,就手动创建一个。放好文件之后需要配置环境变量,在~/ .bashrc文件下末尾添加一下内容,路径换成你自己的文件路径

export ANDROID_HOME=你自己的路径/android-sdk-linux
export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH
export PATH=$ANDROID_HOME/cmdline-tools/tools/bin:$PATH
export NDK=你自己的路径/android-ndk-r21
export PATH=$NDK:$PATH

Ubuntu环境准备

安装 cmake :
$ sudo apt install cmake
安装 python
$ sudo apt-get install python-is-python2
安装 pip
$ sudo apt-get install python-pip

但如果你的Ubuntu版本号是20.04及以上,可能安装失败

E: 无法定位软件包 python-pip

使用curl命令来下载get-pip.py脚本:

$ curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py

然后以 sudo 用户身份使用 python2运行脚本来为 Python 2 安装 pip:

$ sudo python2 get-pip.py

打印 Pip 版本号,验证安装过程:

$ pip2 --version
安装yasm:
$ sudo apt-get install yasm
安装nasm
$ sudo apt-get install nasm
安装doxygen
$ sudo apt-get install doxygen
安装Pystache
$ pip install pystache
安装six
$ pip install six

需要注意的是以上都是基于Python2 .7搭建的环境,如果禁用了C# wrapper ,则应该使用python 3.7(python 3.7 if C# wrapper generation is disabled)

以上就是官方文档需要的编译环境,然后之前查资料时有个老哥说还需要安装下边两个东西

$ sudo apt-get install clang (安装clang)
$ sudo apt-get install g++-multilib (安装多依赖库编译)

这个官方文档没说,不过推荐安装 因为编译一次太久了,如果真的发现问题,返过来配置环境之后在编译有点浪费时间。

附上这个老哥的教程地址https://www.codenong.com/cs106423576/

还有一个是协议提醒,这个跟Android sdk版本有关系,但是可能会影响编译过程,建议编译前先处理一下

$ sdkmanager --licenses && sdkmanager --update
$ yes

编译前环境基本就准备好了。

编译 LInPhone SDK

下载源码

$ git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git --recursive

这需要注意的是
1 不要用github的下载源,那个太慢了几k的速度,整体源码是非常大的,我就在这上边浪费了大半天,用linphone 自己的gitlab地址速度会快很多,但是我忘了需不需要挂vpn了,我是挂着下的大概1m/s左右,这都下了十几二十分钟。
2 需要注意 clone命令后边要加--recursive,因为LInPhone sdk的git仓库是用的git 模块功能搭建的,他引用了十几个模块,--recursive 会在克隆的时候同时把其他远程模块的代码也下载下来。

下载好源文件之后需要处理下文件权限问题

$ chmod u+x linphone-sdk/cmake/Android/gradlew
$ chmod u+x linphone-sdk/external/libvpx/configure
$ chmod u+x linphone-sdk/cmake/dummy.sh
$ chmod u+x linphone-sdk/external/libvpx/build/make/*

开始编译

到现在就可以开始编译了,创建build文件,编译过程产物都放在build里边,方便后期整理。

$ mkdir build
$ cd build
$ cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DLINPHONESDK_PLATFORM=Android ..
$ cmake --build . --parallel 8

这里边只是指定了目标平台是Android,更多的编译选项还是参考官方文档。

好的到现在为止如果一切顺利大概十分钟之后就可以编译成功了。(机器是mbp2020 16,i9,分了八个核编译,感觉风扇要炸了)。

我编译到最后还是出现了报错,不过我仔细一看就乐了,原来是gradle报的依赖包下载失败的错误,做Android开发时最常见的编译错误。也就是说错误过程是处于编译apk的阶段,前边编译动态链接库.so文件的阶段应该是已经完成了的。然后去翻build/libs 果然已经编译出来两个cpu架构下的动态链接库文件。至此编译过程结束。(apk编译错误不用管的,必经你又不是为了编译apk)

20210326补充:以上的教程在Android8.0的设备上没啥问题,但是编译出来的so装在6.0的设备上时,启动App后会报一个java.lang.UnsatisfiedLinkError: dlopen failed: "//*.so" has unexpected e_machine: 40的错误。经过多次尝试应该是ndk编译版本的问题,针对Android6.0的设备推荐NDK版本r18b

你可能感兴趣的:(LinPhone Android SDK 编译过程)