Telephony提供的功能: Voice, SMS, SIM, Data Connection, STK and etc
这个模块特殊的地方:
1. 在Phone应用中,注册了Service。这样Phone就必须始终运行。
将ITelephony放到Phone应用中:在Service中需要提供UI界面,比如打电话,拨号等。
2. 将与硬件相关的模块,抽离出来。一方面方便维护。另一个方面,在Java层是异步执行的,
在Native层是同步执行的。
3. 由于电话应用会退出,提供了系统服务来给应用注册回调。
代码分布:
公共接口:frameworks/base/telephony/java/android/telephony
Telephony模块对外接口: TelephonyManager, SMSManager等
内部接口:frameworks/base/telephony/java/com/android/internal/telephony
主要给Phone应用调用,功能实现模块。
RIL部分: hardware/ril
负责与Modem交互。
System Server服务: frameworks/base/services/java/com/android/server/TelephonyRegistry.java
telephony.registry: [com.android.internal.telephony.ITelephonyRegistry]
Phone应用:packages/apps/Phone/
提供打电话,拨号等功能,运行的Service有: "phone", "isms", "simphonebook", "iphonesubinfo"
phone: [com.android.internal.telephony.ITelephony]
iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo]
simphonebook: [com.android.internal.telephony.IIccPhoneBook]
isms: [com.android.internal.telephony.ISms]
运行模块:
Native Daemon:
Rild: 独立的Native进程。
下行数据:请求,
上行数据:响应,主动上报
Android Service:
TelephonyManager: Phone App中
SmsManager: Phone App中
TelephonyRegistry: System Server中
Android App: 提供界面
Linux中:
pppd:拨号程序
ppp driver:建立数据连接
通过ril.java与rild通信
1. 通过socket
2. RILSender/RILReceiver分别负责发送,各自都起一个线程。
RILSender/RILReceiver线程是在Phone应用中执行的。
3. 使用RILRequest来表示一个个请求。
请求的发送和接受是分开来的,在RIL中通过Serial来标识请求。
需要在指令执行完,处理什么事情。需要在创建请求的时候添加一个消息。
调用路径:
类TelephonyManager实现了android的电话相关操作。它主要使用两个服务来访问telephony功能:
1.ITelephony,提供给上层应用程序用户与telephony进行操作,交互的接口,在packages/apps/Phone中由PhoneInterfaceManager.java实现。
2.ItelephonyRegistry提供了一个通知机制,将底层来的上报通知给框架中需要得到通知的部分,由TelephonyRegistry.java实现
主动调用过程:(ITelephony接口)
应用进程: TelephonyManager通过Binder RPC调用
Phone进程: PhoneInterfaceManager-->(Phone)GSMPhone-->(CommandsInterface)RIL.java--> rild socket接口发送数据。
Rild进程:接受socket命令--> rild执行命令
关于电话的相关状态信息,获取通知路径如下:(ITelephonyRegister接口)
1. 在Phone进程中:
rild -(Rild Socket)->
RILReceiver--> DefaultPhoneNotifier-(Binder IPC)->
"telephony.registry" service
2. 在System Server中:
Binder Thread--> API-->Broadcast or Notify Listener
3. 在应用中,获取通知的方式:
a) 接受Broadcast通知
b) 注册Listener回调