Android核心分析 ------ 电话系统之rilD

Android电话系统之-rild

Rild是Init进程启动的一个本地服务,这个本地服务并没有使用Binder之类的通讯手段,而是采用了socket通讯这种方式。RIL(Radio Interface Layer)

Android给出了一个ril实现框架。由于Android开发者使用的Modem是不一样的,各种指令格式,初始化序列都可能不一样,GSM和CDMA就差别更大了,所以为了消除这些差别,Android设计者将ril做了一个抽象,使用一个虚拟电话的概念。这个虚拟电话对象就是GSMPhone(CDMAPhone),Phon对象所提供的功能协议,以及要求下层的支撑环境都有一个统一的描述,这个底层描述的实现就是靠RIL来完成适配。

Andoid将RIL层分为两个代码空间:RILD管理框架,AT相关的xxxril.so动态链接库。将RIL独立成一个动态链接库的好处就是Android系统适应不同的Modem,不同的Mode可以有一个独立的Ril与之对应。从这个层面上看,Rild更多是一个管理框架。

而ril是具体的AT指令合成者和应答解析者。从最基本的功能来讲,ril建立了一个侦听Socket,等待客户端的连接,然后从该连接上读取RIL-Java成传递来的命令并转化成AT指令发送到Modem。并等待Modem的回应,然后将结果通过套接口传回到Ril-Java层。下图是Ril-D的基本框架:

下面的数据流传递描述图表描述了RIL-JAVA层发出一个电话指令的5 步曲。

在AT通讯的过程中有两类响应:一种是请求后给出应答,一种是通知类,即为不请自来的,例如短信通知达到,我们称该类通知为URC。在Rild中URC和一般的Response是分开处理的,概念上URC由[email protected]处理,而Response由handleFinalResponse来处理。

1 Event Loop

Rild管理的真正精髓在ril.cpp,ril_event.cpp中,在研究的过程中,可以看到设计者在抽象上所下的功夫,设计得很优美。Event Loop的基本工作就是等待在事件端口(串口,Socket),一旦有数据到达就根据登记的Event回调函数进行处理。现在来看Ril设计者是如何建立一套管理框架来完成这些工作的?

1.1 Event对象

Event对象构成:(fd,index,persist,func,param)

fd 事件相关设备句柄。例如对于串口数据事件,fd就是相关串口的设备句柄
index  
persist 如果是保持的,则不从watch_list中删除。
func 回调事件处理函数
param 回调时参数

为了统一管理事件,Android使用了三个队列:watch_list,timer_list,pending_list,并使用了一个设备句柄池readFDS。

readFDS:是Linux的fd_set,readFDS保存了Rild中所有的设备文件句柄,以便利用select函数统一的完成事件的侦听。

watch_list:监测时间队列。需要检测的事件都放入到该队列中。

timer_list:timer队列

pending_list:待处理事件队列,事件已经触发,需要所回调处理的事件。

事件队列队列的操作:ril_event_add,ril_event_del, ril_timer_add

在添加操作中,有两个动作:

(1) 加入到watch_list

(2) 将句柄加入到readFDS事件句柄池。

1.2 ril_event_loop()

我们知道对于Linux设备来讲,我们可以使用select函数等待在FDS上,只要FDS中记录的设备有数据到来,select就会设置相应的标志位并返回。readFDS记录了所有的事件相关设备句柄。readFDS中句柄是在在AddEvent加入的。所有的事件侦听都是建立在linux的select readFDS基础上。

ril_event_loop 利用select等待在readFDS(fd_set)上,当select设备有数据时,ril_event_loop会从select返回,在watch_list中相应的Event放置到pend_list,如果Event是持久性的则不从watch_list中删除。然后ril_event_loop遍历pengding_list处理Event事件,发起事件回调函数。

1.3 几个重要的Event

上面分析了ril-d的框架,在该框架上跑的事件有什么

(1)s_listen_event- (s_fdListen,listenCallback)

listenCallback处理函数,

接收客户端连接:s_fdCommand=accepte(..)

添加s_commands_event()

重新建立s_listen_event,等待下一次连接

(2) s_command_event(s_fdCommand,ProcessCommandsCallback)

从fdCommand  Socket连接中读取StreamRecord

使用ProcessCommandBufer处理数据

s_listen_event在大的功能上处理客户端连接(Ril-JAVA层发起的connect),并建立s_commands_event去处理Socket连接发来的Ril命令。ProcessCommandBufer实际上包含了Ril指令的下行过程。

1.4 下行命令翻译及其组织@ProcessCommandBuffer

RIL_JAVA传递的命令格式:Parcel <request,token,content>,由命令号,令牌,内容组成。RIL_JAVA到达RIL_C时转为构建本地RequestInfo,并将被翻译成具体的AT指令。由于每条AT命令的参数是不同的,所以对不同的AT指令,有不同的转换函数,在此Android设计在这里做了一个抽象,做了一个分发框架,通过命令号,利用sCommand数组,获得该命令的处理函数。

sComand[]={

<ril_request_xxx,dispatchxxx,reponsexxx>

<...>

}

sComand 存在于Ril_command.h中。

&sComand[]=

<

