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 机制---开篇相关推荐

  1. RIL 机制---rild守护进程

    3 守护进程 ril与上层的RILJ沟通方式是通过Socket传输数据与命令,而reference-ril与底层Modem的信号传输是通过串口用AT命令来实现. RILC是一个守护进程,由init进程 ...

  2. Android——RIL 机制源码分析

    Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1. ...

  3. RIL 机制---消息从RIL到reference-ril

    5,RIL->reference-ril 首先ril从socket中读取RILJ发送的数据,然后在ril进行处理封装,最后发送到reference-ril进行处理. 5.1 读取数据 读取数据流 ...

  4. RIL 机制---消息从RIL到RILJ

    8 RIL -->RILJ 8.1 上报消息处理 ril.cpp的RIL_onUnsolicitedResponse方法主要代码如下, //得到当前命令的请求码 unsolResponseInd ...

  5. Android4.2.2源码目录结构分析

    撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/40897277#t17 导读: 关于的Android目录分析,网上有很多资料,在此不 ...

  6. Android 5.1.1 源码目录结构说明

    转自:http://blog.csdn.net/tfslovexizi/article/details/51888458 Android 5.1.1 |-- bootable (启动引导相关代码) | ...

  7. Android 源码目录结构

    android平台四层架构对应源代码中的目录: 第一层:应用程序层(applications)对应根目录下packages/apps 第二层:应用程序框架层(application framework ...

  8. Android——4.2.2 源代码文件夹结构分析

    近期公司要整android内部培训,分配给我写个培训文档.这里记录例如以下: 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/4089 ...

  9. 漫谈广告机制设计 | 开篇语

    很久没有写文章了,oCPC实践录的专栏还没有写完,我就换工作了,去了M公司,做的内容与oCPC不怎么相关,对于其中的问题思考也没有那么多了,好在专栏的核心思想已经基本阐明了. 在M公司也已经快两年了, ...

最新文章

  1. 用于检测AC电压的无接触电压检测器
  2. 学习NGUI前的准备NGUI的相关信息
  3. c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc
  4. python日历小程序_一个查看网络设备信息Python小程序
  5. Windows7跑星际争霸问题解决——为了继续星际争霸的辉煌!
  6. Vue2.x源码学习笔记-Vue实例的属性和方法整理
  7. c#.net中创建带图标的ListBox
  8. 鸿蒙系统对手机性能的提升,鸿蒙OS手机版再爆新特性,流畅度和性能大幅提升,用户评价很高...
  9. ncurses鼠标事件:mousemask(),ALL_MOUSE_EVENTS,KEY_MOUSE,getmouse(),mouse_grafo(),wmouse_trafo()
  10. cf1107e uva10559区间dp升维
  11. linux c 密码 星号,Linux C : 登录密码星号 * 显示,包含能回退 backspace
  12. wifi 小米pro 驱动 黑苹果_【黑果小兵】小米Pro macOS High Sierra 10.13黑苹果安装教程...
  13. 影视解说短视频如何吸引粉丝?三个要点助你吸粉引流
  14. IT行业英语自我介绍必备
  15. linux常用的引导管理器,Linux引导管理器GRUB、GRUB 2和LILO简介
  16. C:L1-061 新胖子公式 (10分)
  17. 计算机桌面计划,电脑桌面日程安排软件
  18. DevExpress XPO 开发指南 简要
  19. matlab基础知识与简单操作
  20. Keras Input Layer

热门文章

  1. Hexo博客设置背景音乐
  2. class和getClass()的区别
  3. 谈谈过去十五年身处教师家庭是什么感受
  4. 小LightSwitch,别有洞天
  5. linux关机常用命令
  6. 开发中遇到的Redis闪退的原因
  7. element后台管理当navbar固定的时候,遮罩层覆盖diglog的问题
  8. Matlab 函数-copyfile
  9. 软件民工的幸福生活4
  10. WZOI-275开关灯