从下到上可以分为四层:硬件驱动层、RIL daemon层、Telephony框架实现层、 PHONE应用层,下层为上层提供服务,每层之间采用不同的通讯方式交互。RIL daemon层实现为单独的一个开机启动的进程(rild命令),通过AT命令硬件驱动层交互,Telephony JAVA框架实现层包括一个RIL抽象层,RIL抽象层中通过一个本地socket与RIL daemon层(rild)交互,Phone应用层通过Binder机制与Telephony框架交互。
本文主要分析框架层相关的主要类的结构。
一 Telephony框架
Telephony框架系统类图如下图:
Telephony框架层为应用层和框架层的其它服务提供Telephony服务,提供了如下几个服务:PhoneInterfaceManager服务,是ITelephony接口的实现,IccSmsInterfaceManager短消息服务,是Isms接口的实现;IccPhoneBookInterfaceManager电话本服务,是IIccPhoneBook接口的实现;PhoneSubInfo提供用户信息读取服务,是IPhoneSubInfo接口的实现;TelephonyRegistry提供应用层的消息登记服务,是ITelephonyRegistry接口的实现。
应用程序通过以下几个客户端对象使用Telephony框架提供的服务。
应用程序可以在SmsManager单例对象(通过SmsManager类的getDefault函数返回SmsManager单例对象)中访问IccSmsInterfaceManager服务,用来收发短信。
通过IccProvider一个内容提供对象提供对IccPhoneBookInterfaceManager服务的访问,读取和管理电话本。
通过TelephonyManager对象提供对PhoneSubInfo、PhoneInterfaceManager、TelephonyRegistry服务的访问,TelephonyManager对象通过getSubscriberInfo函数获得PhoneSubInfo服务的远程访问代理对象。通过getITelephony函数获得PhoneInterfaceManager的远程访问代理对象。提供一个对象全局sRegistry(指向TelephonyRegistry服务的远程访问代理对象)访问TelephonyRegistry服务。
TelephonyManager通过这三个接口函数提供对外的TelephonyAPI,因此应用程序可以通过 TelephonyManager对象提供的TelephonyAPI访问这些服务,使用Telephony框架层提供的接口功能。
TelephonyManager对象本身通过Context对象调用getSystemService(Context.TELEPHONY_SERVICE)函数返回,TelephonyManager对象是一个单例对象。
PhoneInterfaceManager服务在默认电话应用的PhoneApp对象中采用单例模式进行初始化(PhoneApp对象本身也是单例对象),和PhoneApp对象公用一个进程,PhoneInterfaceManager为框架层的其它服务提供Telephony API 服务,并通过TelephonyManager对象(通过getITelephony函数获得ITelephony接口)为其它应用提供服务。PhoneInterfaceManager通过PhoneApp、CallManager、Phone对象实现相应功能。CallManager是一个单例对象,CallManager对象提供CALL控制以及登记通知等功能。
Phone对象是整个Telephony服务的核心,主要的Telephony服务(IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo)及数据连接功能都通过具体的Phone对象提供,具体的Phone对象包括CDMAPhone、CDMALTEPhone、GSMPhone及SipPhone。
PhoneBase抽象类是这些具体Phone对象的共同的基类,本身一个Handler类,用来提供Phone接口的基实现,PhoneBase通过CommandsInterface接口与RIL daemon层交互,实现短消息提交、数据连接控制、ICC 信息读取等Telephony基类功能。PhoneBase包含SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords、IccCard等几个抽象类成员,并通过这些抽象类成员提供某一方面功能的基类实现。
SMSDispatcher 、DataConnectionTracker 、IccFileHandler、IccRecords抽象类也是派生自Handler类,因此都能够向RIL发送命令,接收和处理RIL发来的事件和命令应答。PhoneBase包括一个PhoneNotifier接口,Phone对象本身及内部对象可以通过PhoneNotifier接口向应用发送Telephony事件通知。
CDMAPhone、GSMPhone、CDMALTEPhone三个具体的Phone对象在默认的PhoneApp应用中调用PhoneFactory的makeDefaultPhone函数根据不同的网络模式进行单例实例化,并封装进一个统一的PhoneProxy代理对象中。
PhoneProxy内部的对象成员mActivePhone指向代理的实际Phone对象。PhoneProxy代理对象实现了Phone接口,使应用能够使用统一的PhoneProxy对象控制操作具体类型的Phone对象,而不用关心它们之间的差异(代理模式的采用),应用程序通过PhoneFactory的getDefaultPhone函数返回统一的PhoneProxy代理对象来访问不同的Phone对象。
因为Telephony框架层支持不同的网络类型的Telephony实现(CDMA、GSM),因此Telephony框架层普遍使用代理模式来对应用提供统一的服务接口。如PhoneProxy代理对象内部还封装了IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo三个服务的代理对象,通过代理对象提供对这三个服务的操作控制。
另外CommandsInterface接口的具体实现对象RIL及PhoneNotifier接口的具体实现对象DefaultPhoneNotifier也是在PhoneFactory的makeDefaultPhone中进行单例实例化。
CDMAPhone、GSMPhone对象直接派生自PhoneBase,提供Phone接口的具体实现,GSMPhone是GSM电话的JAVA框架层实现,CDMAPhone是CDMA电话的JAVA框架层实现。
CDMAPhone、GSMPhone对象实例化时除实例化基对象PhoneBase内部抽象对象(SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords、IccCard)的具体类外,还实例化用于具体电话对象的Telephony服务(IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo三个服务或者服务的派生类)。
二 GSMPhone
如下是GSMPhone对象的相关类图。
SMSDispatcher 、DataConnectionTracker 、IccFileHandler、IccRecords、IccCard等抽象类对应GSMPhone对象中的派生类分别为GsmSMSDispatcher(提供GSM模式的短消息发送和接收提交功能)、GsmDataConnectionTracker(提供GSM模式的数据连接管理功能)、SIMFileHandler(提供SIM File处理)、SIMRecords(提供SIM信息记录功能)、SimCard(提供SIM CARD功能);
IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo服务在GSMPhone对象中实现的具体的服务类为SimSmsInterfaceManager、 SimPhoneBookInterfaceManager及PhoneSubInfo;这些对象和服务都在CDMAPhone对象实例化进行实例化。
另外GSMPhone对象在实例化时还实例化GsmCallTracker(提供GSM模式的CALL管理)、GsmServiceStateTracker(提供GSM模式的服务状态管理)、CatService对象(提供STK服务)。
GSMCallTracker是Android的通话管理层,GsmCallTracker派生自Handler的虚拟类CallTracker;GsmServiceStateTracker派生自Handler的虚拟类ServiceStateTracker。
GsmCallTracker、GsmServiceStateTracker对象分别提供Call状态(共有IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING九种状态)及ServiceState(共有STATE_IN_SERVICE、STATE_OUT_OF_SERVICE、STATE_EMERGENCY_ONLY、STATE_POWER_OFF四种状态)的跟踪和管理,能够提供向RIL层发送请求,接收和处理RIL层发来的命令响应事件及其它主动通知事件,如振铃等CALL相关事件及Service状态事件。
GsmCallTracker对象中还提供有三个GsmCall对象(派生自抽象类Call):ringingCall(用来管理处于INCOMING和WAITING状态的通话)、foregroundCall(用来管理处于DAILING、ALERTING、ACTIVE状态的通话)、backgroundCall(用来管理HOLD的通话)。
GsmCallTracker是Call应用中的通话管理层,它维护了一个最多MAX_CONNECTIONS=7路GsmConnections通话链路的同时,还维护了三种通话状态(ringingCall,foregroundCall,backgroundCall),GsmCall以及GsmConnection是GsmCallTracker维护的对象,同时GsmConnection又依附于GsmCall的存在,MAX_CONNECTIONS_PER_CALL=5表明最多可以有5路通话处于某一个通话状态(foregroundCall,background,ringing)。GsmConnection继承自Connection类,该类主要是用来维护某一路的通话状态。当它们状态均为DISCONNECTED时意外着该GSMCall为IDLE状态。
在GSMCallTracker中维护着通话列表:connections。顺序记录了正连接上的通话,这些通话包括:ACTIVE,DIALING,ALERTING,HOLDING,INCOMING,WAITING等状态的连接。GSMCallTracker将这些连接分为了三类别进行管理:RingingCall: INCOMING ,WAITING ForegourndCall: ACTIVE, DIALING ,ALERTING BackgroundCall: HOLDING
另外GSMCallTracker还包含一个GsmConnection类型(派生自抽象类Connection)的数组对象Connections,用来维护所有的现行的通话的列表,GSMCallTracker对象最大可维护7路通话。
GsmConnection对象中有个成员变量:GsmCall parent,这个成员变量是用来表示该connection是属于哪个Call的,一个Call可以有多个Connection,但一个Connection只能属于一个Call。
GsmServiceStateTracker对象中除了包括ServiceState状态信息外,还包括SignalStrength信号强度等信息。
GsmServiceStateTracker对象还维护GSM CELL位置信息,因此包含两个GsmCellLocation对象成员cellLoc(当前位置) , newCellLoc( 新位置 )。
GsmCallTracker、GsmServiceStateTracker维护的状态和位置信息都通过RIL从RIL daemon获得,因此两个对象都包括一个指向RIL的CommandsInterface对象。
CatService对象实现STK服务,也是一个Handler对象,并实现AppInterface接口。CatService对象能够与RIL和STK应用交互:可以实现向RIL发送Envelop命令,以及从RIL接收STK事件,解析事件流(包括Proactive Command),从STK应用接收命令执行结果编码后发给RIL。CatService对象采用一个RilMessageDecoder状态机解析RIL发来的STK事件流。
PhoneInterfaceManager@call
PhoneUtils@placeCall
CallManager@dial
GSMPhone@dial
GsmCallTracker@dial
RIL@dial
PhoneInterfaceManager@answerRingingCall
PhoneUtils@answerCall
CallManager@acceptCall
GSMPhone@acceptCall
GsmCallTracker@acceptCall
RIL@acceptCall
CallManager@rejectCall
GSMPhone@rejectCall
GsmCallTracker@rejectCall
RIL@rejectCall
PhoneInterfaceManager@endCall
PhoneUtils@hangup
CallManager@hangupForegroundResumeBackground
GsmCall@hangup
GsmCallTracker@hangup
RIL@hangupWaitingOrBackground