android手机打电话代码分析
智能手机的打电话功能是由RIL部分来实现的,见下图:
开始分析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)),这里就是在尝试处理电话事件
android手机打电话代码分析的更多相关文章
- 【Java&Android开源库代码分析】のandroid-async-http の开盘
在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...
- android recover 系统代码分析 -- 选择进入
最近做Recovery的规范及操作指导文档,花了一些时间将流程搞清. Android利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级.而在进入Recover ...
- android recovery 系统代码分析 -- 选择进入【转】
本文转载自:http://blog.csdn.net/andyhuabing/article/details/9226569 最近做Recovery的规范及操作指导文档,花了一些时间将流程搞清. An ...
- [Android]Android焦点流程代码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7286503.html 通过View的View::focusSe ...
- android的GPS代码分析JNI如何HAL之间如何设置回调函数【转】
本文转载自:http://blog.csdn.net/kmesg/article/details/6531577 本文只关注JNI和HAL的接口部分 在jni的android_location_Gps ...
- Android手机一键Root原理分析
图/文 非虫 一直以来,刷机与Root是Android手机爱好者最热衷的事情.即使国行手机的用户也不惜冒着失去保修的风险对Root手机乐此不疲.就在前天晚上,一年一度的Google I/O大会拉开了帷 ...
- Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)
结果: 1.不提示发短信卡住,点击没有反映,我猜想,可能是因为我用的是小米手机吧. 2.接收短信报错,我猜想可能是我改了里面的方法吧(哪位大神了解,求指教). 3.project -->opti ...
- 手机自动化测试:Appium源码分析之跟踪代码分析八
手机自动化测试:Appium源码分析之跟踪代码分析八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析五
手机自动化测试:Appium源码分析之跟踪代码分析五 手机自动化测试是未来很重要的测试技术,作为一名测试人员应该熟练掌握,POPTEST举行手机自动化测试的课程,希望可以训练出优秀的手机测试开发工 ...
随机推荐
- DIV背景半透明文字不半透明的样式
DIV背景半透明,DIV中的字不半透明 代码如下:<body bgcolor="#336699"> <div style="filter:alpha(o ...
- ios开发APP必须要了解的基本配置
1,配置开发版本 AdHoc开发版,AppStore正式版 2,oc的宏转swift //常量=>ObjectC宏 letLoadingTip="加载中..." letiOS ...
- Error when running Swift3 in REPL
Traceback (most recent call last): File "", line 1, in NameError: name 'run_one_line' is n ...
- geeksforgeeks@ Find sum of different corresponding bits for all pairs (Bit manipulation)
http://www.practice.geeksforgeeks.org/problem-page.php?pid=387 Find sum of different corresponding b ...
- 理解OAuth 2.0 -摘自网络
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OA ...
- cocos2d-js取不到cocostudio里面控件问题
var winSize = cc.director.getWinSize(); //add main node var mainNode = cc.Node.create(); ; mainNode. ...
- Node-APN 开源推送服务
Node-APN是一个开放的结合了苹果推送通知的Node.js模块,该源码模块使用简单,反馈服务支持.错误处理,在发送出错时自动重发.遵从苹果的最佳实践. Node-APN(github)
- Fast-paced Multiplayer
http://www.gabrielgambetta.com/fpm1.html —————————————————————————————————————————————————————— Fast ...
- tomcat的 JNDI 配置
tomcat的conf/server.xml 配置 尽量用简单版 <Context path="/cas" docBase="D:\YC\zqV7\cas\WebR ...
- ProxyFactory的一个问题
今天写了一段很简单的代码,但一直都有问题.代码如下. 接口定义 using System; using System.Collections.Generic; using System.Linq; u ...