Android Telephony分析(三) ---- RILJ详解
来源:互联网 发布:优斗士网络推广效果 编辑:程序博客网 时间:2024/05/01 01:03
前言
本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程。
这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\android\internal\telephony) ,
RILC指的是Ril.cpp (hardware\ril\libril)
1. RILJ的创建
RILJ的继承关系如下:
可以看到RILJ继承自BaseCommands并且实现了CommandsInterface接口,RILJ中有两个子线程RILSender和RILReceiver。
再看看RILJ的构造函数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
在RILJ初始化的时候,启动了RILSender线程用于发送数据,启动了RILReceiver线程用于接收数据。
在《Android Telephony分析(一) — Phone详解 》的第二小节中曾经说到,在创建Phone实例之前会先创建RILJ,一个Phone实例对应一个RILJ实例。
在CallTracker.java、Phone.java、ServiceStateTracker.java我们常常看到的
- 1
mCi对象都是RILJ实例。
2. RILJ的工作原理
RILJ、RILC、Modem的工作流程:
RILJ里有RILSender线程用于向RILC发送数据和RILReceiver用于接收来自RILC的数据,但是这些数据的发送和接收是一个异步的过程。
结合同步,才能更好地理解异步:
同步:发送方发出数据后,等接收方发回响应以后才发下一个数据包。
异步:发送方发出数据后,不等接收方发回响应,接着发送下个数据包。
理解这个概念之后,我们再去分析代码,我们就以打电话为例吧。
2.1 RILSender发送Request
前面的拨号流程省略,我们直接从GsmCdmaCallTracker.java的dial()方法开始分析:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
在调用RILJ的方法发起拨号请求之前,先创建一个Message对象,这个Message对象主要用于,当RILJ发起拨号请求,modem返回消息之后,RILJ再通过Message.sendToTarget,这样回调就可以通知GsmCdmaCallTracker,后文2.2.1小节会详细讲。
接着在RILJ中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
就这样,整个主动向RILC发出请求的流程就将完了。
2.2 RILReceiver接收Response
在RILReceiver线程中
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
RILC上报给RILJ的消息可以分成两类:
1. Solicited Response—>对之前RILJ发出的Request进行回应的消息。(一个Request对应一个Response)
2. UnSolicited Response—>modem主动上报的消息。(单方向,由RILC发给RILJ)
2.2.1 处理Solicited Response
继续上面拨号的例子,在RILJ发起拨号请求后,modem处理完之后,返回消息给RILC,最后通知到RILJ。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
2.2.2 处理Solicited Response
这里以拨打电话后,modem上报call的状态变化消息RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED为例
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
关于RegistrantList机制,请看上一篇文章《Android Telephony分析(二) —- RegistrantList详解》
接着会通知到注册监听Call状态变化的人:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
最终会在GsmCdmaCallTracker的handleMessage方法中对EVENT_CALL_STATE_CHANGE进行处理。
modem主动上报消息的流程也讲解完了。
3 .学以致用
学习完本篇博客的知识,怎么去分析调用RILJ的方法主动发起Request的流程和modem主动上报消息的流程呢?
这里还是以第二小节拨号的代码为例,其他业务流程都可以举一反三。
1.主动发起Request这类代码流程,核心是谁创建Message,之后还是谁对该Message进行处理。
2.modem主动上报消息这类代码流程,核心是谁注册监听了这个消息,那么还是谁对该消息进行处理。
最后可以通过log中的“>”和“<”判断消息的方向。
- 1
- 2
“>”:是RILJ发请求给modem。
“<”:是modem上报消息给RILJ。
原文地址:http://blog.csdn.net/linyongan/article/details/52066306
- Android Telephony分析(三) ---- RILJ详解
- Android Telephony分析(三) ---- RILJ详解
- Android Telephony分析(三)--- RILJ 详解
- Android Telephony分析(三) ---- RILJ详解
- Android Telephony分析(一) ---- Phone详解
- Android Telephony分析(二) ---- RegistrantList详解
- Android Telephony分析(四) ---- TelephonyManager详解
- Android Telephony分析(五) ---- TelephonyRegistry详解
- Android Telephony分析(一) ---- Phone详解
- Android Telephony分析(二) ---- RegistrantList详解
- Android Telephony分析(四) ---- TelephonyManager详解
- Android Telephony分析(五) ---- TelephonyRegistry详解
- Android Telephony分析(一) ---- Phone详解
- Android Telephony分析(四)--- TelephonyManager 详解
- Android Telephony分析(一)--- Phone 详解
- Android Telephony分析(二)--- RegistrantList详解
- Android Telephony分析(五)--- TelephonyRegistry 详解
- Android Telephony分析(二) ---- RegistrantList详解
- web.xml里配置load-on-startup的意思
- oracle的数据扫描方式
- 轮廓系数
- prim模板(hdu1102为例)
- IntelliJ Idea 集成svn 和使用
- Android Telephony分析(三) ---- RILJ详解
- jflash合并bin文件
- Spark内存管理
- node常用命令
- C++之try catch 异常处理入门实例
- 逼老板喝火锅锅底 警方接警赶到制止却无端遭打肇事者一伙人围殴
- SSID 服务集标识符(Service Set Identifier)
- LintCode 格雷编码
- CentOS6.x 安装 Docker 和 Docker Compose