http://www.jianshu.com/p/af2993526daf

https://www.jianshu.com/u/e347b97e2f0c

上面这篇文章讲得很清楚。以下我的一些理解:

还是先说应用再说原理。

1.应用

以AIDL远程service为例,整个过程是这样的:

  1. 服务端定义AIDL文件,里面包含想提供给客户端的函数定义
  2. rebuild自动生成一个接口文件
  3. 服务器端定义自己的service,初始化stub实现函数,在onbind()返回stub
  4. 服务器端startService()
  5. 客户端实现ServiceConnection类并在其中调用函数
  6. 客户端bindService()

2.原理

Binder机制跨进程原理

binder机制实现跨进程的思路是:

  1. 先有一个serviceManager负责管理所有的service
  2. 实现服务器端,然后向SM注册,说明我有什么功能,接受远程调用
  3. 客户端向SM查询xx进程里的xx对象
  4. SM向客户端返回一个对象代理
  5. 客户端把想做的事告诉对象代理
  6. 对象代理把数据转交给Binder驱动(SM)
  7. Binder驱动把数据给服务器,叫他做这个事
  8. 服务器把结果返回给Binder驱动,驱动再返回给客户端

在实现上这些步骤是怎么样的,源码可以看一开始的链接,这边依旧是给我的理解。

概念:

IBinder/IInterface/Binder/BinderProxy/Stub

我们使用AIDL接口的时候,经常会接触到这些类,那么这每个类代表的是什么呢?

  • IBinder是一个接口,它代表了一种跨进程传输的能力;只要实现了这个接口,就能将这个对象进行跨进程传递;这是驱动底层支持的;在跨进程数据流经驱动的时候,驱动会识别IBinder类型的数据,从而自动完成不同进程Binder本地对象以及Binder代理对象的转换。
  • IBinder负责数据传输,那么client与server端的调用契约(这里不用接口避免混淆)呢?这里的IInterface代表的就是远程server对象具有什么能力。具体来说,就是aidl里面的接口。
  • Java层的Binder类,代表的其实就是Binder本地对象。BinderProxy类是Binder类的一个内部类,它代表远程进程的Binder对象的本地代理;这两个类都继承自IBinder, 因而都具有跨进程传输的能力;实际上,在跨越进程的时候,Binder驱动会自动完成这两个对象的转换。
  • 在使用AIDL的时候,编译工具会给我们生成一个Stub的静态内部类;这个类继承了Binder, 说明它是一个Binder本地对象,它实现了IInterface接口,表明它具有远程Server承诺给Client的能力;Stub是一个抽象类,具体的IInterface的相关实现需要我们手动完成,这里使用了策略模式。

下面就是实现的流程:

在AIDL接口文件中我们会写提供使用的函数定义,假设AIDL中的接口名称为A。方法为ADD,rebuild后自动生成的代码结构是这样的:

  • A接口继承IInterface(提供远程server对象具有什么能力)
  • ADD()
  • 内部stub类继承Binder

内部stub类结构:

  • asInterface(),判断是否远程,返回Binder或新创建的BinderProxy
  • OnTransact(),接收Binder驱动发来的数据,调用相应函数,将结果返回给驱动
  • 内部Proxy类

内部Proxy类结构:

  • ADD(),接收客户端数据,把数据序列化,调用transact()把数据发给Binder驱动,然后挂起等待Binder驱动返回的数据

步骤一先不谈

步骤二:实现服务器端,然后向SM注册,说明我有什么功能,接受远程调用

这里包括

  • 定义AIDL接口并rebuild
  • 在AndroidManifest注册
  • 自定义service,实现stub中的函数
  • 启动service

步骤三:客户端向SM查询xx进程里的xx对象

步骤四:SM向客户端返回一个对象代理

  • 客户端实现ServiceConnection
  • 调用asInterface(),判断是否远程,返回Binder或新创建的BinderProxy。这里是BinderProxy

步骤五:客户端把想做的事告诉对象代理

步骤六:对象代理把数据转交给Binder驱动(SM)

  • 调用BinderProxy里的函数,调用transact()把数据发给Binder驱动,然后挂起等待Binder驱动返回的数据

步骤七:Binder驱动把数据给服务器,叫他做这个事

步骤八:服务器把结果返回给Binder驱动,驱动再返回给客户端

  • 调用OnTransact(),接收Binder驱动发来的数据,调用相应函数,将结果返回给驱动

系统服务进程之间的通信

http://www.jianshu.com/p/9b8e787a9bd3

总体思路:

再去翻阅系统的ActivityManagerServer的源码,就知道哪一个类是什么角色了:

