android手機打電話代碼分析

Linux手機打電話代碼分析(Android)數組

Android    2009-03-16 17:02   閱讀705   評論0  
字號:    

Android源代碼分析之電話功能 RILssh

 

根據:《Android 源碼分析-打電話和發短信》一文(時間:2008-12-24 00:28來源:Android 開發者 做者:wsshy 點擊: 2275次)函數

得知,智能手機的打電話功能是由RIL部分來實現的,見下圖:oop

Linux手機打電話代碼分析(Android) - clarkluo2004 - 天翼的博客

 

開始分析Android源代碼中的RIL部分。源碼分析

又上圖,以及其餘相關資料,我得知在Android中有一個叫rild的守護進程。我猜想此進程與電話的撥打接聽有莫大關係。spa

並且在Android系統中存在這麼一個rild的可執行文件,源代碼中的"hardware/ril/rild"目錄下有rild.c的文件 ,且在rild.c中,咱們找到了main函數,即咱們已經找到了rild守護進程的程序入口啦~.net

自贊一個先~線程

開始分析rild守護進程的代碼。3d

在代碼開始部分,有一些關於參數解析的片斷,暫時先撇開一邊,先講一下rild守護進程的關於RIL的一些重要流程:unix

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)),這裏就是在嘗試處理電話事件啦^_^。

相關文章
相關標籤/搜索