android电话管理从下到上可以分为四层:硬件驱动层、RIL daemon层、Telephony框架实现层、 PHONE应用层,下层为上层提供服务,每层之间采用不同的通讯方式交互。RIL daemon层实现为单独的一个开机启动的进程(rild命令),通过AT命令与硬件驱动层交互,Telephony JAVA框架实现层包括一个RIL抽象层,RIL抽象层中通过一个本地socket与RIL daemon层(rild)交互,PHONE应用层通过BINDER机制与Telephony框架交互。
本文着重介绍RIL部分:
1、RIL daemon层
daemon层的代码在/hardware/ril/下。具体各个子目录及文件的含义如下:
---/hardware/ril/
|--include/
||--telephony/
|||--librilutils.h
|||--record_stream.h
|||--ril.h 接口和数据结构(类型),定义了 N多RIL_REQUEST_XXXX宏,代表客户进程向Android telephony发送的命令,包括SIM卡相关的功能,打电话,发短信,网络信号查询等等。
|||--ril_cdma_sms.h cdma sms
|||--ril_nv_items.h
|--libril/ 主要负责与客户进程进行交互,在接收客户进程命令后,调用相应函数进行处理,然后将命令响应结果传回客户进程。在收到来自网络端的事件后,也传给客户进程。
||--ril.cpp 1)RIL_register函数:打开监听端口,接收来自客户进程的命令请求(s_fdListen =android_get_control_socket(SOCKET_NAME_RIL);),当与某客户进程连接建立时,调用listenCallback函数;创建一单独线程监视并处理所有事件源(通过ril_event_loop)。 2) listenCallback函数:当与客户进程连接建立时,此函数被调用。此函数接着调用 processCommandsCallback处理来自客户进程的命令请求。 3) processCommandsCallback函数:具体处理来自客户进程的命令请求。对每一个命令,ril_commands.h中都规定了对应的命令处理函数(dispatchXXX),processCommandsCallback会调用这个命令处理函数进行处理。 4) dispatch系列函数:此函数接收来自客户进程的命令己相应参数,并调用onRequest进行处理。 5) RIL_onUnsolicitedResponse函数:将来自网络端的事件封装(通过调用responseXXX)后传给客户进程。 6)RIL_onRequestComplete函数:将命令的最终响应结构封装(通过调用responseXXX)后传给客户进程。 7)response系列函数:对每一个命令,都规定了一个对应的response函数来处理命令的最终响应;对每一个网络端的事件,也规定了一个对应的response函数来处理此事件。response函数可被onUnsolicitedResponse或者onRequestComplete调用。
||--ril_commands.h RIL命令列表
||--ril_event.cpp/.h 处理与事件源(端口,medom等)相关的功能,ril_event_loop监视所有注册的事件源,当某事件源有数据到来时,相应事件源的回调函数被触发(firePending-> ev->func())。
||--ril_ex.h
||--ril_unsol_commands.h RIL主动上报消息列表
||--RilSapSocket.cpp
||--RilSapSocket.h
||--RilSocket.cpp
||--RilSocket.h
||--rilSocketQueue.h
|--librilutrils/
||--librilutils.c
||--record_stream.c
|--reference-ril/ 主要负责与medom进行交互
||--at_tok.c
||--at_tok.h
||--atchannel.c 负责向modem读写数据。at_send_command_full_nolock函数:运行在主线程里面。将一个ATcommand命令写入modem后进入睡眠状态(使用pthread_cond_wait或类似函数),直到modem读线程将其唤醒。唤醒后此函数获得了ATcommand的最终响应并返回。 readerLoop函数: 运行在一个单独的读线程里面,负责从modem中读取数据。读到的数据可分为三种类型:网络端传入的事件;modem对当前ATcommand的部分响应;modem对当前AT command的全部响应。对第三种类型的数据(ATcommand的全部响应),读线程唤醒(pthread_cond_signal)睡眠状态的主线程。
||--atchannel.h
||--misc.c
||--misc.h
||--reference-ril.c 此文件核心是两个函数:onRequest和onUnsolicited。onRequest 函数对每一个RIL_REQUEST_XXX请求,都转化成相应的ATcommand,发送给modem,然后睡眠等待。当收到此ATcommand的最终响应后,线程被唤醒,将响应传给客户进程(RIL_onRequestComplete-> sendResponse)。onUnsolicited函数处理modem从网络端收到的各种事件,如网络信号变化,拨入的电话,收到短信等。然后将时间传给客户进程(RIL_onUnsolicitedResponse -> sendResponse)。
||--ril.h
rild/
||--radiooptions.c 调试时配置medom参数
||--rild.c 守护进程
后续http://www.cnblogs.com/bastard/archive/2012/11/05/2755193.html