QMI Ril和Android
Android Ril
Android 的RIL部分主要分为RILJ和RILC两部分,其中RILJ运行在framework->telephony 的java部分,RILC运行在HAL层的native部分。在android1.0--7.0时代,RIL层架构如下图所示:
RILJ与RILC间的交互是基于本地Socket的方式,RILJ与RILC间通过rild端口的Socket连接进行消息的交互和处理;RILC与Modem间通过qemud的Socket端口完成AT命令的发送和执行,完成Modem的操作控制和查询请求以及Modem主动上报的消息处理。
到了Android 8.0+时代,google引入了HIDL,用于取代framework与HAL层之间的socket通讯方式,于是在android 8.0+时代RIL层架构如下图所示:
使用HIDL的原因大概有以下几点:
1、通讯效率提升,特别是对内存的使用。
2、进一步解耦android和modem厂商的版本兼容性问题。
3、编程接口更友好,和binder调用很类似。
QMI RIL
我们知道手机是多核架构,主核 application processor 运行android操作系统,modem processor 负责射频和协议部分,还有其他一些soc负责专门的音频、射频、显示的处理。
RIL架构是为了实现通话,因此归根到底需要和modem通讯,modem厂商有高通、mtk、海思、展讯等。不同的modem在接口、内部机制等方面都有不同,app processor部分都用android原生的那一套,但在RILC和modem通讯部分就存在厂商差异了。QMI就是高通设计的app processor与RILC通讯的机制。QMI框架包括client部分和server部分,其中QMI client运行在app processor,由rild 采用dlopen方式打开;QMI server运行在modem processor;client和server之间使用socket方式通讯。如下图: