Telephony通话消息上报流程
通话相关代码名称统一约定以及运行进程:
通话相关代码名称统一约定及运行进程汇总 | ||
路径 | 统称 | 进程 |
packages/app/Dialer | Dialer | com.android.dialer |
packages/service/telecomm | telecom | system_service |
packages/service/telephony | TeleService | com.android.phone |
framework/base/telecomm | framework | 无进程只是提供调用framwork |
framework/opt/Telephony | telephony | system_service或com.android.phone |
首先拨号流程和来电流程分析在前几篇中写道过来电流程,拨号流程。
拨号成功后,对方接听了此路通话,那么通话界面将更新当前通话中的通话状态,并开始通话计时,可以理解为:Modem——>RIL——>TeleService——>Telecom——>Dialer,一层一层上报通话状态为,“通话中....”,的消息处理和发送过程.
流程图:
这里需要关注几个重点
三个应用的Call信息传递
TeleService应用首先接收到通话状态更新的消息,通过framework/Telecom(framewrok)的Adapter服务设置不同的状态(步骤11(传入的是Id));接着service/Telecom(telecom)应用跟更新Call状态(步骤13,步骤14);最后Telecom掉了用IInCallSerivce的updateCall接口更新Call状态
RegistrantList消息处理
步骤2步骤3,在GsmCdmaPhone对象发出RegistranList消息通知后,在TelephonyConnection对象的mHandler匿名内部类对象的handlerMessage中响应MSG_PRECISE_CALL_STATE_CHANGED类型的Handler消息,该Handler消息的注册入口在TelephonyConnection抽象类的两个子类GsmConnectionh和CdmaConnection的setOriginalConnection方法中实现注册MSG_PRECISE_CALL_STATE_CHANGED类型的Registran,并在GsmConnection的构造方法中调用setOriginalConnection接口进行消息注册的初始化操作;而TelephonyConnection对象在TelephonyConnectionService类的onCreateOutgingConnection和onCreateIncommingConnection方法中创建。
TelephonyConnection对象的Listener注册
步骤10:通过Listener对象的onStateChanged进行消息回调,那么Listener对象是什么?有是在什么地方注册的?是在ConnectionService的createConnection方法中,首先创建TelephonyConnection对象,然后调用addConnection方法,设置当前类的私有内部类Connection.Listener对象mConnectionListener为TelephonyConnection对象的Listener
IConnectionServiceAdapter接口汇总
IConnectionServiceAdapterd的Stub接口实现在Telecom应用ConnectionServiceWrapper类的私有内部类Adapter中,它主要由setActive,setRinging,setAudioRoute等设置Call相关状态信息的接口,以及onConnectionEvent,onRttInitiationSuccess,onRemoteRttRequest等消息通知接口构成
IInCallService接口汇总
IICallSerivce的Stub接口实现了framework/base下的InCallService抽象类的私有内部类InCallServiceBinder中,他主要由setInCallAdapter,addCall,updateCall等增加和更新Call对象相关的接口,以及onConnectionEvent,onCallAudioStateChanged等消息通知接口。而在Dialer应用中,InCallServiceImpl继承了抽象类InCallService
Android通话模型,Dialer,Telepcom和TeleService三个系统应用主要负责的业务及运行进程空间,结合这四个通话的核心流程,可以抽象出模型,可以站在更高的层次去认识和理解Android Telephony通话功能。
系统的分层
Dialer,Telecom和TeleService三大应用可以理解为:Dialer应用是普通的Android App应用,其运行进程的用户信息和进程信息,也能说明此问题;Telecom应用运行在system_service进程上,其进程用户名为system系统用户,说明他在运行在Android Framework框架层;TeleService应用运行的进程名是com.android.phone,用户名是radio,承载着Telephony Call协议栈,同样可以认为他运行在Android Framewrok框架层;最后RIL他运行在HAL(硬件抽象层)。
交互方式
Dialer,Telecom,TeleService和RIL都是通过服务进行交互的,在图中,他们之间有箭头连接的都是通过Service跨进程的接口调用实现的。Dialer与TeleService之间没有直接的消息传递,要通过Telecom进行消息中转,Telecom与RIL直接同样没有直接的消息传递,要通过TeleService进行消息中转。
通过服务进行跨进程接口调用实现消息的传递,服务接口调用本身就是同步的接口调用,在Service端的实现将转换为异步方式处理,待消息处理完成后,在使用回调的接口传递消息处理的结果
分解通话相关流程
根据消息的传递方向,可分成两大类
第一类 控制通话消息下发流程 : 应用层通过框架层向RIL发起通话管理和控制相关RIL请求,RIL转换成对应的消息发发送给Modem执行,其中包括拨号,接听电话,拒接电话,保持,恢复通话等。
第二类 为通话状态更新消息上报流程 :RIL收到的Modem的通话状态变化通知,通过框架层向应用层发起通话状态变化通知,包括来电,电话接通,进入通话中等。