RIL 机制---开篇
1, 概念
本文基于android 6.0。RIL(Radio Interface Layer,无线通信接口层)主要相关的结构如下,
为了便于论述,将RIL分为三个部分,
1, Framework层中的相关Java程序。运行与phone进程,简称RILJ。
封装phone进程的消息,然后发送给RIL;
读取RIL中的消息然后解析并进行处理。
2,hardware中的ril部分,运行于rild守护进程,简称RIL。
读取RILJ中的消息,发送到reference-ril库。
读取reference-ril库中的消息,发送到RILJ。
3, hardware中的reference-ril库, 运行于rild守护进程,简称reference-ril,由各大厂商自己定制,因为厂商自己的Modem也不一样。
读取RIL中的消息,发送到Modem。
读取Modem中的消息,发送到RIL。
主要包括代码如下,
frameworks\opt\telephony\src\java\com\android\internal\telephony
RIL.java
hardware\ril\rild 目录下的所有文件
hardware\ril\libril目录下的所有文件
hardware\ril\reference-ril目录下的所有文件
RILJ属于系统Phone进程的一部分,随Phone进程启动而加载;而RILD守护进程是通过Android的Init进程进行加载的。接下来首先用2个章节来论述phone进程和rild守护进程有关ril部分。
2, RILJ
所有上层对RIL层的请求,最终都需要在RILJ中转换为RIL层可识别的命令,然后通过Socket通道传输下去;同时,RIL层数据的上报,也要通过RILJ进行解码,还原为上层容易识别的格式。因此,RILJ是framework与RIL层交互的通道。
RILJ有两个主要特点:
1、开启了两个独立线程分别负责发送数据和接收数据
2、数据的发送和接收是异步的。
2.1 RIL构造方法
RIL.java的构造方法主要代码如下,
public RIL(Context context, int preferredNetworkType,int cdmaSubscription, Integer instanceId) {super(context);•••
//发送子线程mSenderThread = new HandlerThread("RILSender" + mInstanceId); mSenderThread.start();
Looper looper = mSenderThread.getLooper();
//mSender是发送子线程的Handler,通过他可以发送数据mSender = new RILSender(looper);•••//接收子线程mReceiver = new RILReceiver();mReceiverThread = new Thread(mReceiver, "RILReceiver" + mInstanceId);mReceiverThread.start();•••
可以看到,在构造函数中开启了两个独立的子线程:
1,mSenderThread用于给RILC发送数据;
2,mReceiverThread用于接收RILC上报的数据。
另外,RILJ数据的发送和接收是异步的, 既然是异步的消息机制,也就是说发送者在发送完数据后就可以返回,
那么当得到回应后,就要有一种方法去找到当初的请求者,并把结果返回给他。那么这个方法是什么呢?是RILRequest类。
2.2,RILRequest
RILRequest是RIL.java中的外部类,定义如下,
class RILRequest {
主要变量如下,
//这个变量就是一个令牌,每生成(obtain)一个新的请求,都将产生一个递增的、唯一的mSerial,当从RILC得到
//一个数据后,将通过mSerial找到当初发送这个请求的对象。这也就是异步通信最关键的联系点。
//相当于消息的标志,系列号。
int mSerial;
int mRequest; //请求码,需要和RILC层中的ril_commands.h文件内定义的请求码一致。
Message mResult;//消息
Parcel mParcel;//消息中的数据
RILRequest mNext;// 链表结构,代表下一个RILRequest(请求)
Release方法如下,
void release() {synchronized (sPoolSync) {if (sPoolSize < MAX_POOL_SIZE) {// MAX_POOL_SIZE值为4mNext = sPool;sPool = this;sPoolSize++;mResult = null;}}}
把当前的RILRequest对象保存在sPool中, 等下次需要申请RILRequest时就去sPool中取出用即可,
而无需重复的申请(new)RILRequest。同时sPool的最大个数为4(MAX_POOL_SIZE)。
obtain方法如下,
static RILRequest obtain(int request, Message result) {RILRequest rr = null;synchronized(sPoolSync) {if (sPool != null) {rr = sPool;sPool = rr.mNext;rr.mNext = null;sPoolSize--;}}if (rr == null) {rr = new RILRequest();//new对象}rr.mSerial = sNextSerial.getAndIncrement();//获取系列号, 得到一个绝对递增的整数rr.mRequest = request;//请求码rr.mResult = result;//消息rr.mParcel = Parcel.obtain();if (result != null && result.getTarget() == null) {throw new NullPointerException("Message target must not be null");}// first elements in any RIL Parcelrr.mParcel.writeInt(request);//封装请求码rr.mParcel.writeInt(rr.mSerial);//封装系列号return rr;}
小结:
1,RIL中首先会对应phone进程的消息进行封装。
2,开启了2个子线程,一个往ril发送消息,一个读取ril的消息。
RIL 机制---开篇相关推荐
- RIL 机制---rild守护进程
3 守护进程 ril与上层的RILJ沟通方式是通过Socket传输数据与命令,而reference-ril与底层Modem的信号传输是通过串口用AT命令来实现. RILC是一个守护进程,由init进程 ...
- Android——RIL 机制源码分析
Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1. ...
- RIL 机制---消息从RIL到reference-ril
5,RIL->reference-ril 首先ril从socket中读取RILJ发送的数据,然后在ril进行处理封装,最后发送到reference-ril进行处理. 5.1 读取数据 读取数据流 ...
- RIL 机制---消息从RIL到RILJ
8 RIL -->RILJ 8.1 上报消息处理 ril.cpp的RIL_onUnsolicitedResponse方法主要代码如下, //得到当前命令的请求码 unsolResponseInd ...
- Android4.2.2源码目录结构分析
撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/40897277#t17 导读: 关于的Android目录分析,网上有很多资料,在此不 ...
- Android 5.1.1 源码目录结构说明
转自:http://blog.csdn.net/tfslovexizi/article/details/51888458 Android 5.1.1 |-- bootable (启动引导相关代码) | ...
- Android 源码目录结构
android平台四层架构对应源代码中的目录: 第一层:应用程序层(applications)对应根目录下packages/apps 第二层:应用程序框架层(application framework ...
- Android——4.2.2 源代码文件夹结构分析
近期公司要整android内部培训,分配给我写个培训文档.这里记录例如以下: 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/4089 ...
- 漫谈广告机制设计 | 开篇语
很久没有写文章了,oCPC实践录的专栏还没有写完,我就换工作了,去了M公司,做的内容与oCPC不怎么相关,对于其中的问题思考也没有那么多了,好在专栏的核心思想已经基本阐明了. 在M公司也已经快两年了, ...
最新文章
- 用于检测AC电压的无接触电压检测器
- 学习NGUI前的准备NGUI的相关信息
- c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc
- python日历小程序_一个查看网络设备信息Python小程序
- Windows7跑星际争霸问题解决——为了继续星际争霸的辉煌!
- Vue2.x源码学习笔记-Vue实例的属性和方法整理
- c#.net中创建带图标的ListBox
- 鸿蒙系统对手机性能的提升,鸿蒙OS手机版再爆新特性,流畅度和性能大幅提升,用户评价很高...
- ncurses鼠标事件:mousemask(),ALL_MOUSE_EVENTS,KEY_MOUSE,getmouse(),mouse_grafo(),wmouse_trafo()
- cf1107e uva10559区间dp升维
- linux c 密码 星号,Linux C : 登录密码星号 * 显示,包含能回退 backspace
- wifi 小米pro 驱动 黑苹果_【黑果小兵】小米Pro macOS High Sierra 10.13黑苹果安装教程...
- 影视解说短视频如何吸引粉丝?三个要点助你吸粉引流
- IT行业英语自我介绍必备
- linux常用的引导管理器,Linux引导管理器GRUB、GRUB 2和LILO简介
- C:L1-061 新胖子公式 (10分)
- 计算机桌面计划,电脑桌面日程安排软件
- DevExpress XPO 开发指南 简要
- matlab基础知识与简单操作
- Keras Input Layer