Modem代码如何与Android代码对话

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_STATEAndroidManifest.xml中使用并指定了权限.

同样相反,当接收文本消息时,相反,无线电固件接收一些字节,专有库调用对rild的回调,从而将字节写出到套接字.在Java端,它从中读取,并解码字节序列,将其转换为我们所知的文本,通过消息接收通知触发广播.该消息的应用反过来又注册了该广播接收机,并发送一个意向通知栏说"有点像从+ XXXXXX收到的新邮件 "

意图发现于 frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java

这就是电话系统如何工作的要点,真正的美妙之处在于,它使用通用的AT Hayes调制解调器命令,从而简化和隐藏真正的专有机制.

对于像高通这样的高通公司来说,忘了它,因为无线电话层是嵌入在SoC(片上系统)电路中的,所以他们认为他们曾经开源过这个库!

另外,作为旁注,为什么闪存无线电固件有风险,有些手机提供了执行此功能的能力,闪存错误的固件(例如不兼容或不适合手机),亲吻手机再见并使用作为门挡或纸张重量!:)

应该指出的是,涉及零JNI机制.

这是从我的它是如何工作的,从我可以告诉的就是这个,无线电固件加载到内存地址在什么地方了Linux内核保留的地址空间,并没有触及它,有点像回到了旧电脑的认识天,当DOS启动时,有保留通过BIOS使用的地址,我认为,其此类似,标记为保留通过固件,被占用的地址,其中的专属无线电库会谈,以它 - 因为库运行内核所拥有的地址空间,root拥有root权限,它可以与它"交谈",如果你想使用偷看和戳戳的旧BASIC方言,我猜你不会远离它标记在那里,通过向该地址写入一定的字节序列,无线电固件作用于它,几乎就像有一个中断向量表......这就是猜测它是如何工作的.:)

  • @gonzobrains理论上,你可以替换或修改rild守护进程来记录Hayes AT&T命令......它在那里通过修改代码,可以拦截命令序列以启动调用等方式java/android方面看不到它......这绝对需要从头开始定制ROM.一个MITM的东西,如果你得到我...它不容易 - 可能最终打破整个rild的接收/打电话/短信的核心目的.... (3认同)
  • @gonzobrains套接字!阅读上面第5和第6段:)由ril守护进程创建的名为**rild**的套接字,java端打开用于读/写... (2认同)
  • @ B770通过电话芯片组透明处理,高级Android处理路由*提供*满足条件,即耳机插入,重新路由,否则,正常(通常通过吹嘴/耳机),否则,如果bt耳机被激活,重新路由正常.所以不,来自麦克风的输入不是通过rild/socket传输的. (2认同)
  • 请注意,我在答案中所描述的较低级别的东西是*禁区*和封闭源 - 所以不知道具体如何.此外,有GSM,CDMA是电话的独特频率,它使用自己的供应商特定库,三星,摩托罗拉,HTC,你的名字.Android的那个方面没有*开源*电话机制 - 不存在. (2认同)
  • 是的,播放预先录制的文件会很有趣.因此,一种选择是更改从麦克风写入的缓冲区. (2认同)