RIL 机制---开篇
2017-05-10 21:04
393 查看
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值为4 mNext = 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 Parcel rr.mParcel.writeInt(request);//封装请求码 rr.mParcel.writeInt(rr.mSerial);//封装系列号 return rr; }
小结:
1,RIL中首先会对应phone进程的消息进行封装。
2,开启了2个子线程,一个往ril发送消息,一个读取ril的消息。
相关文章推荐
- C++底层机制(一)——开篇
- RIL各种事件触发机制
- RIL 机制---rild守护进程
- RIL 机制---总结
- 异步机制(Asynchronous) -- (一)开篇兼谈Mina
- RIL 机制---消息从RILJ到RIL
- Java学习之旅开篇:运行机制及环境搭建
- RIL 机制---消息从RIL到reference-ril
- 阅读深入解析Android RIL笔记2 —RILC系统结构及LibRIL运行机制
- RIL 机制---消息从reference-ril到Modem
- Android RIL源码研究笔记1- ril_event机制
- Java学习之旅开篇:运行机制及环境搭建
- ios 消息转发机制 - 开篇
- RIL 机制---消息从reference-ril到RIL
- Android 时间更新机制之RIL更新时间
- RIL 机制---消息从RIL到RILJ
- RIL框架结构及RILJ的运行机制
- Android——RIL 机制源码分析
- RIL 机制---消息RILJ中的处理
- 异步机制(Asynchronous) -- (一)开篇兼谈Mina