zoukankan      html  css  js  c++  java
  • android手机打电话代码分析

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

    Linux手机打电话代码分析(Android) - clarkluo2004 - 天翼的博客

    开始分析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 illibril"目录下的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 illibril"目录下的ril_event.cpp中)

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

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

    重新从eventloop的流程开始分析起:

    首先,是那个ril_event_init函数。ril_event_init函数在 Ril_event.cpp("hardware illibril"),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)),这里就是在尝试处理电话事件

  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3994753.html
Copyright © 2011-2022 走看看