2019独角兽企业重金招聘Python工程师标准>>> 
一、概述
关于RILD的功能,就不多说了,对上服务于Phone进程,也可以认为是RILJ层,向下同modem层进行通信,对MTK平台来说就是使用AT命令了。
二、RILD的架构
RILD主要由三部分组成,一个是rild.c,第二个是libril这个库(对于MTK来说就是librilmtk),第三个是厂商关于实现同modem进行通信的reference-ril库,对于MTK来说就是mtk-ril。出于保护第三方厂商利益的考虑,这个库是在rild运行的时候动态加载进去的,由于运行在同一个进程中,所以rild同reference-ril之间的通信是函数调用,所以两者之间定义了用于通信的包含函数指针的结构体。
typedef struct {int version; /* set to RIL_VERSION */RIL_RequestFunc onRequest;RIL_RadioStateRequest onStateRequest;RIL_Supports supports;RIL_Cancel onCancel;RIL_GetVersion getVersion;RIL_ReportUsbDisconn reportUsbDisconn;RIL_ReportSocketConn reportRILDConn;
} RIL_RadioFunctions; static struct RIL_Env s_rilEnv = {RIL_onRequestComplete,RIL_onUnsolicitedResponse,RIL_requestTimedCallback// For multi channel support,RIL_requestProxyTimedCallback,RIL_queryMyChannelId,RIL_queryMyProxyIdByThread
};
首先介绍下如何RILJ层下来的请求消息是如何调用到第三方库的,流程如下,对于回调很明显第三方库提供具体实现,而libril提供函数指针,这有点类似于面向对象的多态。
rild.c
RIL_register(funcs);//funnc 指向具体的实现,通过注册使得libril中的指针指向实现 ril.cpp
RIL_register (const RIL_RadioFunctions *callbacks) {...memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));//将callbacks赋值给全局变量s_callbacks #define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d), (e))
#define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest(a) static void
dispatchSIM_IO (Parcel &p, RequestInfo *pRI) {union RIL_SIM_IO {RIL_SIM_IO_v6 v6;RIL_SIM_IO_v5 v5;} simIO;int32_t t;int si



![[Android6.0][MTK6737] 启动流程分析](http://ww1.sinaimg.cn/large/ba061518ly1fo22fxyx8mj20gl03ogll.jpg)








