1、RILC主要代码目录结构
Android 4.0.3 源码中,RILC目录结构如下:
按模块分别编译libril、reference-ril和rild这3个目录,可得到libril.so、libreference-ril.so和rild文件
2、解析RILC运行机制
RILC运行在User Libraries系统运行库层中的HAL子层,使用HAL Stub的运行结构:
Runtime对外提供Proxy代理接口;
Stub向Runtime提供Operations操作函数;
Runtime向Stub提供Callback函数;
a、LibRIL与Reference-RIL基于Stub运行机制,LibRIL为Runtime运行环境,而Reference-RIL实现了RIL请求转换成AT命令;
b、LibRIL提供Reference-RIL的Proxy代理接口,因此LibRIL与RILJ基于Socket的交互,最终交给Reference-RIL进行处理;
c、 Reference-RIL与Modem之间通过串口进行通信;
2.1、RILC启动过程
加载入口;
加载方法;
2.1.1、寻找RILC的加载入口
开机过程中,kernel运行rild可执行文件加载和启动LibRIL;在$workdir/system/core/rootdir/init.rc配置文件中进行说明:
Android启动会同时启动rild的后台服务ril-daemon,如果异常退出,会重新加载;
建立两个Socket连接,端口号分别是:rild 和 rild-debug;
启动ril-daemon系统Service服务的用户为radio;
2.1.2、解析RILC的加载方法
$workdir/hardware/ril/rild/rild.c程序文件的main函数:
调用RIL_startEventLoop函数,LibRIL开启循环监听Socket连接,即可开始接收RILJ发起的Socket连接请求和RIL Solicited消息请求;
调用RIL_Init函数,首先通过dlsym获取指向reference-ril.so动态链接库中RIL_Init函数的指针;其次调用reference-ril.so中RIL_Init函数,完成RIL_Stub初始化,即reference-ril.so动态连接库;
调用RIL_register,提供其Function给LibRIL调用;
2.2、RILC运行过程
RILC启动完成后,LibRIL具有Reference-RIL返回的指向RIL_RadioFunctions类型的funcs结构体指针,而Reference-RIL具有LibRIL的RIL_Env类型s_rilEnv结构体指针;
下行消息:
LibRIL接收到RILJ发起的Solicited消息,LibRIL使用funcs调用Reference-RIL的onRequest、onStateRequest等方法;
上行消息:
Modem相关通信状态变化或者指向完Solicited请求消息后,Reference-RIL通过s_rilEnv结构体指针调用LibRIL的OnRequestComplete、OnUnsolicitedResponse等方法;
3、初识RILC中的运行环境LibRIL
3.1、LibRIL主要文件及作用
LibRIL代码路径$workdir/hardware/ril/libril;
ril.cpp:负责建立Runtime运行环境框架
ril_commands.h和 ril_unsol_commands.h:ril_commands.h定义LibRIL接收到RILJ发出的Solicited请求消息所对应的调用函数和返回调用函数;ril_unsol_commands.h定义UnSolicited消息返回调用的函数;
ril_event.h和ril_event.cpp:ril_event事件的结构定义以及基于ril_event双向链表的操作函数;
LibRIL运行环境作用:
与RILJ基于Socket的交互;
与Reference-RIL基于函数调用的交互;
3.2、重点结构体说明
RIL_Env结构体
RIL_RadioFunctions结构体:
version 标志Reference-RIL版本号;
LibRIL在接收到RILJ发起的Solicited请求消息后,其他5个指向函数的指针会调用Reference-RIL提供的funcs中对应请求函数;
4、LibRIL运行环境加载过程
4.1、开启ril_event事件监听入口RIL_startEventLoop
RIL_startEventLoop函数创建基于eventLoop函数调用的子线程;
eventLoop函数:
修改s_started启动状态;
创建并激活s_wakeupfd_event的事件处理
调用ril_event.cpp中ril_event_loop
4.1、RIL_register函数引入三方RIL_RadioFunctions
5、运行状态中ril_event事件处理机制
5.1、认识ril_event结构体
5.2、RIL事件生命周期控制的处理函数
5.3、ril_event_loop处理机制
6、详解LibRIL运行机制
6.1、RILJ与LibRIL建立Socket连接过程
6.2、Solicited消息的交互流程和处理机制