{RIL_REQUEST_GET_IMEI, dispatchVoid, responseString},

{RIL_REQUEST_DIAL, dispatchDial, responseVoid},

{….}

>

dispatchXxx函数一般都放在在Reference-ril.c中,Reference-ril.c这个就是我们需要根据不同的Modem来修改的文件。

1.5 send_at_command框架

send_at_command是同步的,命令发送后,send_at_command将等待在s_commandcond,直到有sp_response->finalResponse。

2 read [email protected]

Read loop是解决的问题是:解析从Modem发过来的回应。如果遇到URC则通过handleUnsolicited上报的RIL_JAVA。如果是命令的应答,则通过handleFinalResponse通知send_at_command有应答结果。

对于URC,Rild同样使用一个抽象数组@Ril.CPP.

static UnsolResponseInfo s_unsolResponses[] = {

#include "ril_unsol_commands.h"

};

并利用RIL_onUnsolicitedResponse将URC向上层发送。

3 Ril-d的整体数据流及其控制流示意图

时间: 2024-10-13 19:34:57

Android核心分析 ------ 电话系统之rilD的相关文章

Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程

Android核心分析 之一分析方法论探讨之设计意图 http://www.apkbus.com/android-24212-1-1.html Android核心分析 之二方法论探讨之概念空间篇 http://www.apkbus.com/android-24213-1-1.html Android是什么 之三手机之硬件形态 http://www.apkbus.com/android-24215-1-2.html Android核心分析之四手机的软件形态 http://www.apkbus.co

Android核心分析 ----- 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的大框架包含了四个方面: Receiv

Android核心分析 ----- Android电话系统-概述篇

Android电话系统之概述篇 首先抛开Android的一切概念来研究一下电话系统的最基本的描述.我们的手机首先用来打电话的,随后是需要一个电话本,随后是PIM,随后是网络应用,随后是云计算,随后是想我们的手机无所不能,替代PC.但是作为一个电话的基本功能如下: 0)拨叫电话,接听电话,挂断电话,发送短信,网络连接,PIM管理 1)由于电话运营商为我们提供了呼叫等待,电话会议等补充业务,所以我们的手机需要管理多路通话,如何管理? 2)来电时,我们要播出来电铃声,接通时我们需要切换语音通道,这个又

Android核心分析之AMS

ActivityManagerService 简称AMS,是Android内核的核心功能之一,在系统启动SystemServer时启动此服务. android 框架: Activity Manager的组成主要分为以下几个部分: 1.服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信 2.服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化

《Qt on Android核心编程》目录

有朋友想看看<Qt on Android核心编程>的目录,So-- 目录 <Qt on Android核心编程>目录,截了10张图才弄好,都在下面了. 内容说明 本书内容基于第一个正式支持 Qt on Android 的 Qt SDK 版本,5.2.0 ,写作过程中 Qt 5.3.0 发布,我调整了部分内容,对有变化的部分作了对应介绍. 从目录可以看出,<Qt on Android核心编程>是从 Qt 的核心概念--元对象系统--讲起的,涵盖了信号与槽.事件.多线程.网

Android架构分析之Android智能指针(一)

作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:4.4.2 在C++语言中,指针操作是最容易问题的地方,常见的指针操作错误有以下几种: 1.      定义一个指针,但没有对其进行初始化.这种情况下,指针会指向一个随机地址,此时使用该指针,将出现不可预知的错误.一般定义一个指针时,应该同时对该指针进行初始化. 2.      new了一个对象后,忘记delete该对象.这种情况会造成内存泄漏,时间久了,重复多次,可能造成系统宕机. 3.  

Qt on Android 核心编程

Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著   ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 444页 16开 编辑推荐 当Qt跨界牵手Android,移动开发会有什么不同?初学者如何借助Qt开发Android应用?跟随CSDN博文大赛冠军foruok进入Qt on Android无秘之旅! 内容提要 <Qt on Android 核心编程>以"从零开始也能学会Qton Andro

Android Telephony分析(七) ---- 接口扩展(异步转同步)

本文是基于上一篇<Android Telephony分析(六) —- 接口扩展(实践篇)>来写的.上一篇介绍的接口扩展的方法需要实现两部分代码:1. 从APP至RIL,发送请求:2. 从RIL至APP,上报结果. 由于这是一个异步请求,所以两部分流程都不能少,导致流程过于复杂.而本文的目的就是为了将异步请求转换成同步请求,节省第二部分“上报结果”的流程,从而简化整个接口扩展的流程和代码量.(当然,虽然<Android Telephony分析(六) —- 接口扩展(实践篇)>代码流程

Android核心基础第五天

一.学习目标及要求 课程目标 课程内容(必须讲的内容,就是讲课的知识点的顺序) * 掌握Activity 配置 * 掌握 Intent 显示意图 * 掌握 Intent 隐式意图 * 掌握两种意图的使用场景 * 掌握 activity 开启的数据传递 * 掌握activity的生命周期 * 掌握横竖屏切换的生命周期 * 掌握不同android版本 生命周期的细微差别 * 掌握开启activity获取返回值 * 掌握请求码 结果码的作用 * 掌握程序入口activity配置参数 * 掌握显示意图