前段时间接触GSM模块,基于android源码实现打电话。这里把我自己的从最初的无知整体读懂实现过程,mark下来,其中引用很多网上各位达人的帖子,中间会附上链接,非常感谢他们的share自己的开发经验,让我这后来者得以少走很多弯路O(∩_∩)O~

首先,实现打电话,我得先熟悉其具体流程,不然无头苍蝇源码乱看一通,最后还是无厘头(我就是个典型例子╮(╯▽╰)╭)。下面贴上达人A的打电话流程,从android应用,到ril发送at指令:

1.这里我先简单描述下电话系统的模块:

拨号应用-->phone.apk服务-->ril-->GSM硬件集成

最后面的GSM模块咱就姑且不研究了,毕竟那已经是硬件厂商的事了。

这里值得注意的是:拨号应用和phone.apk的区分。

之前我一直以为android源码里把拨号、等应用全都实现在phone.apk里,后来我发现我错了,phone.apk只是个服务,并且是系统服务,得放在system/app里面。当一开机这个服务就一直存在着,你kill它,它又会重新启动。并且在phone.apk的AndroidManifest.xml文件里面,并没有相应的启动程序 main入口,即:拨号键盘等界面,所以拨号应用得自己实现或联系人里添加。

上面主要是java部分,接下来是C/C++部分。ril主要可分为:

(1). rild:rild等 (源码路径:android-2.3.1_r1\hardware\ril\rild)

职责:主要负责和ava层建立sokcet通道,接收和传递数据,管理event线程。后面会详细介绍

(2).libril:ril.cpp+ril_event.cpp+ril_commands.h等 (源码路径: android-2.3.1_r1\hardware\ril\libril )

职责:ril.cpp负责解析java传下来的序列化数据,ril_event.cpp主要创建线程,ril_commands.h和ril_unsol_commands.h是一个数组,定义相应的指令编号和相应的解析方法,相应的指令编号在ril/include/telephony/ril.h里被宏定义

(3).reference-ril:reference-ril.c+atChannel.c等 (源码路径: android-2.3.1_r1\hardware\ril\refernece-ril )

职责:reference-ril.c负责接收ril.cpp解析后的数据,发送相应的at指令,atChannel.c写at指令和读at指令从GSM模块中

2.电话系统详细调用流程:

上面这篇文章里很具体的跟踪了从应用按下拨号键到通话的具体调用流程,这里就不在累述了。

我大概知道流程了,接下来source Insight跟踪源码分析: