美文网首页
LinPhone Android SDK 编译过程

LinPhone Android SDK 编译过程

作者: FENGAO | 来源:发表于2020-11-03 15:59 被阅读0次

    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项目的架构图:


    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 编译过程

          本文链接:https://www.haomeiwen.com/subject/tdxivktx.html