知识要点:

1. Binder通信机制的架构

2. 实现进程间通信 的步骤

3. 完整的Binder通信过程

4. Binder驱动的内核 空间和用户空间的数据传输

5. AIDL工具的原理

6. Binder通信过程中进程和 线程的切换,什么是Binder线程

应用实现进程间通信的类图

应用发起进程间通信调用的流程图

AIDL文件编译生成后的java文件

package com.xiaopeng.montecarlo.root;
// Declare any non-default types here with import statementspublic interface IMyAidlInterface extends android.os.IInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/public void interfaceA(int type) throws android.os.RemoteException;public void interfaceB(int type) throws android.os.RemoteException;/*** Local-side IPC implementation stub class.* 表示服务端的内部类Stub*/public static abstract class Stub extends android.os.Binder implements com.xiaopeng.montecarlo.root.IMyAidlInterface {static final int TRANSACTION_interfaceA = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);static final int TRANSACTION_interfaceB = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);private static final java.lang.String DESCRIPTOR = "com.xiaopeng.montecarlo.root.IMyAidlInterface";/*** Construct the stub at attach it to the interface.*/public Stub() {this.attachInterface(this, DESCRIPTOR);}/*** Cast an IBinder object into an com.xiaopeng.montecarlo.root.IMyAidlInterface interface,* generating a proxy if needed.*/public static com.xiaopeng.montecarlo.root.IMyAidlInterface asInterface(android.os.IBinder obj) {if ((obj == null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin != null) && (iin instanceof com.xiaopeng.montecarlo.root.IMyAidlInterface))) {return ((com.xiaopeng.montecarlo.root.IMyAidlInterface) iin);}return new com.xiaopeng.montecarlo.root.IMyAidlInterface.Stub.Proxy(obj);}@Overridepublic android.os.IBinder asBinder() {return this;}@Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {java.lang.String descriptor = DESCRIPTOR;switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(descriptor);return true;}case TRANSACTION_interfaceA: {data.enforceInterface(descriptor);int _arg0;_arg0 = data.readInt();this.interfaceA(_arg0);reply.writeNoException();return true;}case TRANSACTION_interfaceB: {data.enforceInterface(descriptor);int _arg0;_arg0 = data.readInt();this.interfaceB(_arg0);reply.writeNoException();return true;}default: {return super.onTransact(code, data, reply, flags);}}}//表示客户端的内部类Proxyprivate static class Proxy implements com.xiaopeng.montecarlo.root.IMyAidlInterface {private android.os.IBinder mRemote;Proxy(android.os.IBinder remote) {mRemote = remote;}@Overridepublic android.os.IBinder asBinder() {return mRemote;}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/@Overridepublic void interfaceA(int type) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(type);mRemote.transact(Stub.TRANSACTION_interfaceA, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}@Overridepublic void interfaceB(int type) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(type);mRemote.transact(Stub.TRANSACTION_interfaceB, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}}}
}

推荐资料:
Android Binder

Android Binder 分析——内存管理【转】

深入理解Android内核思想

简单理解Android Binder通信(AIDL)

Android之bindService流程

Binder死亡通知机制之linkToDeath

虚拟内存设置多少比较合适?

系统调用函数mmap和内核驱动mmap之间的联系与区别以及mmap原理详解以及实现内核用户空间之间的共享内存

“总而言之,常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而mmap操控文件,只需要从磁盘到用户主存的一次数据拷贝过程。说白了,

1、mmap的关键点是实现了用户空间和内核空间的数据直接交互而效率更高。

2、mmap还提供了两个进程间共享内存及相互通信的一种方式。同时,如果进程A和进程B都映射了区域C,当A第一次读取C时通过缺页从磁盘复制文件页到内存中;但当B再读C的相同页面时,虽然也会产生缺页异常,但是不再需要从磁盘中复制文件过来,而可直接使用已经保存在内存中的文件数据。

3、可用于实现高效的大规模数据传输。内存空间不足,是制约大数据操作的一个方面,解决方案往往是借助硬盘空间协助操作,补充内存的不足。但是进一步会造成大量的文件I/O操作,极大影响效率。这个问题可以通过mmap映射很好的解决。换句话说,但凡是需要用磁盘空间代替内存的时候,mmap都可以发挥其功效。”

总结:

1. Binder机制基于Client/Service架构

2. Binder机制由Client端、Service端、Service Manager、Binder驱动构成,所以的Binder服务必须向Service Manager注册,Service Manager本身就是一个Binder服务。

