對Android源碼分析總結(jié)
在Android中進(jìn)行處理Android源碼中,hardware/ril目錄中包含著Android的telephony源碼,下面就由我向大家介紹這些目錄其中包含了三個(gè)子目錄,下面是對三個(gè)子目錄進(jìn)行具體的分析說明。
一、目錄hardware/ril/include分析:
只有一個(gè)頭文件ril.h包含在此目錄下。ril.h中定義了76個(gè)如下類型的宏:這些宏代表著客戶進(jìn)程可以向Android源碼telephony發(fā)送的命令,包括SIM卡相關(guān)的功能,打電話,發(fā)短信,網(wǎng)絡(luò)信號查詢等。好像沒有操作地址本的功能?
二、目錄hardware/ril/libril分析。本目錄下代碼負(fù)責(zé)與客戶進(jìn)程進(jìn)行交互。在接收客戶進(jìn)程命令后,調(diào)用相應(yīng)函數(shù)進(jìn)行處理,然后將命令響應(yīng)結(jié)果傳回客戶進(jìn)程。在收到來自網(wǎng)絡(luò)端的事件后,也傳給客戶進(jìn)程。
文件ril_commands.h:列出了telephony可以接收的命令;每個(gè)命令對應(yīng)的處理函數(shù);以及命令響應(yīng)的處理函數(shù)。 文件ril_unsol_commands.h:列出了telephony可以接收的事件類型;對每個(gè)事件的處理函數(shù);
以及WAKE Type??? 文件ril_event.h/cpp:處理與事件源(端口,modem等)相關(guān)的功能。ril_event_loop監(jiān)視所有注冊的事件源,當(dāng)某事件源有數(shù)據(jù)到來時(shí),相應(yīng)事件源的回調(diào)函數(shù)被觸發(fā)(firePending -> ev->func())
listenCallback函數(shù):當(dāng)與客戶進(jìn)程連接建立時(shí),此函數(shù)被調(diào)用。此函數(shù)接著調(diào)用processCommandsCallback處理來自客戶進(jìn)程的命令請求processCommandsCallback函數(shù):具體處理來自客戶進(jìn)程的命令請求。
對每一個(gè)命令,ril_commands.h中都規(guī)定了對應(yīng)的命令處理函數(shù)(dispatchXXX),processCommandsCallback會調(diào)用這個(gè)命令處理函數(shù)進(jìn)行處理。dispatch系列函數(shù):此函數(shù)接收來自客戶進(jìn)程的命令己相應(yīng)參數(shù),并調(diào)用onRequest進(jìn)行處理。
RIL_onUnsolicitedResponse函數(shù):將來自網(wǎng)絡(luò)端的事件封裝(通過調(diào)用responseXXX)后傳給客戶進(jìn)程,RIL_onRequestComplete函數(shù):將命令的最終響應(yīng)結(jié)構(gòu)封裝(通過調(diào)用responseXXX)后傳給客戶進(jìn)程。
response系列函數(shù):對每一個(gè)命令,都規(guī)定了一個(gè)對應(yīng)的response函數(shù)來處理命令的最終響應(yīng);對每一個(gè)網(wǎng)絡(luò)端的事件,也規(guī)定了一個(gè)對應(yīng)的 response函數(shù)來處理此事件。response函數(shù)可被onUnsolicitedResponse或者onRequestComplete調(diào)用。
三、目錄hardware/ril/reference-ril分析。本目錄下代碼主要負(fù)責(zé)與modem進(jìn)行交互。 文件reference-ril.c:此文件核心是兩個(gè)函數(shù):onRequest和onUnsolicited 。
onRequest 函數(shù):在這個(gè)函數(shù)里,對每一個(gè)RIL_REQUEST_XXX請求,都轉(zhuǎn)化成相應(yīng)的AT command,發(fā)送給modem,然后睡眠等待。當(dāng)收到此AT command的最終響應(yīng)后,線程被喚醒,將響應(yīng)傳給客戶進(jìn)程(RIL_onRequestComplete -> sendResponse)。
onUnsolicited函數(shù):這個(gè)函數(shù)處理modem從網(wǎng)絡(luò)端收到的各種事件,如網(wǎng)絡(luò)信號變化,撥入的電話,收到短信等。然后將時(shí)間傳給客戶進(jìn)程(RIL_onUnsolicitedResponse -> sendResponse)文件atchannel.c:負(fù)責(zé)向modem讀寫數(shù)據(jù)。其中,寫數(shù)據(jù)(主要是AT command)功能運(yùn)行在主線程中,讀數(shù)據(jù)功能運(yùn)行在一個(gè)單獨(dú)的讀線程中。
Android源碼at_send_command_full_nolock:運(yùn)行在主線程里面。將一個(gè)AT command命令寫入modem后進(jìn)入睡眠狀態(tài)(使用 pthread_cond_wait或類似函數(shù)),直到modem讀線程將其喚醒。喚醒后此函數(shù)獲得了AT command的最終響應(yīng)并返回。
函數(shù)readerLoop運(yùn)行在一個(gè)單獨(dú)的讀線程里面,負(fù)責(zé)從modem中讀取數(shù)據(jù)。讀到的數(shù)據(jù)可分為三種類型:網(wǎng)絡(luò)端傳入的事件;modem對當(dāng)前AT command的部分響應(yīng);modem對當(dāng)前AT command的全部響應(yīng)。對第三種類型的數(shù)據(jù)(AT command的全部響應(yīng)),讀線程喚醒(pthread_cond_signal)睡眠狀態(tài)的主線程。
【編輯推薦】