MTKIMS框架简析(1)——代码架构及模块初始化自动挡开车
1.前⾔
随着4G技术的诞⽣和国内运营商⽹络的全⾯升级,以往流量贵上⽹慢的问题不再有,⽽类似微信这类即时通讯软件也得到快速的普及,互联⽹⾏业的发展还延伸到⾦融/零售等线上线下的各⾏各业,短短⼏年内国内IT产业迎来全⾯的机遇。⽽得益于移动⽹络技术的突破,政策的开放和乔帮主的1%的智慧,成就了今天⾼效的互联⽹+社会。
4G协议中定义了包含volte和RCS等基于运营商核⼼⽹实现的功能,将发挥⽹速优势消灭CS域,同时提供⾼清语⾳通话和多媒体IM通讯功能,当年还在卖短信挣钱的运营商们想到这些肯定⼼理暗爽。但实际成本⾼昂,除了要进⼀步升级核⼼⽹,还要联合芯⽚商和终端⼚商合作开发或集成volte和RCS⽅案才能产⽣威⼒,⽽且体验也是⼀个⼤问题,因此对此⽀持少之⼜少,⽬前深圳只有中移动⽀持volte,但了解和使⽤的⼈其实不多。
中国移动早年开始捣⿎Ophone的时候(欲通过4G升级占领终端继延续统治),第三⽅软件⼚们已经发⼒开始在IM上厮杀,⼀向财⼤⽓粗运营商们眼看着江⼭四分五裂,⼜只能靠卖流量卖⼿机甚⾄卖宽带来抢客户了。。。
⾔归正传,⽬前⾼通和MTK等芯⽚⼤⼚都已完美⽀持volte,就以MTK为例分析下功能实现。
2. 代码结构
MTKIMS相关代码由4部分构成,有Google添加的框架,和MTK实现的Service部分:
//原有框架中拓展出ims相关类,如ImsPhone/ImsPhoneCallTracker/ImsCallConnection/ImsPhoneCall等
/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone天蝎座和巨蟹座
//实现了Parcelable的公共类,和⼀些aidl接⼝
/frameworks/ba/telephony/java/com/android/ims
//为Ims服务提供接⼝,ImsManager提供通话/开关volte/更新和获取ims状态等接⼝。总结与展望
/frameworks/opt/net/ims/
//mtk实现部分,实现了与rild-ims的对接⽅式ims CommandsInterface实现
/vendor/mediatek/proprietary/packages/rvices/Ims/
接下来依次分析以上4个⽬录的架构和职责。
telephony框架
/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone
此部分代码主要为volte通话功能添加。
ImsPhone为在PhoneBa的⼦类,⽽PhoneBa直接持有ImsPhone的实例,在原有的GsmPhone和CdmaPhone类中增加对ims的判断,例如拨号⽅法dial中,会先判断当前是否⽀持volte,再决定使⽤imsPhone的dial还是的当前phoneBa中的dial⽅法。
为什么不把ImsPhone像GsmPhone和CdmaPhone那样独⽴出来?
这样设计可能更精简。对于telephony框架添加的部分只涉及到通话功能,且Volte只作为⼀个可选业务,基于当前⽹络的数据业务承载,
这样设计只需要在原来GsmPhone和CdmaPhone通话相关的接⼝加⼊volte的判断即可。
上图看到架构基本与GsmPhone/CdmaPhone⼀致,都有CallTracker / Connection / Call / Phone,ImsPhoneCallTracker拥有ImsManager实例,总管电话业务,负责执⾏操作和更新电话状态。⽽ImsP
hone是这⼀层的管家,掌握通话的控制⼊⼝
ImsPhoneCallTracker,实时关注Service state,上报状态到应⽤层等。
opt/net/ims
/frameworks/opt/net/ims/更像中间层的处理,只向上提供接⼝。
ImsManager就是提供IMS操作接⼝的类,接⼝功能包括开关volte功能 / 打电话 / 设置补充业务(呼叫转移等) / 设置IMS服务属性 (但不包括短彩信操作) 等等。
ImsManager.java中的⼀段说明:
ImsManager成员及作⽤:
1. IImsService —— aidl实例,负责ims服务状态相关的操作。
2. ImsCall和ImsCallSession —— 负责通话的建⽴和状态跟踪,通过listener来同步消息,对接diatek.ims中的
ImsCallSessionProxy。
3. ImsUt —— 负责补充业务,对接ImsUtStub。
小霞本子4. ImsConfig —— 负责IMS功能设置,对接ImsConfigImpl。明显看到,opt/net/ims这⼀层只提供接⼝,对接packages/rvices/Ims/并由它来实现具体的业务。
/**励志短句致自己奋斗
* Provides APIs for IMS rvices, such as initiating IMS calls, and provides access to
* the operator's IMS network. This class is the starting point for any IMS actions.
**/
ImsManager 是IMS 服务的起始点,并为IMS 服务提供接⼝,如建⽴通话和接⼊ims ⽹络等。
ims app
/vendor/mediatek/proprietary/packages/rvices/Ims/ 以app形式存在,主要负责具体业务的执⾏,与rild和库对接。
ImsRILAdapter——CommandsInterface接⼝的实现者,与RIL.java设计类似,有ImsRILSender和ImsRILReceiver在各⾃线程中执⾏收发,和rild-ims交互;
偷鸡不着蚀把米ImsService —— 管理ims服务状态,提供状态的get接⼝,执⾏ims注册 / 创建通话 等操作。
ImsCallSessionProxy —— 负责执⾏通话相关操作,直接与ImsRILAdapter交互,并通过Listener上报状态。
ImsConfigImpl —— 负责执⾏设置的操作,直接与ImsRILAdapter交互。
ImsUtStub —— 负责补充业务的设置,特殊的是并不通过ImsRILAdapter执⾏,⽽是单独实现的路径。
ImsAdapter —— MTK封装了⼀些处理到volte_imsm.so,ImsAdapter负责对接这个库,这个类的⽤途就是单独处理MTK不开源的部分;ImsEventDispatcher将volte_imsm上报的消息分发给实现了VaEventDispatcher的类:DataDispatcher——负责ims连接管理(如发起data call);CallControlDispatcher负责volte call相关。
(⼯程中查找volte_imsm.so,发现MTK并没有开源:vendor/letv/libs/mt6797_64/volte_imsm/)
framework中相关公共类和aidl定义
/frameworks/ba/telephony/java/com/android/ims
frameworks/ba…/ims下定义了⼀些可以公⽤的类,都属于特定数据的封装,基本上都继承了aidl stub跨进程⽆压⼒。
internal包下还定义了⼀系列aidl⽂件,具体实现都在/vendor/mediatek/proprietary/packages/rvices/Ims/中,为其提供访问⼊
⼝。
3. 模块的初始化
以上模块在开机后即开始初始化过程,下⾯来看下它们如何开始初始化。
mtk ims 应⽤初始化
/vendor/mediatek/…/rvices/Ims/ 在AndroidManifest中定义了application的persistent为true,因此ims app开机即⾃动加载:ImsApp在onCreate⽅法中创建ImsService实例,并将其添加为系统服务:
<application android:name="ImsApp"
android:persistent="true">
...</application>
public class ImsApp extends Application {
public ImsApp () {
}
@Override小白兔睡前故事
public void onCreate () {
if (UrId() == 0) {
ImsService imsService = new ImsService(this );
ServiceManager.addService(ImsManager.IMS_SERVICE, imsService.asBinder(), true );
凡庸}
}
}