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消息的交互流程和处理机制
- RILC系统结构及LibRIL运行机制
- [Android6.0] RILC 系统结构及 LibRIL 运行机制
- LibRIL 运行机制
- 托管模块结构及运行机制
- PHP CI框架目录结构及运行机制
- PHP CI框架目录结构及运行机制
- CI框架目录结构及运行机制
- PHP CI框架目录结构及运行机制
- [转载]Android系统运行机制
- JQuery运行机制及原理
- android 架构及运行机制
- Spark架构及运行机制
- Java运行机制及JVM
- JVM运行机制及原理
- android 架构及运行机制
- ssh原理及运行机制
- jvm及运行机制
- android 架构及运行机制
- Android中图片资源格式的转换
- CodeForces - 617B Chocolate (规律)
- 关于socket buffer size的调优
- java中的局部变量与成员变量
- 挑7
- RILC系统结构及LibRIL运行机制
- Exception 和 error
- 关于LINUX网络编程中的IO 操作
- 用栈实现将十进制数转换为任意进制数(2,8,16...).
- linux shell的运行(有意思)
- 为什么写博客?
- java笔记--设计模式之模版方法模式
- 【java基础】集合类及其数据结构回忆总结
- 最大子序列和问题