IActivityManager是一个IInterface,它代表远程Service具有什么能力

ActivityManagerNative指的是Binder本地对象(类似AIDL工具生成的Stub类),这个类是抽象类,它的实现是ActivityManagerService;因此对于AMS的最终操作都会进入ActivityManagerService这个真正实现;

同时如果仔细观察,ActivityManagerNative.java里面有一个非公开类ActivityManagerProxy, 它代表的就是Binder代理对象;是不是跟AIDL模型一模一样呢?那么ActivityManager是什么?他不过是一个管理类而已,可以看到真正的操作都是转发给ActivityManagerNative进而交给他的实现ActivityManagerService完成的。

Android-Binder机制的更多相关文章

  1. 【转】Android - Binder机制

    以下几篇文章是分析binder机制里讲得还算清楚的 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通servic ...

  2. Android Binder机制彻底梳理二

    根据AIDL了解整体调用流程[重点分析AIDL流程]: 在上一次https://www.cnblogs.com/webor2006/p/11741743.html中我们已经对Android Binde ...

  3. 浅谈android binder机制

    binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...

  4. Android Binder机制简单了解

    Binder -- 一种进程间通信(IPC)机制, 基于OpenBinder来实现 毫无疑问, 老罗的文章是不得不看的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 浅谈Ser ...

  5. android binder机制之——(创建binder服务)

      Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在 ...

  6. Android Binder机制详解:手写IPC通信

    想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...

  7. Android binder机制---概述

    1.进程间通讯的原因 目前操作系统都使用虚拟存储技术,管理内存. 假设是32位机器,0-3G是用户空间,3-4G是系统使用.虚拟内存和逻辑内存都按4K分页.这样虚拟内存和逻辑内存就存在对应关系. 一个 ...

  8. android binder机制详解

    摘要 Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2 ...

  9. ANDROID BINDER机制浅析

    Binder是Android上一种IPC机制,重要且较难理解.由于Linux上标准IPC在灵活和可靠性存在一定不足,Google基于OpenBinder的设计和构想实现了Binder. 本文只简单介绍 ...

  10. android Binder机制(一)架构设计

    Binder 架构设计 Binder 被设计出来是解决 Android IPC(进程间通信) 问题的.Binder 将两个进程间交互的理解为 Client 向 Server 进行通信. 如下:bind ...

随机推荐

  1. 关于nginx部署vue项目的两个问题

    首先我使用的是后端接口+前端vue的形式,这样就涉及到跨域的问题.我是这样配置的: server { listen 80; server_name www.liangyp.xyz;//访问网址 loc ...

  2. jsp的两个include了解

    在jsp中三大指令(page --  include -- taglib)中有一个 include 然后再三个动作标签中(include -- forward -- param)中也有一个includ ...

  3. Python系列之——利用Python实现微博监控

    0x00 前言: 前几个星期在写一个微博监控系统 可谓是一波三折啊 获取到微博后因为一些字符编码问题 导致心态爆炸开发中断 但是就在昨天发现了另外一个微博的接口 一个手机微博的接口https://m. ...

  4. 跟踪spring MVC的请求

    当我们点击一个超链接时,spring MVC在后台都做了些什么呢,今天就来看看后台都干了啥 首先需要在web.xml里配置一下:

  5. 微信小程序自定义组件的使用以及调用自定义组件中的方法

    在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说 ...

  6. log4j UdpAppender

    package cappender;import org.apache.log4j.AppenderSkeleton;import org.apache.log4j.Layout;import org ...

  7. python中文画图显示乱码解决办法

    最近使用notebook Python中的matplotlib作图,发现中文设置的坐标标签和title都显示为乱码,用了网上的许多教程都不管用,嘴后解决的方式是设置下述的两行即可搞定: plt.rcP ...

  8. Redis笔记(2)单机数据库实现

    1.前言 上节总结了一下redis的数据结构和对象构成,本章介绍redis数据库一个基本面貌,是如何设计的. 2.数据库 服务器结构redisServer: redisDb *db: 一个数组,保存服 ...

  9. php完美匹配邮箱、链接地址和电话号码

    php完美匹配邮箱.链接地址和电话号码 写了好一会有问题,朋友这边很好功能,借用了.嘎嘎 //31日 更新: 匹配手机以及电话号码 重新修改,可支持18开头的手机号,并修改bug,可匹配出字符串中所有 ...

  10. 【转】获取到元素的 offsetLeft 、offsetTop属性不正常的解决方法。

    原地址:http://hi.baidu.com/huidust520/item/85da006981a6c635ad3e834e 我在工作中遇到个问题: 在ie7下和360浏览器下获取到的  offs ...