【Android源码 栏目提醒】:网学会员Android源码 为您提供Android核心分析(18)-----Android电话系统之RIL-Java - 企业软件开发参考,解决您在Android核心分析(18)-----Android电话系统之RIL-Java - 企业软件开发学习中工作中的难题,参考学习。
Android RIL-Java RIL-Java在本质上就是一个RIL代理起到一个转发的作用是
Android Java概念空间中的电话系统的起点。
在RIL-D的分析中我们知道RILD建立了一个侦听套接口等待RIL-Java的连接。
一旦连接成功RIL-JAVA就可发起一个请求并等待应答并将结构发送到目标处理对象。
在RIL-Java中这个请求称为RILRequest。
为了直观起见我还是不厌其烦的给出RIL-Java的框架图。
RIL-Java的大框架包含了四个方面 ReceiverSenderCommandInterface异步通知机制 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 2Receiver Receiver连接到RILD的服务套接口接收读取RILD传递过来的Response Parcel。
Response分为两种类型一种是URC一种是命令应答。
对于URC将会直接分发到通知注册表中的Handler。
而命令应答则通过Receiver的异步通知机制传递到命令的发送者进行相应处理。
3Sender 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将被传递到RILDRILD在组装应答是将Token写入并传回到ril-javaril-java根据该Token找到相应的Request对象。
4.1RIL命令的发送模式 协议的真正实现是在rild中RIL-JAVA更多的是一个抽象和代理我们在研究源代码的过程中就会体会到到RIL-JAVA中的命令函数都有一个共同的框架。
SendXxxCmd传入参数Data传出参数result 组合RILRequest请求号resultmSerail Data-RR sendRILRequest Message 1RILRequest 请求号 request将传递到RILD用以标识命令request代表某个功能。
例如拨叫的request号为RIL_REQUEST_DIAL。
在libs/telephony/ril_commands.h有定义。
RILRequest.obtainRILRequest根据命令请求号传入参数Result MessagemSerail构造了一个RILRequest。
Result Message将带回应答信息回到命令的发起者。
mSerail
Android使用了一个RILRequest对象池来管理Andoird RILRequest。
mSerail是一个递增的变量用来唯一标识一个RILRequest。
在发送时正是用了该变量为Token在rild层看到的token就是该mSerail。
EVENT_END: EVENT_ENDhandleMessageRILSenderRIL.java 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根据类型不同进行处理。
第二步根据数据中的TokenmSerail反查mRequest找到对应的请求信息。
第三步将是数据转换成结果数据。
第四步将结果放在RequestMessage中发回到请求的发起者。
4.3详细的GSMCallTrackerRIL-Java函数对照