42

Android モデム コードがどのようにメッセージを呼び出して Android アプリケーション レイヤーに渡すかについての概要を知りたいです。たとえば、SMS を考えてみましょう。ネットワークが SMS とモデムを送信する場合 (Qualcomm C コードがそれを解析するとします)、それはどのように Android アプリケーション層に送信されますか?

JNI 呼び出しは常に発生していますか? モデムと Android 間のインターフェイスとして? 私たちと情報を共有していただけませんか。ありがとう

4

2 に答える 2

78

AOSP / CAF / CMソース(それぞれAndroid Open Source Project、CodeAurora Forum、Cyanogenmod)にあるほとんどすべてのAndroidソースベースには、rild(Radio Interface Layer Daemon)と呼ばれるCコードがあります。これは通常/hardware/ril、ソースツリー内にあります。

このデーモンは、Androidが起動した瞬間から実行され、andというソケットを作成し/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 Hayesモデムコマンドをソケットに書き込みます。Java側では、モデムコマンドを読み取って解釈し、そこからPhoneManagerがブロードキャストCALL_STATE_RINGINGします。ここで、Phoneアプリケーション(ソースにありますpackages/apps/Phone)がレシーバーを登録し、キックスタートします。ユーザーインターフェイス、そしてそれはあなたが電話に応答する方法です。

別の例として、発信を行うと、Androidで番号をダイヤルすると、インテントが作成され、PhoneManagerが作成されます(これがすべてのルートです。ここでは、頭のてっぺんを思い出せませんframeworks/base/core/java。ソースのどこかにあると思います。ツリー)インテントを受け取り、それをAT Hayesモデムコマンドのシーケンスに変換し、ソケットに書き出すと、rildはプロプライエタリライブラリへのコールバックを呼び出し、プロプライエタリライブラリは無線ファームウェアに委任します。

最後の例として、メッセージングpackages/apps/Mmsソースツリーにあります)アプリケーションからテキストメッセージを送信すると、入力したテキストがインテントに押し込まれ、PhoneManagerがインテントを受信し、7ビットGSM文字(IIRC)を使用してテキストをGSMエンコードに変換します。 )、ソケットに書き出され、rildは独自のライブラリへのコールバックを呼び出し、独自のライブラリは無線ファームウェアに委任し、テキストは受話器のドメインを離れ、どこかで電波になります。 。:)Android自体の中でブロードキャストメッセージを送信するとともに、 AndroidManifest.xmlREAD_PHONE_STATEでアクセス許可が使用および指定されている場合。

同様に、逆に、テキストメッセージを受信すると、その逆になり、無線ファームウェアがいくつかのバイトを受信し、プロプライエタリライブラリがrildへのコールバックを呼び出して、そのバイトをソケットに書き込みます。Java側では、Java側から読み取り、バイトシーケンスをデコードし、私たちが知っているようにテキストに変換し、メッセージ受信通知を使用してブロードキャストを開始します。次に、メッセージングアプリケーションは、そのブロードキャストの受信者を登録し、 「+xxxxxxから受信した新しいメッセージ」のようなメッセージを通知バーに送信します。

意図はにありますframeworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java

これがテレフォニーシステムの仕組みの要点であり、本当の美しさは、一般的なAT Hayesモデムコマンドを使用して、実際の独自のメカニズムを簡素化および非表示にすることです。

QualcommやHTCのようなものについては、無線電話層がSoC(System on a Chip)回路内に埋め込まれているため、問題のライブラリをオープンソースにすることはないと考えて忘れてください。

これは、補足として、無線ファームウェアをフラッシュするのが危険である理由でもあります。一部の携帯電話は、それを実行し、間違ったファームウェア(互換性がない、または携帯電話に適していないなど)をフラッシュし、携帯電話に別れを告げて使用する機能を提供します。それはドアストッパーまたは紙の重さとして!:)

関与するJNIメカニズムはゼロであることに注意してください。

。これは、それが正確にどのように機能するかをここで推測しています。:)

于 2012-06-20T02:13:03.780 に答える