Android電話機能の各部分について深く検討する
5577 ワード
Android携帯電話のオペレーティングシステムはLinuxプラットフォームに基づくオープンソースシステムです.開発者は、ニーズに応じて修正などの操作を行うことができます.このシステムには多くの重要な機能が研究に値する.例えばAndroid電話機能はその基礎知識の一つです.
第一部Android電話機能の概要
AndroidのRadio Interface Layer(RIL)は、電話サービスとradioハードウェアの間の抽象層を提供しています.
Radio Interface Layer RIL(Radio Interface Layer)は、データの信頼性の高い転送、ATコマンドの送信、responseの解析を担当します.アプリケーションプロセッサは、GPRS機能を有する無線通信モジュールと、ATコマンドセットを介して通信する.
AT commandはHayes社が発明したもので、モデムメーカーが採用したモデムコマンド言語で、各コマンドはアルファベット「AT」で始まる.
JAVA Framework
コードのパスは次のとおりです.
- frameworks/base/telephony/java/android/telephony
- android.telephony android.telephony.gsm
Core native:
hardware/rilディレクトリには、4つのフォルダを含むRILにサポートされるローカルコードが用意されています.
- hardware/ril/include
- hardware/ril/libril
- hardware/ril/reference-ril
- hardware/ril/rild
kernel Driver
Linuxカーネルのドライバでは、UARTやSDIO、USBなどの高速シリアルバスに搭載できるドライバのサポートが提供されています.
第2部Android電話機能各部
hardware/ril/include/telephony/ディレクトリのril.hファイルはril部分のベースヘッダファイルです.
ここで定義する構造体RIL_RadioFunctionsは次のようになります.
- typedef struct {
- int version;
- RIL_RequestFunc onRequest;
- RIL_RadioStateRequest onStateRequest;
- RIL_Supports supports;
- RIL_Cancel onCancel;
- RIL_GetVersion getVersion;
- } RIL_RadioFunctions;
RIL_RadioFunctionsにはいくつかの関数ポインタの構造体が含まれており,これは実際には移植層のインタフェースであり,下層のライブラリが実装された後,rildデーモンプロセスによってこれらの関数ポインタが得られ,対応する関数が実行される.
いくつかの関数ポインタのプロトタイプは次のとおりです.
- typedef void (*RIL_RequestFunc) (int request, void *data,
- size_t datalen, RIL_Token t);
- typedef RIL_RadioState (*RIL_RadioStateRequest)();
- typedef int (*RIL_Supports)(int requestCode);
- typedef void (*RIL_Cancel)(RIL_Token t);
- typedef const char * (*RIL_GetVersion) (void);
最も重要な関数はonRequest()であり、実行を要求する関数です.
2.1 rildデーモン
rildデーモンのファイルはhardware/ril/rildディレクトリに含まれ、rildが含まれています.cとradiooptions.c 2つのファイル、このディレクトリのファイルはコンパイルされた後に実行可能なプログラムを生成して、このプログラムはシステムのインストール経路にあります:
- /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の関数、この関数の実行の結果は1つのRIL_を返しますRadioFunctions構造体のポインタ、ポインタは関数ポインタを指します.このライブラリは、実行中に実際の機能を実行するためにスレッドを作成する必要があります.実行中、このライブラリは/dev/ttySXXXの端末(端末の名前は上位から入力された)を開き、この端末を利用してハードウェア実行を制御します.
2.3 libril.soダイナミックライブラリ
libril.soライブラリのディレクトリは次のとおりです.
- hardware/ril/libril
主なファイルはrilです.cpp、このライブラリで主に実現する必要がある次のインタフェースは次のとおりです.
- RIL_startEventLoop(void);
- void RIL_setcallbacks (const RIL_RadioFunctions *callbacks);
- RIL_register (const RIL_RadioFunctions *callbacks);
- RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
- void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
- size_t datalen);
- RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
- const struct timeval *relativeTime);
これらの関数もrildデーモンプロセスによって呼び出され、異なるvendorは独自の方法でこれらのインタフェースを実現することができ、RILが異なるシステムで移植できることを保証することができる.そのうちRIL_register()関数外部のRIL_RadioFunctions構造体はこのライブラリに登録され,適切なときに対応する関数を呼び出す.Android電話機能の実行中、このライブラリはリクエストを文字列に変換する機能をいくつか処理しました.
http://developer.51cto.com/art/201001/180471.htm