2012-06-19 18 views
34

AndroidモデムコードがAndroidアプリケーションレイヤにメッセージをどのように呼び出し/渡すかについての高レベルのアイデアを知りたいと思います。たとえば、SMSを取るとします。ネットワークがSMSとモデムを送信すると(クアルコムのCコードがそれを解析すると)、それがAndroidアプリケーション層にどのように送信されますか?モデムコードとAndroidコードとの通信方法

いつもJNIコールが起きていますか?モデムとAndroidの間のインターフェイスとして?あなたは私たちと情報を共有していただけますか? Cコードを持っていますAOSP/CAF/CMソース(Androidのオープンソースプロジェクト、CodeAuroraフォーラム、Cyanogenmodそれぞれ)、に見られるような、ほぼすべてのAndroidのソースベースのおかげで

答えて

68

呼ばrild、(無線インタフェースレイヤデーモン) 。これはソースツリーの/hardware/rilによく見られます。

このデーモンは、Androidが起動する瞬間から実行され、/dev/socket/rild/dev/socket/rild-debugというソケットを作成します。ブート時に実行時に動的にロードされるQualcomm、HTCからの独自のライブラリがあります。独自のライブラリが、順番に無線ファームウェアと通信します。そしてrildの独自のライブラリへのコールバック用のフックがそこに確立されます。

rild層は、前述のソケットを介して、Androidのレイヤー(ソースツリーのframeworks/base/telephony/com/android/internal/telephony/RIL.java)がどのように通信するかを示します。

Java側では、読み取り/書き込み用のソケットを開き、インテントの確立とこのソケット経由のイベントのブロードキャスト/受信の代理人の設定を行います。

例えば、プロプライエタリライブラリである着信呼び出しは、rildで設定されたコールバックフックを呼び出します。 rildソケットにヘイズモデムのATコマンドの標準的な一般的な書き込み、Java側で、それはモデムコマンドを読み取り、解釈し、そこから、ソースで見つかった中電話アプリケーション(PhoneManager放送CALL_STATE_RINGINGpackages/apps/Phone)が受信者を登録し、ユーザーインターフェイスをキックスタートさせ、これが通話に応答する方法です。

別の例として、発信コールを作り、あなたがAndroid上で番号をダイヤルし、意図は、作成されると、今度はPhoneManagerこれはのトップを覚えていないことができ、ここで、それをすべてのルートです私の頭は、ソースツリーのどこかでframeworks/base/core/javaと考えています)、意図を受け取り、それをAT Hayesモデムコマンドのシーケンスに変換し、ソケットに書き出します。rildは、独自のライブラリへのコールバックを呼び出します。独自のライブラリが順番に無線ファームウェアに委任されます。 packages/apps/Mmsソースツリーで見つかった)メッセージングアプリケーションから、あなたが入力したテキストは、意図に追いやらます

最後の例は、テキストメッセージを送信し、PhoneManagerが意図を受け、GSM-にテキストを変換し、 7ビットのGSM文字(IIRC)を使用してエンコードされ、ソケットに書き出され、メールアドレスが独自のライブラリへのコールバックを呼び出し、独自のライブラリが無線ファームウェアに委譲し、テキストがドメインを去った携帯電話のどこかで放送波に...:)アンドロイド自体の中にブロードキャストメッセージを送信すると共に、READ_PHONE_STATE許可が使用され、のAndroidManifest.xmlに指定されていることを条件とします。

逆に、テキストメッセージを受信すると、それは逆になり、無線ファームウェアはいくつかのバイトを受信し、専用ライブラリはrildへのコールバックを呼び出し、バイトをソケットに書き出します。 Java側では、それから読み込み、バイトシーケンスをデコードし、わかっているようにテキストに変換し、メッセージ受信通知でブロードキャストを開始します。 メッセージングアプリケーションは、順番に、と述べた放送用受信機を登録している、とのようなもの

の意図が発見された中frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java

新しいメッセージが+ xxxxxxのから受け取った」と言って通知バーへの意図を送信しますテレフォニーシステムがどのように動作するかの要旨である

は、本当の美しさは、それは以下のようなものを現実の独自のメカニズムを簡素化し、隠しヘイズモデムのATコマンドの一般的な使用していること、です。

クアルコム、HTCのように、無線電話レイヤーがS-o-C(System on a Chip)回路に組み込まれているので、問題のライブラリをオープンソース化していると思っているのを忘れてください!

また、無線ファームウェアをフラッシュする危険性があり、一部の端末がそれを行う機能を提供しているか、間違ったファームウェアをフラッシュする(互換性がない、または端末に適していないなど)さあ、それをドアストッパーや紙重量として使ってください! :)

関与ゼロJNIメカニズムが存在することに留意すべきです。

これは私の理解できるところです。これは、ラジオファームウェアがLinuxカーネルがアドレス空間を予約していたどこかのメモリアドレスにロードされています。 DOSが起動、BIOSが使用する予約済みアドレスがあった古いPCの時代に、私が思うに、ここにその類似したが、予約済みとしてマークされたアドレスはファームウェアによって占有されている、で独自のラジオライブラリ会談それに - それ以来、ライブラリは、カーネルが所有するアドレス空間、root権限でrootが所有ロサンゼルスで実行されている、それはあなたがのぞくの古いBASIC方言を使って考えると突くならば、私はあなたがいないだろうと思うだろう、そこに「話」ことができますそのアドレスにある一連のバイトを書き込むことによって、無線ファームウェアがその上で動作し、割り込みベクタテーブルを持つようになります。これはここでどのように推測されていますか正確に動作します。 :)

+0

Osmocom OpenBSCの 'rild'を入れ替えると、開いている電話がありますか? –

+0

@JanusTroelsenそれは、携帯電話内のラジオのファームウェアチップセットに応じて疑わしいだろうし、独自のライブラリがそれを処理するために必要とされるより多くの特徴を有するかもしれない。 – t0mm13b

+0

JNIを使​​用せずに作成されたリールレイヤーへのフックはどのようにしていますか? – gonzobrains

0

たちはスマートフォンについて語るとき、t0mm13bでの説明に引き続き、SMS /通話に3層オペレーションづきを考えます。

RIL(ユーザー・レベル)< - > AP < - > CP

AP:アプリケーション・プロセッサ(。あなたのAndroid OSを実行このプロセッサ上で実行されているゲーム、曲、ビデオ、カメラなどを考える)

CP:携帯電話プロセッサ(着信/発信通話/ SMSのためのエアインターフェイスを実際に扱い、ネットワークタワーなどとのやりとりなど)

ここで、CP側でデータが受信されたとしますSMS /コール)。現在、APとCPの間に特定の論理チャネルが存在します。したがって、CPは、データのタイプに基づいて、受信したデータを対応するチャネルにプッシュします。このデータはAPによって受信されます。 APはこのデータをRIL/Appに送り返します。 RILはこのデータをデコードします(特にcall/smsデータ)。それに基づいてSMS /コールについてユーザーに通知します。

関連する問題