6572_Telephony
3.1.8 TelephonyRegistry向ServiceManager注册 23
1 术语和前言:
(本文在文字描述和图片引用方面,使用了其他同学的部分内容,在此感谢!本人着重于架构和功能的逻辑组织和源码分析过程。)
2 TelePhony:
2.1 Telephony框架
Android手机操作系统是一个基于Linux Kernel的分层智能手机操作系统,其共分为4层,从上到下分别是:
Ø 应用层(Java Application),包括了Android各种应用程序
Ø 应用框架层(Java Frameworks),是Google发布的核心应用所使用的API框架
Ø 系统运行库层(User Libraries),包含了手机系统平台必须的C/C++核心库、Dalvik虚拟机运行环境和HAL子层
Ø 核心层(Linux Kernel),Android 4.0 基于Linux Kernel 3.0.8 提供核心系统服务,例如文件管理、内存管理、进程管理、网络堆栈、驱动模型等操作系统的基本服务能力
Telephony为手机提供通信功能,其通信逻辑关系如下,
Android Telephony采用了分层结构,共跨越了4层:
Ø Telephony应用,包括了Phone、MMS和STK等应用程序
Ø Telephony框架,提供TelephonyManager,包含数据连接、通话、信息和SIM相关的API
Ø 无线通信接口层(RIL),主要位于User Libraries层中的HAL层,提供AP(Application Processor)和BP( Baseband Processor)之间的通信功能
Ø Modem,位于BP,主要负责实际的无线通信能力处理
其中,Telephony框架层是以Phone实例为核心的,Phone接口及其子类管理整个整个手机的Telephony功能。Phone相关信息在后面介绍。
Telephony框架层为应用层和框架层的其它服务提供Telephony服务,如下:
PhoneInterfaceManager服务,是ITelephony接口的实现,PhoneInterfaceManage
通过PhoneApp、CallManager、Phone对象实现相应功能。
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服务。
Android中关于telephony相关的java代码主要在下列目录中:
1. frameworks/base/telephony/java/android/telephony
提供Android telephony的公开接口,任何具有权限的第三方应用都可使用,如接口类TelephonyManager。
2. frameworks/base/telephony/java/com/android/internal/telephony
3. frameworks/base/services/java/com/android/server/TelephonyRegistry.java
提供一系列内部接口,目前第三方应用还不能使用。当前似乎只有packages/apps/Phone能够使用
4. frameworks/opt/telephony
5. packages/apps/Phone
一个特殊应用,或者理解为一个平台内部进程。其他应用通过intent方式调用这个进程的服务。
1.1 Phone介绍
Phone相关类的关系图:
Phone |
接口,定义了一些telephony相关的常量和方法 |
PhoneBase |
类,继承了handler,实现了phone接口, 类里定义了一些常用类的引用,如mCM,SMSDispatcher |
PhoneNotifier |
接口,定义了一些telephony相关的通知方法 |
PhoneFactory |
类,创建phone实例,主要完成socket创建、RIL实例创建、 phoneproxy实例创建。 |
MTKPhoneFactory |
MTK对PhoneFactory的封装,当前看不到代码 |
PhoneProxy |
类,继承了handler,实现了phone接口,使用phone实例,完成和ril交互的接口。 |
Phone描述了对电话的所有操作接口。PhoneBase直接从Phone 派生而来, GSMPhone又从PhoneBase派生而来,代表GSM手机的通信功能。PhoneProxy也从Phone直接派生而来,完成和ril交互的接口,手机的Phone实例就是一个PhoneProxy实例。
接口类Phone定义了一套API,这套API用于使用RIL发送AT命令请求,也还有一套register和unregister函数;当调用者对一些内部状态感兴趣时,可以调用对应的register函数,当状态变化时可以得到及时通知。
PhoneBase实现了Phone接口中定义的部分函数,还有一部分由其子类GSMPhone和CDMAPhone实现。PhoneBase通过CommandsInterface接口与RIL daemon层交互,实现短消息提交、数据连接控制、ICC 信息读取等Telephony基类功能。PhoneBase包含SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords、IccCard等几个抽象类成员,并通过这些抽象类成员提供某一方面功能的基类实现。
PhoneProxy是GSMPhone和CDMAPhone的代理,让使用者不用关注手机到底是GSM还是CDMA,它遵守Phone定义的API接口,因此继承Phone。PhoneFactory在创建Phone对象时,拥有的是PhoneProxy对象,PhoneProxy根据实际的网络类型创建对应的GSMPhone或CDMAPhone。PhoneProxy代理对象实现了Phone接口,使应用能够使用统一的PhoneProxy对象控制操作具体类型的Phone对象,而不用关心它们之间的差异(代理模式的采用),应用程序通过PhoneFactory的getDefaultPhone函数返回统一的PhoneProxy代理对象来访问不同的Phone对象。 因为Telephony框架层支持不同的网络类型的Telephony实现(CDMA、GSM),因此Telephony框架层普遍使用代理模式来对应用提供统一的服务接口。如PhoneProxy代理对象内部还封装了IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo三个服务的代理对象,通过代理对象提供对这三个服务的操作控制。
Phone对象是整个Telephony服务的核心,主要的Telephony服务(IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo)及数据连接功能都通过具体的Phone对象提供,具体的Phone对象包括CDMAPhone、CDMALTEPhone、GSMPhone及SipPhone。PhoneBase抽象类是这些具体Phone对象的共同的基类,本身一个Handler类,用来提供Phone接口的基实现。
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。
另外GSMPhone对象在实例化时还实例化GsmCallTracker(提供GSM模式的CALL管理)、GsmServiceStateTracker(提供GSM模式的服务状态管理)、CatService对象(提供STK服务)。
1.1 Message
Message在telephony主要通过GsmSMSDispatcher提供GSM模式的短消息发送和接收提交功能,通过smsMessage实现短消息的编解码。
1.2 Call
GSMCallTracker是Android的通话管理层,GsmCallTracker派生自Handler的虚拟类CallTracker;
GsmCallTracke对象提供Call状态(共有IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING九种状态)的跟踪和管理,能够提供向RIL层发送请求,接收和处理RIL层发来的命令响应事件及其它主动通知事件,如振铃等CALL相关事件及Service状态事件