RILC系统结构及LibRIL运行机制

来源:互联网 发布:算法第四版中文电子书 编辑:程序博客网 时间:2024/06/03 16:40

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消息的交互流程和处理机制

0 0
原创粉丝点击