Binder分析

需了解C/S还有管理这些的ServiceManager。

简单来讲你(client)有个包裹(parcel)让快递员(proxy)送到公司(server),

   公司(server)接到包裹(parcel)后检查是否是自己的,是的话解开包裹,找相应的部门(corresponding method)处理。然后告诉你(client)。

ProcessState一个进程只能有一个。

  1. 首先打开/dev/binder设备,可以与binder交互了。
  2. Fd使用mmap使binder分配一块内存来接收。
  3. getContextObject函数返回一个IBinder指针。

 BpBinder与BBBinder

BpBinder是client端创建的用于消息发送的代理,而BBinder是server端用于接收消息的通道。

  1. IServiceManager中调用asInerface的时候回创建BpBinder。
  2. 这两个类都是有IBinder派生出来的。
  3. BpBinder是客户端用来与Server交互的代理类,p即为Proxy的意思。
  4. BBinder是与proxy相对的一端,如果说Bpbinder代表客户端BBinder则是服务端。
  5. BpBinder与BBinder 是一一对应的。Binder系统通过handler来表示对应的BBinder。
  6. BnServicexxx是由BBinder派生,BpServicexxx是由BpBinder派生。
  7. 可以认为是Binder的一个道具。
  8. BpBinder构造函数传的参数handle的值是0(NULL),0代表ServiceManager所对应的BBinder。
  9. 在addService函数中把请求数据打包成data后传给BpBinder的transact函数。
    此函数由IPCThreadState的tanscat来完成。
    此函数中利用BC_消息码从应用程序发往Binder设备的,而回应请求时BR_开头的消息码。发送消息后会等待回应。
  10. IPCThreadState发送binder的数据(请求),然后等待回应。

每个IPCThreadState中都有一个mIn,mOut,其中mIn是用来接收来自Binder设备的数据的,相反mOut是存储发往Binder设备的数据。

Vold (Volume Daemon) & RILD(Radio Interface Layer Daemon)

Vold:

管理外部存储设备的后台进程。SD卡的插拔检查,SD卡挂载,卸载,格式化

工作流程:

  1. 从kernel项NM(Netlink Manager)发送uevent消息。
  2. NM转发给VolumeManager模块。
  3. VolumeManager通过CommandListener发送给MountService。
  4. MountService发送指令给VOLD。

Netlink与Uevent:

Netlink:用户空间与Kernel通讯机制。

Uevent:设备发送变化是发送的消息(字符串)。存在uevent文件。

RILD:

注释:多处理器(AP[Application Processor] & BP[Baseband Processor])

AP是用来跑OS的,BP是用来辅助射频无线通讯相关工作。

工作:

RILD是运行在AP上,通过RILD使AP与BP通讯发送AT指令来完成。

               

Dial拨号:

Phone应用提供了以个PhoneUtils类

PhoneUtils.java

调用Phone.dial(number); Phone对象是GSMPhone的代理PhoneProxy。

GSMPhone.java

调用GsmCallTrack.dial();

GsmCallTrack.java

构造一个GsmConnetion对象,调用RIL的dial(cm.dial())函数。

RIL.java

RIL是rild socket的唯一客户端。

RIL的构造函数中封装了两个线程

mSenderThread:用来向Rild发送消息。

     mReceiverThread:用来从Rild中接收消息,还与rild进行socket连接。

   dial();

  发送请求到Rild中

Rild.cpp

   收到数据时由eventLoop调用对应的任务处理函数处理(processCommandsCallback函数);

    processCommandsCallback:

    将从socket中read数据到缓冲区中,处理命令找出执行对应命令的函数。Rild中打电话的处理函数是dispatchDial(Ril.c)。

Ril.c

创建RIL_Dial对象(存储打电话所需要的一些参数)

      调用RIL_RadioFunctions的onRequest函数,即向RefRil库发送请求。

Reference_Ril.c

发送AT指令。通知处理完成到java中的RIL的RILReceiver处理。

Binder相关的更多相关文章

  1. IPC机制--Binder

    文章来自 Android技术内幕 系统卷 转:http://www.linuxidc.com/Linux/2011-08/40508.htm 什么是IPC机制以及IPC机制的种类 在Linux中,是以 ...

  2. 图解Android - Binder 和 Service

    在 Zygote启动过程 一文中我们说道,Zygote一生中最重要的一件事就是生下了 System Server 这个大儿子,System Server 担负着提供系统 Service的重任,在深入了 ...

  3. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信 ...

  4. Android进程间通信(IPC)机制Binder简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6618363 在Android系统中,每一个应用 ...

  5. Android进程间通信(IPC)机制Binder简介和学习计划

    在Android系统,每个应用程序是由多个Activity和Service部件,这些Activity和Service有可能在相同的处理被执行,此外,还可以在不同的过程中进行. 然后.不是在同一个过程A ...

  6. 插件开发之360 DroidPlugin源码分析(三)Binder代理

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52138483 Hook机制中Binder代理类关系图 Hook机制中Binder代理时 ...

  7. 关于Binder,作为应用开发者你需要知道的全部

    作者:rushjs https://www.jianshu.com/p/062a6e4f5cbe github 地址: https://github.com/rushgit/zhongwenjun.g ...

  8. Android : 跟我学Binder --- (4) 驱动情景分析

    目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...

  9. (原创)Android Binder设计与实现 - 实现篇(1)

    本文属于原创作品,转载请注明出处并放于明显位置,原文地址:http://www.cnblogs.com/albert1017/p/3849585.html 前言 在学习Android的Binder机制 ...

随机推荐

  1. 慕课网-安卓工程师初养成-4-7 Java循环语句之 while

    来源: http://www.imooc.com/code/1420 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...

  2. Swift学习(四)常量&变量&基础数据类型

    常量和变量 常量: 使用let关键词来声明一个常量 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的 编程时使用常量能够让代码看起来更加安全和简洁! let ...

  3. ant风格是什么?

    我们在看java技术书籍的过程中,当加载文件时总会遇到是否支持ant风格路径加载,这里说的ant风格是什么意思呢,今天我查了一下,明白了什么意思,现在总结一下 ANT通配符有三种: 通配符 说明 ? ...

  4. android ios 只能輸入數字 不能輸入小數點的 函數 cordova

    andriod function numericsonly(ob) { var invalidChars = /[^0-9]/gi if (invalidChars.test(ob.value)) { ...

  5. sessionStorage html5客户端本地存储之sessionStorage及storage事件

    可以看一下<JavaScript本地存储实践(html5的localStorage和ie的userData)>sessionStorage和上文中提到的localStorage非常相识,方 ...

  6. Linux之文件系统的简单操作

    df:列出文件系统整体硬盘使用量 将容量以易读方式显示: [root@zkero ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/s ...

  7. 2.3搭建Android应用程序开发环境

    1.安装Android SDK (1)首选下载Android SDK: (2)下载完成之后,在Ubuntu系统下进行解压: (3)解压完成之后,配置环境变量: ①用vim打开/etc/profile文 ...

  8. .NET 中的DateTime

    DateTime简介 DateTime是.NET中的时间类型,可以通过DateTime完成诸如获取当前的系统时间等操作.DateTime在.NET中是一个结构体,而并不是一个类. 如上图所示,这个图标 ...

  9. C# 多线程运用

    没有用过多线程,所以没有过多的了解操作原理以及怎么编写多线程 后来才只知道将一个传入的集合分别拆开为N个集合来进行使用 //分线程执行 public static void OperateThread ...

  10. Silverlight IIs发布问题

    1.在IIS上部署系统没有问题,在vs中链接oracle中出错(数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位 ...