目录

基于MTK6737平台/QC8953平台

一、RIL基本架构

1.1、RIL概念

1.2、Android系统架构

1.3、RIL架构

二、RILD进程的加载及启动

2.1、Google原生RILD进程的加载与启动

2.2、MTK平台RILD进程的加载与启动

2.3、QC平台RILD进程的加载与启动

五、QCRIL

5.1、QCRIL简介

5.2、QCRIL基本架构及初始化

5.3、QCRIL处理流程简介


基于MTK6737平台/QC8953平台

一、RIL基本架构

1.1、RIL概念

Android RIL (Radio Interface Layer)提供了Telephony服务和Radio硬件之间的抽象层。RIL负责数据的可靠传输、AT命令的发送以及response的解析。在Android系统中rild运行在AP上的。

一般的,RIL处理应用处理器(AP)与无线通讯模块(基带/BP)通信。通信的方式又分为主动请求的request(诸如拨号、发短信……),以及Modem主动上报的例如信号强度、基站信息、来电、来短信等,称之为unsolicited response。

因此可以将RIL看做是上层AP与底层modem的中间层,用来传递两者之间的交互消息。

1.2、Android系统架构

在介绍RIL基本架构之前,先介绍一下整个Android的结构分层。如图1-1所示:

图1-1 Android结构

从图1-1所示可知,Android系统的结构大致可以分为4层,即Applications(应用层)、 Application Framework(框架层)、Libraries(系统运行库层)和Linux Kernel(内核层)。

  1. 应用层

该层包含所有的应用程序,例如联系人、通话、浏览器等APK。所有的应用程序都是使用Java语言编写的,通过调用应用程序框架层(Application Framework)所提供的API来完成。

  1. 框架层

为开发人员提供了可以完全访问核心应用程序所使用的API框架。

  1. 系统运行库层

Android包含一些C/C++库,这些库能被Android系统中的不同组件使用,它们通过应用程序框架为开发者提供服务。

  1. 内核层

Linux内核,提供安全、内存管理、进程管理、网络栈、驱动等模块。

1.3、RIL架构

理解了android系统的大致分层架构之后,我们来看看RIL的基本架构,如图1-2所示:

图1-2 RIL架构

从上图可知,RIL位于C空间,即android系统空间中的系统运行库层。RIL以RILD的守护进程体现,从系统开机就一直存在于系统中。它主要由如下3部分组成:

  1. Rild

rild模块被编译为一个可执行文件,实现一个main函数作为整个ril模块的入口点。负责加载libril和QcRil/MtkRil,继而使用libril及QcRil/MtkRil提供的功能。

  1. Libril

由Google提供的公共处理库,负责socket的监听,事件处理等。然后将事件处理请求下发给QcRil/MtkRil进行下一步的处理。或者将底层modem的请求响应或者主动上报传递给上层框架层进行处理。因此可以理解为此模块是传递框架层与QcRil/MtkRil之间的消息的。

  1. Qcril/Mtkril

此模块属于各个芯片厂商自己开发的部分,如MTK公司开发的就叫MTK RIL,高通公司开发的就叫QC RIL。里面是各个芯片厂商对上层请求的具体处理逻辑。如MTK会将上层的请求转化为AT命令,通过AT Channel传送给modem处理。而QC RIL则是将上层传下来的请求封装为qmi消息,然后再讲QMI消息下发到modem进行处理。

内核与modem之间则是通过共享内存的方式传递数据。

上述三者之间的关系我们可以用下图1-3做简单的理解:

图1-3 RIL简单架构

二、RILD进程的加载及启动

2.1、Google原生RILD进程的加载与启动

RILD进程是由init进程在系统开机时负责启动的,该进程在系统启动以后就一直存在在系统里面。在Android7.0之前rild的启动时由init进程加载init.rc文件来启动,init.rc文件的路径位于/system/core/rootdir目录下。在Android7.0上init.rc中的许多内容均被移出,移到了各个进程中,例如rild进程,则将它的启动部分移动到了/hardware/ril/rild/目录下的rild.rc文件中。

在/hardware/ril/rild/rild.rc文件中有如下代码:

service ril-daemon /system/bin/rild

class main

socket rild stream 660 root radio

socket sap_uim_socket1 stream 660 bluetooth bluetooth

socket rild-debug stream 660 radio system

user root