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 |
首先拨号流程和来电流程分析在前几篇中写道过来电流程,拨号流程。
我们在通话界面若想更改当前通话状态,比如挂断/接听当前接收来电,挂断/保持当前通话等操作,可以理解为是控制消息下发的过程,从Dialer——>Telecom——>TeleService——>RIL——>Modem,通话控制消息一层一层的下发,最终交给Modem处理具体的通话控制。通话状态更改完成后,在将通话状态变更的消息一层一层的上报,最后交给Dialer应用对通话界面进行更新和显示。
这里需要关注几个重点
三个应用的控制消息传递
Dialer应用展示的通话界面或来电界面均有控制通话状态请求的界面控制,通过滑动或是点击相关的控件,将触发通话转态控制,调用android.telecom.Call对象的hold方法,如步骤1,在步骤3的Dialer应用中,调用IInCallAdapter的holdCall服务接口完成第一次的跨进程服务接口调用,进入Telecom应用。Telecom应用首先更新Call状态,此处的Call对象为Telecom应用内部定义的类com.android.service.telecom.Call,步骤8调用IConnectionService的hold服务接口,完成第二次的款进程服务接口调用,进入到TeleService应用。TeleService应用中经过层层方法调用,由GsmCdmaCallTracker对象进行Call的hold操作,并将请求发给RIL对象,发出对应的RIL请求
IInCallAdapter接口汇总
IICallAdapter的Stub接口实现在Telecom应用的InCallAdapter类中,他主要由answerCall,rejectCall,playDtmfTone,mergeConference等接口构成;InCallAdapter对象则在InCallController对象绑定,IInCallService成功后创建。
IConnectionService接口汇总
IConnectionService的Stub接口实现在framework/base下的ConnectionService抽象类的匿名内部类中,mBinder为其对象,他主要由addConnectionServiceAdapter,createConnection等创建TelephonyConnection接口,以及answer,reject,hold,playDtmfTone等控制通话状态的接口构成。而在TeleService应用中,TelephonyConnectionService继承了抽象类TelephonyConnection。
Android通话模型,Dialer,telecom和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的通话状态变化通知,通过框架层向应用层发起通话状态变化通知,包括来电,电话接通,进入通话中等。