3. AIDL将Binder的实现标准化,帮助快速生成客户端和服务端的实现方法。服务端需定义好提供给外部的接口文件.AIDL,编译后即生成Binder服务的实现和客户端的调用类,并在服务端继承该新生成类的内部抽象类:Stub,实现定义好的接口。然后把接口文件拷贝到客户端。

4. 该类是一个interface,继承于android.os.IInterface。其中有静态抽象类Stub继承于Binder并实现服务接口,客户端通过先要向ServiceManager查询所要调用的服务,ServiceManager返回注册过的Binder句柄,然后通过客户端通过Stub.asInterface方法得到该服务的Proxy代理类,在该类中会将客户端对服务接口的调用通过Binder.transact方法转换到Binder驱动的内核调用,继而转换到该接口服务端的Stub.onTransact调用到具体实现,并通过Binder驱动将结果返回

5. Binder驱动的实现原理是基于mmap,mmap只需要禁行一次拷贝,效率更高,实现了用户空间和内核空间的直接数据传递。他为每个Binder服务维护一个Binder线程和相应的上下文信息。

Android Binder机制总结相关推荐

  1. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

    AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...

  2. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  3. 理解Android Binder机制(1/3):驱动篇

    Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...

  4. Android Binder机制学习笔记

    声明,学习材料:http://my.unix-center.net/~Simon_fu/?p=875,不是简单的copy 1    Android的进程间通讯机制(IPC)用的是自己的binder机制 ...

  5. Android - Binder机制 - Binder框架总结

    以下几篇文章是较深入分析binder机制. 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通service注册 ...

  6. Android Binder机制情景源码分析之Binder回调注册和反注册

    我们在日常开发中,经常用到Binder来进行跨进程通信,有个比较常见的场景是向服务端注册Binder回调,比如: IActivityManager中有两个成对的方法,Client端向AMS所在的服务端 ...

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

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

  8. Android Binder机制(1501210451 张志康)

    本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...

  9. Android Binder机制----实现自定义的系统服务

    一.基于源码分析Binder机制: Binder机制是Android系统中实现跨进程通信(IPC)的一种重要机制.可以说,Binder机制在android系统中无处不在,所以,要研究android源码 ...

  10. 从AIDL一窥Android Binder机制

    Binder机制在Android系统中地位毋庸置疑,system_server就通过Binder来实现进程间的通信,从而达到管理.调用一系列系统服务的能力.本文就AIDL来解读一下Binder机制的. ...

最新文章

  1. lxml xpath 爬取并正常显示中文内容
  2. 外贸企业网站建设难免遇到难题
  3. 银行业B端数字化转型逻辑
  4. 好程序员Web前端教程分享JavaScript开发技巧
  5. Servlet和模本办法
  6. Kuzzle,一种内部部署的文档后端
  7. thaiphoon burner 使用_果粉请注意,苹果iPhone 12在日常使用时有两大隐忧
  8. Java的“ for each”循环如何工作?
  9. C#笔记15 反射、特性、序列化和动态编程
  10. 电脑有电流声怎么解决_为什么音箱有电流声?电脑音箱电流声怎么消除
  11. STM32——库函数版——RGB8x8全彩点阵程序
  12. 计算机无法查看隐藏文件夹,Windows7系统无法显示隐藏文件如何解决
  13. python制作相册影集_最新的有趣开源,Python制作抖音特有的重影彩色图片!
  14. keepalived实现高可用nginx反向代理(Web集群)
  15. 数字时代,商业智能BI的落地意味着什么
  16. [读书]《自驱型成长》
  17. 全栈必备的技术栈设想
  18. Python+大数据-数据处理与分析-pandas快速入门
  19. 融合模型权限管理设计方案
  20. 最新版chrome浏览器安装Chrome插件时出现“CRX-HEADER-INVALID“解决方法

热门文章

  1. 安卓otto_奥托(Otto)背后的硬件:猴子长毛绒,成为我的声音助手
  2. win10 1903 1909 Realtek 声卡均衡器 调节失效 解决
  3. 三星android 8.0的变化,三星发布最新android 8.0升级计划 最快11月部分升级
  4. gSOAP编译以及测试过程
  5. 自学笔记:89c51单片机最小系统Protues篇
  6. zerotier使用教程_ZeroTier 中阶教程
  7. 为什么说辞职后不要回原单位工作
  8. LiteOS学习笔记-1LiteOS内核
  9. Qemu-spice云桌面创建
  10. border、transparent写超简单的三角形