关闭

Android Telephony纲要

316人阅读 评论(0) 收藏 举报
分类:

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回调 

 

Java模块中3个重要的接口:Phone, CommandInterface, PhoneNotifier

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:126356次
    • 积分:2465
    • 等级:
    • 排名:第16552名
    • 原创:119篇
    • 转载:140篇
    • 译文:0篇
    • 评论:16条
    个人资料
    文章分类