我想知道 Android Modem 代码如何调用/传递消息到 Android 应用层的高级概念。假设我们以短信为例。如果网络发送短信和调制解调器(比如高通 C 代码解析它)它是如何传输到 Android 应用层的?
是否总是发生 JNI 调用?作为调制解调器和Android之间的接口?能否请您与我们分享信息。谢谢
我想知道 Android Modem 代码如何调用/传递消息到 Android 应用层的高级概念。假设我们以短信为例。如果网络发送短信和调制解调器(比如高通 C 代码解析它)它是如何传输到 Android 应用层的?
是否总是发生 JNI 调用?作为调制解调器和Android之间的接口?能否请您与我们分享信息。谢谢
在 AOSP/CAF/CM 源代码(分别为 Android 开源项目、CodeAurora 论坛、Cyanogenmod)中找到的几乎所有 android 源代码库中,都会有称为rild的 C 代码(无线电接口层守护程序)。这通常在/hardware/ril
源代码树中找到。
这个守护进程从 Android 启动的那一刻开始运行,并创建一个名为/dev/socket/rild
and的套接字/dev/socket/rild-debug
。将有一个来自高通、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上拨打一个号码,intent被创建,然后是PhoneManager(这是它的根源,在这里,不记得我的头顶,认为它在frameworks/base/core/java
源的某个地方tree) 接收意图,将其转换为 AT Hayes 调制解调器命令序列,将其写入套接字,然后rild调用专有库的回调,专有库依次委托给无线电固件。
最后一个示例,从Messaging(在packages/apps/Mms
源代码树中找到)应用程序发送文本消息,您键入的文本被推送到一个意图中,PhoneManager接收该意图,使用 7 位 GSM 字母(IIRC)将文本转换为 GSM 编码),被写入套接字,rild反过来调用专有库的回调,专有库又委托给无线电固件,文本现在已经离开手机的域并在某处的电波中。 . :) 除了在 Android 内部发送广播消息外,只要在AndroidManifest.xmlREAD_PHONE_STATE
中使用并指定了权限。
同样相反,当接收到文本消息时,情况正好相反,无线电固件接收到一些字节,专有库调用rild的回调,从而将字节写入套接字。在 Java 端,它读取它,解码字节序列,将其转换为我们所知道的文本,触发带有消息接收通知的广播。Messaging应用程序依次为所述广播注册接收者,并向通知栏发送一个意图,如“收到来自 +xxxxxx 的新消息”
意图在frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java
这就是电话系统如何工作的要点,真正的美在于它使用通用的 AT Hayes 调制解调器命令,从而简化和隐藏了真正的专有机制。
至于高通、HTC 之类的公司,因为无线电话层嵌入在 SoC(片上系统)电路中,所以他们认为他们曾经开源过有问题的库,所以忘记了它!
这也是,作为旁注,为什么刷无线电固件有风险,一些手机提供了这样做的能力,刷错误的固件(例如不兼容或不适合手机),与手机告别并使用作为门挡或镇纸!:)
应该注意的是,涉及的 JNI 机制为零。
. 我在这里猜测它是如何工作的。:)
继续 t0mm13b 的解释,当我们谈论智能手机时,想想 SMS/Calls 的 3 层操作。
RIL(用户级别)<-> AP <-> CP
AP:应用处理器(运行您的 Android 操作系统的地方。想想在此处理器上运行的游戏、歌曲、视频、相机等)
CP:蜂窝处理器(实际上处理传入/传出呼叫/短信的空中接口,与网络塔等交互..)
现在假设在 CP 端接收到一些数据(可能是互联网数据/短信/通话)。现在AP和CP之间有一定的逻辑信道。所以CP会根据数据类型将接收到的数据推送到相应的通道。该数据将由 AP 接收。AP 会将这些数据发送回 RIL/App。RIL 将解码这些数据(特别是通话/短信数据)。基于此,向用户提供有关 SMS/Call 的通知。