android电话部分之ril分析

可能是我太笨了,总是建立不起一种纵览全局的思考方式,总是一头扎进代码的海洋里,然后在里面迷失不能自拔。就拿ril部分来说,看了几天了,有一些眉目,但是又讲不出来。看到人家的博客里面的总结,或者是流程图,状态图,类图,很是生动,自己在这方面的能力实在贫乏。

 

电话部分ril代码在路径/hardware/ril下

查看代码结构可以发现

./rild/ 主要执行守护进程的代码

./mtk-gsm-ril/ 等类似代码,即对应不同的模组的ril实现

./include/ ril库,定义了标准的ril命令,对应有不同的模组有不同的实现

./libril/ ril的通用函数库

 

1、守护进程的启动

a、读取命令行参数

b、开线程用作事件循环

c、注册回调函数

 

RIL_startEventLoop(void) @ril.cpp

   1、初始化事件源

   2、进入事件循环

   事件循环用select实现,事件列表分三个,timer_list, watch_table, pending_list,不断将wtch_table, timer_list里面的事件移向pending_list里面做添加删除操作,事件源处理有:超时事件(processTimeout @ril_event.cpp),读等待的事件源(processReadReadies() @ril_event.cpp),最后调用回调进行处理(firePending() @ril_event.cpp)

 

两个重要的回调结构

 59 static struct RIL_Env s_rilEnv = {
 60     RIL_onRequestComplete,
 61     RIL_onUnsolicitedResponse,
 62     RIL_requestTimedCallback
 63 };

这三个回调函数在ril.cpp里面实现,是注册到mtk-gsm-ril的,供其调用,注意这个顺序,是模组ril.cpp的,在mian @rild.c里面,有这样一条语句

rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");

dlHandle是通过dlopen打开的动态库,寻找到里面的RIL_init函数进行初始化

先看RIL_onRequestComplete,

在等mtk-gsm-ril/处理完以后,会调用到那里

 

 

另外一个重要的回调结构是

  79 static const RIL_RadioFunctions s_callbacks = {                                   
  80     RIL_VERSION,                                                                  
  81     onRequest,
  82     currentState,                                                                 
  83     onSupports,                                                                   
  84     onCancel,
  85     getVersion                                                                    
  86 };

 

这三个回调函数在mtk-gsm-ril里面实现,是注册到ril.cpp的,供其调用,跟上一个回调结构相反的顺序,而ril.cpp正式我们要打交道的。当接收到上层的命令的时候,经过分发之后,会调用到这里的onRuest。

 

---------------------------待续

 

 

 

 

 

 

 

 

你可能感兴趣的:(android电话部分之ril分析)