Android電話功能各部分深入探討

來源:互聯網
上載者:User

Android手機作業系統是一款基於Linux平台的開源系統。開發人員可以根據不同的需求對其進行修改等操作。在這系統中有很多比較重要的功能值得我們去研究。比如Android電話功能就是其中一個基礎知識點。

  • Android繪圖具體應用方式總結
  • Android Activity生命週期具體內容概述
  • Android開發要點經驗總結
  • Android構建模組詳細步驟概述
  • Android檔案系統深入剖析

第一部分 Android電話功能概述

Android的Radio Interface Layer (RIL)提供了電話語音和的radio硬體之間的抽象層。

Radio Interface Layer RIL(Radio Interface Layer)負責資料的可靠傳輸、AT命令的發送以及response的解析。應用處理器通過AT命令集與帶GPRS功能的無線通訊模組通訊。

AT command由Hayes公司發明,是一個數據機製造商採用的一個數據機命令語言,每條命令以字母"AT"開頭。

JAVA Framework

代碼的路徑為:

 
  1. frameworks/base/telephony/java/android/telephony  
  2. android.telephony以及android.telephony.gsm 

Core native:

在hardware/ril目錄中,提供了對RIL支援的本地代碼,包括4個檔案夾:

 
  1. hardware/ril/include   
  2. hardware/ril/libril   
  3. hardware/ril/reference-ril   
  4. hardware/ril/rild 

kernel Driver

在Linux核心的驅動中,提供了相關的驅動程式的支援,可以建立在UART或者SDIO,USB等高速的串列匯流排上。

第二部分 Android電話功能各個部分

hardware/ril/include/telephony/目錄中的ril.h檔案是ril部分的基礎標頭檔。

其中定義的結構體RIL_RadioFunctions如下所示:

 
  1. typedef struct {  
  2. int version;  
  3. RIL_RequestFunc onRequest;  
  4. RIL_RadioStateRequest onStateRequest;  
  5. RIL_Supports supports;  
  6. RIL_Cancel onCancel;  
  7. RIL_GetVersion getVersion;  
  8. } RIL_RadioFunctions; 

RIL_RadioFunctions中包含了幾個函數指標的結構體,這實際上是一個移植層的介面,下層的庫實現後,由rild守護進程得到這些函數指標,執行對應的函數。

幾個函數指標的原型為:

 
  1. typedef void (*RIL_RequestFunc) (int request, void *data,   
  2. size_t datalen, RIL_Token t);  
  3. typedef RIL_RadioState (*RIL_RadioStateRequest)();  
  4. typedef int (*RIL_Supports)(int requestCode);  
  5. typedef void (*RIL_Cancel)(RIL_Token t);  
  6. typedef const char * (*RIL_GetVersion) (void); 

其中最為重要的函數是onRequest(),它是一個請求執行的函數。

2.1 rild守護進程

rild 守護進程的檔案包含在hardware/ril/rild目錄中,其中包含了rild.c和radiooptions.c兩個檔案,這個目錄中的檔案經過編譯後產生一個可執行程式,這個程式在系統的安裝路徑在:

 
  1. /system/bin/rild 

rild.c是這個守護進程的入口,它具有一個主函數的入口main,執行的過程是將請求轉換成AT命令的字串,給下層的硬體執行。在運行過程中,使用dlopen 開啟路徑為/system/lib/中名稱為libreference-ril.so的動態庫,然後從中取出 RIL_Init符號來運行。

RIL_Init符號是一個函數指標,執行這個函數後,返回的是一個RIL_RadioFunctions類型的指標。得到這個指標後,調用RIL_register()函數,將這個指標註冊到libril庫之中,然後進入迴圈。
事實上,這個守護進程提供了一個申請處理的架構,而具體的功能都是在libril.so和libreference-ril.so中完成的。

2.2 libreference-ril.so動態庫

libreference-ril.so動態庫的路徑是:

 
  1. hardware/ril/reference-ril  

其中Android電話功能主要的檔案是reference-ril.c和atchannel.c。這個庫必須實現的是一個名稱為RIL_Init的函數,這個函數執行的結果是返回一個RIL_RadioFunctions結構體的指標,指標指向函數指標。
這個庫在執行的過程中需要建立一個線程來執行實際的功能。在執行的過程中,這個庫將開啟一個/dev/ttySXXX的終端終端的名字是從上層傳入的),然後利用這個終端控制硬體執行。

2.3 libril.so動態庫

libril.so庫的目錄是:

 
  1. hardware/ril/libril  

其中主要的檔案為ril.cpp,這個庫主要需要實現的以下幾個介面為:

 
  1. RIL_startEventLoop(void);  
  2. void RIL_setcallbacks (const RIL_RadioFunctions *callbacks);  
  3. RIL_register (const RIL_RadioFunctions *callbacks);  
  4. RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, 
    size_t responselen);  
  5. void RIL_onUnsolicitedResponse(int unsolResponse, void *data,   
  6. size_t datalen);  
  7. RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,   
  8. const struct timeval *relativeTime); 

這些函數也是被rild守護進程調用的,不同的vendor可以通過自己的方式實現這幾個介面,這樣可以保證RIL可以在不同系統的移植。其中 RIL_register()函數把外部的RIL_RadioFunctions結構體註冊到這個庫之中,在恰當的時候調用相應的函數。在Android電話功能執行的過程中,這個庫處理了一些將請求轉換成字串的功能。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.