# Android RIL-Java
[](http://hi.csdn.net/attachment/201005/14/0_1273849467WMhm.gif)
RIL-Java在本質上就是一個RIL代理,起到一個轉發的作用,是Android Java概念空間中的電話系統的起點。在RIL-D的分析中,我們知道RILD建立了一個偵聽套接口,等待RIL-Java的連接。一旦連接成功,RIL-JAVA就可發起一個請求,并等待應答,并將結構發送到目標處理對象。在RIL-Java中,這個請求稱為RILRequest。為了直觀起見,我還是不厭其煩的給出RIL-Java的框架圖。
[](http://hi.csdn.net/attachment/201005/14/0_1273849470BuxR.gif)
RIL-Java的大框架包含了四個方面:
Receiver,Sender,CommandInterface,異步通知機制
### (1) Command Interface
在ril.java源代碼中,我們可以看到RIL-JAVA對象提供了如下的Command Interface:
…
getlccCardStatus
getCurrrentCalls
dial
acceptCall
rejectCall
sendDTMF
sendSMS
setupDataCall
setRadioPower
…
為什么要定義這些接口呢?這函數接口不是憑空捏造出來的,這些都是電話的基本功能的描述,是對Modem AT指令的提煉抽象。大多數Modem都是根據通訊協議提供接口,我們如果不熟悉通訊協議,請參閱3GPP的相關文檔,以及自己使用的Modem的SPEC說明。
V.25ter AT Commands
3GPP 07.07 AT Comamnds-General commands
3GPP 07.07 AT Comamnds-Call Control commans
3GPP 07.07 AT Comamnds-Network Service related commands
3GPP 07.07 AT Comamnds-MT control and status command
3GPP 07.07 AT Comamnds-GPRS Commands
3GPP 07.07 Mobile Termination Errors
3GPP 07.05 SMS AT Commands
### (2)Receiver
[](http://hi.csdn.net/attachment/201005/14/0_1273849487pQG9.gif)
[](http://hi.csdn.net/attachment/201005/14/0_127384949370fT.gif)
Receiver連接到RILD的服務套接口,接收讀取RILD傳遞過來的Response Parcel。Response分為兩種類型,一種是URC,一種是命令應答。對于URC將會直接分發到通知注冊表中的Handler。而命令應答則通過Receiver的異步通知機制傳遞到命令的發送者進行相應處理。
### (3)Sender
[](http://hi.csdn.net/attachment/201005/14/0_1273849499m0zQ.gif)
Sender應該分為兩部分架構,
上層函數調用Command Interface將請求消息發送到Sender的架構。
Sender接收到EVENT_SEND消息后,將請求發送到RILD的架構。
### (4)異步應答框架
對于異步應答來講,命令的發起者發送后,并不等待應答就返回,應答的回應是異步的,處理結果通過消息的方式返回。站在設計者的角度思考如何設計合適的框架來完成異步通訊的功能呢?對于異步系統我們首先應該考慮的是如何標識命令和結果,讓命令和結果有一個對應關系,還有命令沒有響應了,如何管理命令超時?讓我們來看看Android設計者如何完成這些工作。
Android設計者利用了Result Message 和RILRequest對象來完成Request和Result的對應對于關系。在上層做調用的時候生成Result Message對象傳遞到ril_java,并在Modem有應答后,通過Result Message對象帶回結果。如何保證該應答是該RILRequest的呢?Android設計者還提供了一個Token(令牌)的概念。在源代碼中RILRequest的mSerail就用作了Token。Token用來唯一標識每次發送的請求,并且Token將被傳遞到RILD,RILD在組裝應答是將Token寫入,并傳回到ril-java,ril-java根據該Token找到相應的Request對象。
[](http://hi.csdn.net/attachment/201005/14/0_1273849509k0fS.gif)
#### (4.1)RIL命令的發送模式
協議的真正實現是在rild中,RIL-JAVA更多的是一個抽象和代理,我們在研究源代碼的過程中就會體會到到RIL-JAVA中的命令函數都有一個共同的框架。
SendXxxCmd(傳入參數Data,傳出參數result){
組合RILRequest(請求號,result,mSerail)
Data->RR
send(RILRequest): Message
}
1)RILRequest
[
](http://hi.csdn.net/attachment/201005/14/0_1273849515vVv7.gif)
請求號:
request將傳遞到RILD用以標識命令,request代表某個功能。例如撥叫的request號為:RIL_REQUEST_DIAL。在libs/telephony/ril_commands.h有定義。RILRequest.obtain@RILRequest根據命令請求號,傳入參數Result Message,mSerail構造了一個RILRequest。Result Message將帶回應答信息回到命令的發起者。
mSerail:
Android使用了一個RILRequest對象池來管理Andoird RILRequest。mSerail是一個遞增的變量,用來唯一標識一個RILRequest。在發送時正是用了該變量為Token,在rild層看到的token就是該mSerail。
EVENT_END:
[EVENT_END@handleMessage@RILSender@RIL.java](#)
[
](http://hi.csdn.net/attachment/201005/14/0_1273849518Q7af.gif)[
](http://hi.csdn.net/attachment/201005/14/0_1273849521q2nK.gif)
2)發送步驟:
第一步:
生成RILRequest,此時將生成m_Serial(請求的Token)并將請求號,數據,及其Result Message 對象填入到RILRequest中
第二步:
使用send將RILRequest打包到EVENT_SEND消息中發送到到RIL Sender Handler,
第三步:
RilSender 接收到EVENT_SEND消息,將RILRequest通過套接口發送到RILD,同時將RILRequest保存在mRequest中以便應答消息的返回。
(4.2) 接收模式
第一步:分析接收到的Parcel,根據類型不同進行處理。
[
](http://hi.csdn.net/attachment/201005/14/0_1273849525557D.gif)
第二步:根據數據中的Token(mSerail),反查mRequest,找到對應的請求信息。
第三步:將是數據轉換成結果數據。
第四步:將結果放在RequestMessage中發回到請求的發起者。
### 4.3)詳細的GSMCallTracker,RIL-Java函數對照
[](http://hi.csdn.net/attachment/201005/14/0_12738495343nGL.gif)
[](http://hi.csdn.net/attachment/201005/14/0_1273849561CKSQ.gif)
- 前言
- (一)分析方法論探討之設計意圖
- (二)方法論探討之概念空間篇
- (三)手機之硬件形態
- (四)手機的軟件形態
- (五)基本空間劃分
- (六)IPC框架分析 Binder,Service,Service manager
- (七)Service深入分析
- (八)Android 啟動過程詳解
- (九)Zygote Service
- (十)Android GWES之基本原理篇
- (十一)Android GWES之消息系統
- (十二)Android GEWS窗口管理之基本架構原理
- (十三)Android GWES之Android窗口管理
- (十四)Android GWES之輸入系統
- (十五)Android輸入系統之輸入路徑詳解
- (十六)Android電話系統-概述篇
- (十七)電話系統之rilD
- (十八)Android電話系統之RIL-Java
- (十九)電話系統之GSMCallTacker
- (二十)Android應用程序框架之無邊界設計意圖
- (二十一)Android應用框架之AndroidApplication
- (二十二)Android應用框架之Activity
- (二十三)Andoird GDI之基本原理及其總體框架
- (二十四)Android GDI之顯示緩沖管理
- (二十五)Android GDI之共享緩沖區機制
- (二十六)Android GDI之SurfaceFlinger
- (二十七)Android GDI 之SurfaceFlinger之動態結構示意圖
- (二十八)Android GDI之Surface&Canvas