本文将简要的介绍android电话系统的架构,rild在电话系统中所处的位置及作用,最后再简单分析QCOM平台中,rild源码的架构。如标题所示,本文主要是对rild的概述,让大家首先了解rild的基本概念。关于rild的具体工作流程,将在以后的章节中详细分析。
如上图所示,电话系统从上到下大致分为分为:phone service,RIL-Java,RILD以及modem。
phone service代表所有上层的应用,包括Dialer,sms,stk,contact等应用;
RIL--Radio Interface Layer,包括RIL Java,守护进程rild,动态链接库libril.so,ril实现库libreference-ril.so。 RIL Java层实质上是一个RIL代理,转接的作用,将phone service所有应用的request通过socket发给rild,再把rild通过socket发过来的response返回给上层应用;
Rild是电话系统的核心部分,是init进程启动的一个守护进程,加载了动态链接库libril.so和ril实现库libreference-ril.so,建立socket监听ril java层发来的request,将其打包成AT命令发送给modem,同时将modem发过来的消息进行解析,然后通过socket发给ril java层。
由于Android开发者使用的Modem是不一样的,不同方案使用的Modem也不一样,GSM和CDMA就差别更大了,所以各种指令格式,初始化序列都不一样,为了消除这些差别,Android将ril做了一个抽象,使用一个虚拟电话的概念。这个虚拟电话对象就是GSMPhone(CDMAPhone),Phone对象所提供的功能协议,以及对下层支撑环境的要求都有一个统一的描述,这个描述的实现就是靠RIL来完成适配,主要是通过Reference-ril.so来实现。总之,Android RIL提供了无线硬件设备与电话服务之间的抽象层。
上图所示为Rild的基本框架图,建立了一个侦听Socket,等待客户端的连接,然后进入Eventloop循环,从该连接上读取RIL-Java成传递来的命令并转化成AT指令通过串口发送到Modem。同时在Readerlooper循环,等待Modem的回应,然后将结果通过socket传回到Ril-Java层。
上图所示为ril-java发送一个电话指令到接收到modem的回应的过程,从图中可看出在AT通讯的过程中有两类响应:一种是请求后给出应答,如上图step4,一种是通知类,即为不请自来的,例如短信通知达到,我们称该类通知为URC。在Rild中URC和一般的Response是分开处理的。
上图是基于Qcom平台的 hardware/ril 目录下包含的rild相关代码。
1、include/telephony
本目录下面的ril.h文件,定义了很多如下类型的宏:RIL_REQUEST_XXXX。这些宏代表客户进程向rild发送的命令,包括SIM卡相关的功能,打电话,发短信,网络信号查询等
2、目录hardware/ril/libril
本目录下代码负责与客户进程进行交互。在接收客户进程命令后,调用相应函数对命令进行处理,再将命令的相应结果传回客户进程。收到网络的通知即URC也传回给客户进程。
3、目录hardware/ril/reference-ril
本目录下的代码主要负责与modem进行交互,将libril传来的命令转为AT命令再发给modem,也负责读取modem发过来的相应。
4、目录hardware/ril/rild
本目录下的代码是rild守护进程,开机时被init进程启动,负责完成ril初始化工作,加载ril动态库*.so。