目录
基于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(内核层)。
- 应用层
该层包含所有的应用程序,例如联系人、通话、浏览器等APK。所有的应用程序都是使用Java语言编写的,通过调用应用程序框架层(Application Framework)所提供的API来完成。
- 框架层
为开发人员提供了可以完全访问核心应用程序所使用的API框架。
- 系统运行库层
Android包含一些C/C++库,这些库能被Android系统中的不同组件使用,它们通过应用程序框架为开发者提供服务。
- 内核层
Linux内核,提供安全、内存管理、进程管理、网络栈、驱动等模块。
1.3、RIL架构
理解了android系统的大致分层架构之后,我们来看看RIL的基本架构,如图1-2所示:
图1-2 RIL架构
从上图可知,RIL位于C空间,即android系统空间中的系统运行库层。RIL以RILD的守护进程体现,从系统开机就一直存在于系统中。它主要由如下3部分组成:
- Rild
rild模块被编译为一个可执行文件,实现一个main函数作为整个ril模块的入口点。负责加载libril和QcRil/MtkRil,继而使用libril及QcRil/MtkRil提供的功能。
- Libril
由Google提供的公共处理库,负责socket的监听,事件处理等。然后将事件处理请求下发给QcRil/MtkRil进行下一步的处理。或者将底层modem的请求响应或者主动上报传递给上层框架层进行处理。因此可以理解为此模块是传递框架层与QcRil/MtkRil之间的消息的。
- 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