Android源代码分析之电话功能 RIL

根据:《Android 源码分析-打电话和发短信》一文(时间:2008-12-24 00:28来源:Android 开发者 作者:wsshy 点击: 2275次)

得知,智能手机的打电话功能是由RIL部分来实现的,见下图:

Linux手机打电话代码分析_第1张图片

开始分析Android源代码中的RIL部分。

又上图,以及其他相关资料,我得知在Android中有一个叫rild的守护进程。我猜测此进程与电话的拨打接听有莫大关系。

而且在Android系统中存在这么一个rild的可执行文件,源代码中的"hardware/ril/rild"目录下有rild.c的文件,且在rild.c中,我们找到了main函数,即我们已经找到了rild守护进程的程序入口啦~

自赞一个先~

开始分析rild守护进程的代码。

在代码开始部分,有一些关于参数解析的片段,暂时先撇开一边,先讲一下rild守护进程的关于RIL的一些重要流程:

main()

{//省略n行

RIL_startEventLoop();

//省略n行

}

从名字上看就应该觉得这应该是一个起点——"startEventLoop"——一个开始进入时间循环的一点,让我们跟踪进去看看^_^

在"rild.c"中有这么一行:extern void RIL_startEventLoop();

说明RIL_startEventLoop函数的代码还在别处,经查找,发现是在这里:

"hardware/ril/libril"目录下的Ril.cpp文件中。

Get it~

在Ril.cpp中的RIL_startEventLoop中有这么一行:

ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);

看来Android是在这里开辟一个线程来执行eventLoop循环,

这个eventLoop函数也在这个文件里(Ril.cpp)。

eventLoop中,主要执行了:
ril_event_init();
ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
processWakeupCallback, NULL);

ril_event_add (&s_wakeupfd_event);

ril_event_loop();

由函数名可猜测:

ril_event_set使用了新建一个ril事件的,

而ril_event_add 将该新事件添加进某执行队列中。

最后,在循环ril_event_loop中进行一个轮询,捕获事件,进而完成事件处理。

经过对ril_event_set和ril_event_add的代码阅读,证实了之前的两点猜测,

(ril_event_set和ril_event_add以及ril_event_loop函数代码在"hardware/ril/libril"目录下的ril_event.cpp中)

新事件加入了一个叫watch_table的数组中。

而ril_event_loop则调用了一个select函数,目前还在分析该函数中~~(猜测是unix类系统的系统调用,暂时先放过)

重新从eventloop的流程开始分析起:
首先,是那个ril_event_init函数。ril_event_init函数在Ril_event.cpp("hardware/ril/libril"),Ril_event.cpp中有一个timer_list的ril_event结构体,这个结构体充当待处理的事件队列(I guest)

而ril_event_init就是在做事件队列的初始化工作(通过init_list(&timer_list),当然还有另外还初始化了pending_list)

然后,就是ril_event_set一个事件结构s_wakeupfd_event

接着,就是ril_event_add该s_wakeupfd_event结构体添加到Ril_event.cpp的watch_table数组中。

最后就是执行ril_event_loop循环了。

请注意,以上步骤中并没有将事件添加到事件队列(timer_list)中的部分,但是ril_event_loop的运作就是要基于timer_list的,那事件队列不是空的吗?怎么会这样呢?

在查看了相关代码之后,发现了有一个叫ril_timer_add的函数执行了addToList函数,即猜测应该是某个函数调用了ril_timer_add?是什么函数呢?通过用Source Insight查找函数的caller,发现了internalRequestTimedCallback函数调用了ril_timer_add。从名字我想起了关键一点:当前流程只是用来“处理”电话事件而已,并不是自己生成一个电话事件啊,电话事件应该是由此流程外的对象生成的(比如有来电了,又如要打电话了),用中断来进行事件队列的事件添加。

到此为止,我们已经确认了rild的主要监听功能就是在ril_event_loop中:

其中在ril_event_loop的for (;;)循环中,我们看到了if (-1 == calcNextTimeout(&tv)),这里就是在尝试处理电话事件啦^_^。

更多相关文章

  1. Android TextView设置自动识别的超链接字体颜色,及自身点击事件无
  2. 巧用布局文件实现Android中实现事件监听机制
  3. 一步步探索学习Android Touch事件分发传递机制(一)
  4. 【Android】ViewPager实现图片左右滑动播放及添加点击事件
  5. Android Touch事件分发响应机制
  6. Android的按钮监听事件&自定义回调函数
  7. android JNI层线程回调Java函数
  8. 硬件访问服务4之Android硬件访问服务框架及系统函数全详细实现
  9. Android 中 OnTouch事件的研究

随机推荐

  1. Android UI控件学习笔记(二)
  2. 添加 C/C++ 代码
  3. android中系统自带样式
  4. Android(安卓)开发学习资料
  5. Android 实例子源代码文件下载地址380个
  6. Android基本控件常用属性及方法
  7. android facebook authorize 时禁止调用f
  8. Android之Android(安卓)Studio JNI
  9. android HTTPURLConnection解决不能访问H
  10. Android Firebase Dynamic Links 动态链