Android Binder机制总结
知识要点:
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机制总结相关推荐
- aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉
AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...
- 理解Android Binder机制(3/3):Java层
本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...
- 理解Android Binder机制(1/3):驱动篇
Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...
- Android Binder机制学习笔记
声明,学习材料:http://my.unix-center.net/~Simon_fu/?p=875,不是简单的copy 1 Android的进程间通讯机制(IPC)用的是自己的binder机制 ...
- Android - Binder机制 - Binder框架总结
以下几篇文章是较深入分析binder机制. 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通service注册 ...
- Android Binder机制情景源码分析之Binder回调注册和反注册
我们在日常开发中,经常用到Binder来进行跨进程通信,有个比较常见的场景是向服务端注册Binder回调,比如: IActivityManager中有两个成对的方法,Client端向AMS所在的服务端 ...
- android binder机制之——(创建binder服务)
Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在an ...
- Android Binder机制(1501210451 张志康)
本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...
- Android Binder机制----实现自定义的系统服务
一.基于源码分析Binder机制: Binder机制是Android系统中实现跨进程通信(IPC)的一种重要机制.可以说,Binder机制在android系统中无处不在,所以,要研究android源码 ...
- 从AIDL一窥Android Binder机制
Binder机制在Android系统中地位毋庸置疑,system_server就通过Binder来实现进程间的通信,从而达到管理.调用一系列系统服务的能力.本文就AIDL来解读一下Binder机制的. ...
最新文章
- lxml xpath 爬取并正常显示中文内容
- 外贸企业网站建设难免遇到难题
- 银行业B端数字化转型逻辑
- 好程序员Web前端教程分享JavaScript开发技巧
- Servlet和模本办法
- Kuzzle,一种内部部署的文档后端
- thaiphoon burner 使用_果粉请注意,苹果iPhone 12在日常使用时有两大隐忧
- Java的“ for each”循环如何工作?
- C#笔记15 反射、特性、序列化和动态编程
- 电脑有电流声怎么解决_为什么音箱有电流声?电脑音箱电流声怎么消除
- STM32——库函数版——RGB8x8全彩点阵程序
- 计算机无法查看隐藏文件夹,Windows7系统无法显示隐藏文件如何解决
- python制作相册影集_最新的有趣开源,Python制作抖音特有的重影彩色图片!
- keepalived实现高可用nginx反向代理(Web集群)
- 数字时代,商业智能BI的落地意味着什么
- [读书]《自驱型成长》
- 全栈必备的技术栈设想
- Python+大数据-数据处理与分析-pandas快速入门
- 融合模型权限管理设计方案
- 最新版chrome浏览器安装Chrome插件时出现“CRX-HEADER-INVALID“解决方法
热门文章
- 安卓otto_奥托(Otto)背后的硬件:猴子长毛绒,成为我的声音助手
- win10 1903 1909 Realtek 声卡均衡器 调节失效 解决
- 三星android 8.0的变化,三星发布最新android 8.0升级计划 最快11月部分升级
- gSOAP编译以及测试过程
- 自学笔记:89c51单片机最小系统Protues篇
- zerotier使用教程_ZeroTier 中阶教程
- 为什么说辞职后不要回原单位工作
- LiteOS学习笔记-1LiteOS内核
- Qemu-spice云桌面创建
- border、transparent写超简单的三角形