Dav*_*run 40 modem android android-source ril
我想知道Android Modem代码如何调用/传递消息到Android应用程序层的高级概念.假设我们以SMS为例.如果网络发送短信和调制解调器(比如说Qualcomm C代码解析它),它是如何传输到Android应用层的?
是否总会发生JNI通话?作为调制解调器和Android之间的接口 您能否与我们分享信息?谢谢
t0m*_*13b 72
在AOSP/CAF/CM源(Android开源项目,CodeAurora论坛,分别为Cyanogenmod)中发现的几乎所有android源码库中,都会有C代码称为rild,(Radio Interface Layer Daemon).这通常在/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写入标准通用海耶斯调制解调器命令到插座,在Java端,它读取并解释调制解调器命令,并从那里,PhoneManager广播CALL_STATE_RINGING
,在手机应用程序(在源中找到packages/apps/Phone
)已注册的接收器和的kickstart用户界面,这就是你接听电话的方式.
另一个例子,拨打电话,你拨打Android上的号码,创建意图,然后又创建了PhoneManager(这是它的全部根源,在这里,不记得我的头脑,想想它在frameworks/base/core/java
源头的某个地方树)接收的意图,将其转换成无论是海耶斯调制解调器命令序列,把它写出来的插座,在RILD然后调用回调到专利文献,又委托给无线电固件私有软件库.
最后一个示例,从Messaging(在packages/apps/Mms
源代码树中找到)应用程序发送文本消息,您输入的文本被推入意图,PhoneManager接收意图,使用7位GSM字母将文本转换为GSM编码(IIRC) ),写入套接字,rild反过来调用专有库的回调,专有库依次委托给无线电固件,文本现已离开手机的域,并在某处的电视广播中. .:)在Android本身内发送广播消息,只要READ_PHONE_STATE
在AndroidManifest.xml中使用并指定了权限.
同样相反,当接收文本消息时,相反,无线电固件接收一些字节,专有库调用对rild的回调,从而将字节写出到套接字.在Java端,它从中读取,并解码字节序列,将其转换为我们所知的文本,通过消息接收通知触发广播.该消息的应用反过来又注册了该广播接收机,并发送一个意向通知栏说"有点像从+ XXXXXX收到的新邮件 "
意图发现于 frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java
这就是电话系统如何工作的要点,真正的美妙之处在于,它使用通用的AT Hayes调制解调器命令,从而简化和隐藏真正的专有机制.
对于像高通这样的高通公司来说,忘了它,因为无线电话层是嵌入在SoC(片上系统)电路中的,所以他们认为他们曾经开源过这个库!
另外,作为旁注,为什么闪存无线电固件有风险,有些手机提供了执行此功能的能力,闪存错误的固件(例如不兼容或不适合手机),亲吻手机再见并使用作为门挡或纸张重量!:)
应该指出的是,涉及零JNI机制.
这是从我的它是如何工作的,从我可以告诉的就是这个,无线电固件加载到内存地址在什么地方了Linux内核保留的地址空间,并没有触及它,有点像回到了旧电脑的认识天,当DOS启动时,有保留通过BIOS使用的地址,我认为,其此类似,标记为保留通过固件,被占用的地址,其中的专属无线电库会谈,以它 - 因为库运行内核所拥有的地址空间,root拥有root权限,它可以与它"交谈",如果你想使用偷看和戳戳的旧BASIC方言,我猜你不会远离它标记在那里,通过向该地址写入一定的字节序列,无线电固件作用于它,几乎就像有一个中断向量表......这就是猜测它是如何工作的.:)