Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> Android電話功能各部分深入探討

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

編輯:開發入門

 Android手機操作系統是一款基於Linux平台的開源系統。開發人員可以根據不同的需求對其進行修改等操作。在這系統中有很多比較重要的功能值得我們去研究。比如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

  代碼的路徑為:

  frameworks/base/telephony/Java/android/telephony 

  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兩個文件,這個目錄中的文件經過編譯後生成一個可執行程序,這個程序在系統的安裝路徑在:

  /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動態庫的路徑是:

  hardware/ril/reference-ril

  其中android電話功能主要的文件是reference-ril.c和atchannel.c。這個庫必須實現的是一個名稱為RIL_Init的函數,這個函數執行的結果是返回一個RIL_RadioFunctions結構體的指針,指針指向函數指針。

  這個庫在執行的過程中需要創建一個線程來執行實際的功能。在執行的過程中,這個庫將打開一個/dev/ttySXXX的終端(終端的名字是從上層傳入的),然後利用這個終端控制硬件執行。

  2.3 libril.so動態庫

  libril.so庫的目錄是:

  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電話功能執行的過程中,這個庫處理了一些將請求轉換成字符串的功能。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved