`
xumin_minzi
  • 浏览: 41502 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论
阅读更多
Android-RIL流程分析
2010-03-04 09:12
本文以通话设置中的呼叫等待的设置为例,讲解RIL的流程。其实其余的也类似如此

路径: package/apps/Phone/src/com/android/phone
呼叫等待的onClick事件在CallFeaturesSettings.java里面

当点击呼叫等待的CheckboxPreference时,调用以下函数:

CallFeaturesSettings::onPreferenceTreeClick()
其中:
else if (preference == mButtonCW) {
handleCWClickRequest(mButtonCW.isChecked());
nextState = AppState.BUSY_NETWORK_CONNECT;
}
这里的mButtonCW便是呼叫等待的这个CheckboxPreference

继续追下去,调用
CallFeaturesSettings::handleCWClickRequest()

这里便有:
mPhone.setCallWaiting(b, Message.obtain(mSetOptionComplete, EVENT_CW_EXECUTED));

===================================================================================
以下转到: framework/base/telephony/java/com/android/internal/telephony/gsm

其中mPhone是Phone的对象,追到Phone里面,发现Phone是个接口.
得找出是哪个类去实现这个接口的,是GSMPhone.
里面就有setCallWaiting()这个函数。

public void setCallWaiting(boolean enable, Message onComplete) {
mCM.setCallWaiting(enable, CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
}

发现这个函数又是调用别人的函数,其中mCM是CommandsInterface对象,而CommandsInterface又是个接口。
像刚才一样,得找出是谁实现了CommandsInterface。找到RIL.java。
寻找setCallWaiting():
public void
setCallWaiting(boolean enable, int serviceClass, Message response)
{
RILRequest rr
= RILRequest.obtain(RIL_REQUEST_SET_CALL_WAITING, response);

//以下对rr中的mp写入数据。mp是Parcel的对象
rr.mp.writeInt(2);
rr.mp.writeInt(enable ? 1 : 0);
rr.mp.writeInt(serviceClass);

if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ " " + enable + ", " + serviceClass);

send(rr);
}

这里的RILRequest是获取呼叫等待的RIL请求消息。这里得留意RIL_REQUEST_SET_CALL_WAITING, 这个可以认为是该请求的ID。
在RILConstants.java以及ril.cpp中有对此ID号的解析,映射成了一个string,以在后面对其进行处理。

send()便是把这个请求发送出去。
private void
send(RILRequest rr)
{
Message msg;

msg = mSender.obtainMessage(EVENT_SEND, rr);

acquireWakeLock();

msg.sendToTarget();
}

看下send(),会发现,在send的时候,mSender获取了这个消息。之后该请求进入了消息队列。一开始追到这里就懵了,感觉没有对消息进行处 理,就卡住了。
这里得说下Handler对消息队列的处理机制。
是这样的,Handler所获取的消息,都会进入消息队列。而等消息出来的时候,将会在Handler的handlerMessage()中对其进行处 理。
因此,在msg.sendToTarget()之后,就是mSender对象的handleMessage()对此消息进行处理。
追查到mSender的handlerMessage(), 把代码好好看一遍。
其实这里就是对rr里面所打包的数据进行解包,以字节流的方式,写入socket.

===========================================================================================================
回到RIL.java,会发现在RIL的构造函数里面,有如下部分:
mSenderThread = new HandlerThread("RILSender");
mSenderThread.start();

Looper looper = mSenderThread.getLooper();
mSender = new RILSender(looper);

mReceiver = new RILReceiver();
mReceiverThread = new Thread(mReceiver, "RILReceiver");
mReceiverThread.start();

这里注意mSender是RILSender的实例
而mReceiver是RILReceiver的实例

在mReceiver,注意到在它开启了一个线程,这个线程里面有如下代码:
s = new LocalSocket();
l = new LocalSocketAddress(SOCKET_NAME_RIL,LocalSocketAddress.Namespace.RESERVED);
s.connect(l);

因此,在进入RIL.java的时候便连上了socket。
其次有个mSocket=s。其实就是将RILSender与RILReceiver共用一个socket。

查找这个socket的name, 是SOCKET_NAME_RIL, 其中有:
static final String SOCKET_NAME_RIL = "rild";

在sourceInSight中查找这个socket_name,即rild
其次,

路径:hardware/ril/

搜到ril.cpp这个文件,毫无疑问,这个就是上层的RIL.java开启的socket所连接上的文件,开始要跟硬件打交道了。
至于连接上socket后具体做了什么事情,参阅文档:GSM驱动模块详细分析(一)~(三)

以下只是初略的写下大概的流程。
ril.cpp中建立了消息循环,而对消息的处理以及解析,都在reference_ril.c中
要想知道处理的函数在哪,就得找到上面所说的请求ID号所映射的字符串, 搜索字符串便能找到相应的请求函数。
请求均在onRequest()里面,再通过response进行解析。
同时reference_ril.c将解析好的消息传回给socket,将字节流返回到上层。

============================================================================================
而返回到上层的时候,便是RILReceiver的工作,它会将返回上来的字节流进行处理。
处理函数为RIL::processResponse()
其中:
AT的response有两种,一是主动上报的,比如网络状态,短信,来电等都不需要经过请求,有一unsolicited词语专门描述。
另一种才是真正意义上的response,也就是命令的响应,用solicited描述。

最后将处理后的消息,返回给最初的mSetOptionComplete

流程:
CallFeaturesSetting::onPreferenceTreeClick()
->CallFeaturesSetting::handleCWClickRequest()
->Phone::setCallWaiting()
->GSMPhone::setCallWaiting()
->CommandInterface::setCallWaiting()
->RIL::setCallWaiting()
->RIL::send()
与此同时,RILSender mSender把RILRequest rr里面所打包好的数据解包,以字节流写入socket。
此时底层的GSM驱动对此字节流进行请求和解析,将结果返回给上层。这结果恰好就是以引用方式所传下来的Message。

->Message::sendToTarget()
->CallFeaturesSetting::mSetOptionComplete::handleMessage()
分享到:
评论

相关推荐

    reference-ril.rar_android_android M 原生RIL库_reference-ril_ril-ref

    《Android M 原生RIL库:reference-ril详解》 在Android系统中,Radio Interface Layer(RIL)扮演着至关重要的角色,它是操作系统与无线调制解调器之间的桥梁,负责处理通信相关的任务,如语音通话、数据传输、...

    Quectel_Android_RIL_Driver_User_Guide_V1.4.pdf.zip_Android RIL驱动

    《Quectel Android RIL驱动用户指南V1.4》是针对Quectel公司蜂窝通信模块在Android系统中实现Radio Interface Layer (RIL)驱动的一份详细文档。这份PDF文档,作为压缩包中的唯一文件,是开发者和系统集成者理解和...

    Android中RIL层详细分析.pdf

    "Android中RIL层详细分析" Android 中的 RIL(Radio Interface Layer, радио接口层)是负责无线硬件设备与电话服务之间的抽象层,位于应用程序框架与内核之间。RIL 的主要作用是提供了电话功能的实现,包括...

    在Android HAL层实现与RIL的通信

    Android HAL层实现与RIL的通信 在Android系统中,HAL(Hardware Abstraction Layer,硬件抽象层)层是Android与硬件之间的接口层,它提供了对硬件的访问和控制。RIL(Radio Interface Layer,射频接口层)是Android...

    Quectel_Android_RIL_Driver.zip

    《Quectel Android RIL驱动程序详解》 在Android操作系统中,Radio Interface Layer(RIL)扮演着至关重要的角色,它是手机与基带处理器通信的关键组件。本文将深入探讨"Quectel Android RIL Driver",这是一个专为...

    reference-ril.rar_RIL for android_RIL linux_android_android ril_

    《Android RIL:深入理解与应用》 在Android操作系统中,Radio Interface Layer(RIL)是连接硬件调制解调器(Modem)与上层应用程序框架的关键组件,它负责处理移动网络通信的各种任务,包括语音通话、数据传输、...

    QCRIL_RIL_架构分析

    ### QCRIL_RIL_架构分析 #### 一、引言 在移动通信技术中,尤其是在Android平台上,RIL(Radio Interface Layer)扮演着至关重要的角色。它作为连接上层应用框架与底层调制解调器(Modem)之间的桥梁,负责处理所有...

    Android-RIL详细总结及流程图_ril上网流程_RILandroid_RIL_androidril_Android流程图

    Android RIL,全称为Radio Interface Layer,是Android操作系统中用于通信功能的核心组件,它负责管理设备的无线通讯接口,如蜂窝数据、电话通话、短信等。本篇将深入探讨Android RIL的工作流程、主要功能及其相关的...

    Quectel_Android_RIL_Driver_V2.1.3

    Quectel Android RIL Driver V2.1.3是一款针对移远(Quectel)4G模块的Android RIL(Radio Interface Layer)驱动程序,主要适用于EC20和EC21系列模块。RIL是Android操作系统中通信层的重要组成部分,它负责在硬件...

    android-RIl.zip_RIL_android

    在Android操作系统中,RIL(Radio Interface Layer)是通信子系统的关键组成部分,它负责与手机的基带处理器进行通信,处理所有的无线网络相关的任务,包括数据和语音的传输。RIL作为操作系统和无线硬件之间的桥梁,...

    Android RIL框架详细介绍

    ### Android RIL框架详解 #### 一、概览 Android RIL(Radio Interface Layer)框架是一种重要的通信组件,它提供了一个软件层,用于抽象出无线硬件设备与电话服务之间的交互。RIL允许开发者通过标准接口控制基带...

    移远4G模块最新ril库 V3.3.46版

    RIL库是RIL的具体实现,包含了与各种无线通信模块交互所需的驱动程序和协议栈。移远的V3.3.46版RIL库是对之前版本的升级,旨在优化性能、增强稳定性,并提供对新功能的支持。 对于Android 11的支持,这意味着移远4G...

    Ril资料[ril.h、ril.lib] Mobile

    RIL(Radio Interface Layer)是移动设备中一个关键的组件,它充当了操作系统与无线调制解调器之间的桥梁。在Android系统中,RIL扮演着处理底层通信任务的角色,如初始化网络连接、拨打电话、发送短信等。本文将深入...

    Ril_SO.rar_RIL android_RIL for android_android_android智能手机_ril.s

    在Android操作系统中,RIL(Radio Interface Layer,无线接口层)是至关重要的组件,它作为操作系统与手机硬件之间通信的桥梁,负责处理电话、短信、数据连接等与无线网络相关的功能。RIL对于理解Android智能手机的...

    Quectel-Android-RIL-Driver-V3.6.22

    《Quectel Android RIL驱动V3.6.22详解》 在移动通信领域,设备与操作系统之间的通信至关重要,而Quectel Android RIL(Radio Interface Layer)驱动就是这样的关键组件。它作为Android系统与无线模块之间的桥梁,...

    ril的测试应用小程序或RIL应用例程

    RIL(Radio Interface Layer,无线接口层)是移动设备中通信模块与操作系统之间的一个关键组件。它是手机系统架构的一部分,负责处理与基带处理器或调制解调器之间的交互,确保设备能够正确地进行语音通话、数据传输...

    Quectel_Android_RIL_Driver_V3.3.41

    《Quectel Android RIL Driver V3.3.41详解》 在移动通信设备领域,RIL(Radio Interface Layer)驱动程序扮演着至关重要的角色。Quectel是一家知名的无线通信模块制造商,其产品广泛应用于各种物联网设备和移动...

    Android的RIL驱动模块启动流程.txt

    ### Android的RIL驱动模块启动流程 #### 一、概览 在Android系统中,RIL(Radio Interface Layer)作为连接应用层与底层硬件的重要组件,主要负责处理来自网络的各种信号和服务请求。本文将深入探讨Android RIL驱动...

    ril驱动知识总结

    ### RIL驱动知识总结 #### 一、RIL概述 **Radio Interface Layer (RIL)** 驱动作为系统软件与无线通信(Radio)堆栈之间的桥梁,它扮演着非常重要的角色。简单来说,RIL驱动是连接操作系统与底层硬件(如基带处理器...

    移远4g模块 android ril库源码

    这个压缩包包含的资料涉及到该模块的RIL(Radio Interface Layer)库源码、Android驱动移植文档以及硬件参考手册,对于开发者来说是非常宝贵的资源。 RIL库是Android系统中负责与底层无线调制解调器通信的接口层。...

Global site tag (gtag.js) - Google Analytics