Binder⼯作机制详解(应⽤层)
⼀、Binder机制概述
在Android开发中,很多时候我们需要⽤到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,⽐如说socket、pipe等,Android中进程间通信的⽅式主要有三种:
1.标准Linux Kernel IPC 接⼝;
2.标准D-BUS接⼝;
3.Binder接⼝。
其中,Binder机制是使⽤最且最被认可的,因为Binder机制有以下优点:
1.相对于其它IPC机制,Binder机制更加简洁和快速;
2.消耗的内存相对更少;
3.传统的IPC机制可能会增加进程的开销,以及出现进程过载和安全漏洞,Binder机制则有效避免和解决了这些问题。
Binder机制是Android系统的核⼼机制,⼏乎贯穿于整个Android系统,Android系统基本上可以看作是⼀个基于binder通信机制的C/S架构,Binder就像⽹络,把Android系统的各个部分连接到了⼀起。利⽤Binder机制,可以实现以下功能:
1.⽤驱动程序来推进进程间通信;
2.通过共享内存来提⾼性能;
3.为进程请求分配每个进程的线程池;
4.针对系统中的对象引⼊了引⽤计数和跨进程的对象引⽤映射;
5.进程间同步调⽤。
⼆.什么是Binder
1. 直观来说,Binder是Android中的⼀个类,它继承了IBinder接⼝
2. 从IPC⾓度来说,Binder是Android中的⼀种跨进程通信⽅式,Binder还可以理解为⼀种虚拟的物理设备,它的设备驱动是/dev/binder,该通信⽅式在中没有
3. 从Android Framework⾓度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager,etc)和相应ManagerService的桥梁
4. 从Android应⽤层来说,Binder是客户端和服务端进⾏通信的媒介,当你bindService的时候,服务端会返回⼀个包含了服务端业务调⽤的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这⾥的服务包括普通服务和基于AIDL的服务
三、为什么Android内核要使⽤Binder
Android中有⼤量的CS(Client-Server)应⽤⽅式,这就要求Android内部提供IPC⽅法,⽽linux所⽀持的进程通信⽅式有两个问题:性能和安全性。
⽬前linux⽀持的IPC包括传统的管道,System V IPC(消息队列/共享内存/信号量),以及socket,但只有socket⽀持Client-Server的通信⽅式,由于socket是⼀套通⽤的⽹络通信⽅式,其传输效率低下切有很⼤的开销,⽐如socket的连接建⽴过程和中断连接过程都是有⼀定开销的。消息队列和管道采⽤存储-转发⽅式,即数据先从发送⽅缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收⽅缓存区,⾄少有两次拷贝过程。共享内存虽然⽆需拷贝,但控制复杂,难以使⽤。
在安全性⽅⾯,Android作为⼀个开放式,拥有众多开发者的的平台,应⽤程序的来源⼴泛,确保智能
终端的安全是⾮常重要的。终端⽤户不希望从⽹上下载的程序在不知情的情况下偷窥隐私数据,连接⽆线⽹络,长期操作底层设备导致电池很快耗尽等等。传统IPC没有任何安全措施,完全依赖上层协议来确保。⾸先传统IPC的接收⽅⽆法获得对⽅进程可靠的UID/PID(⽤户ID/进程ID),从⽽⽆法鉴别对⽅⾝份。Android为每个安装好的应⽤程序分配了⾃⼰的UID,故进程的UID是鉴别进程⾝份的重要标志。使⽤传统IPC只能由⽤户在数据包⾥填⼊UID/PID,但这样不可靠,容易被恶意程序利⽤。可靠的⾝份标记只有由IPC机制本⾝在内核中添加。其次传统IPC访问接⼊点是开放的,⽆法建⽴私有通道。⽐如命名管道的名称,system V的键值,socket的ip地址或⽂件名都是开放的,只要知道这些接⼊点的程序都可以和对端建⽴连接,不管怎样都⽆法阻⽌恶意程序通过猜测接收⽅地址获得连接。
基于以上原因,Android需要建⽴⼀套新的IPC机制来满⾜系统对通信⽅式,传输性能和安全性的要求,这就是Binder。Binder基于 Client-Server通信模式,传输过程只需⼀次拷贝,为发送发添加UID/PID⾝份,既⽀持实名Binder也⽀持匿名Binder,安全性⾼。
⼆、从⾃动⽣成的AIDL⽂件中分析Binder
1.
. hapter_2.aidl;
3.
. public interface IBookManager extends android.os.IInterface{
. /** Local-side IPC implementation stub class. */
. public static abstract class Stub extends android.os.Binder implements
. hapter_2.aidl.IBookManager{
. private static final java.lang.String DESCRIPTOR ="hapter_2.aidl.IBookManager";
9.
. /** Construct the stub at attach it to the interface. */
. public Stub(){
. this.attachInterface(this, DESCRIPTOR);
. }
14.
.
/**
. * Cast an IBinder object into hapter_2.aidl.IBookManager
. * interface, generating a proxy if needed.
. */
. public hapter_2.aidl.IBookManager asInterface(
. android.os.IBinder obj){
. if((obj ==null)){
. return null;
. }
ed是什么意思. android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
. if(((iin !=null)&&(iin hapter_2.aidl.IBookManager))){
.
return((hapter_2.aidl.IBookManager) iin);
. }
. return hapter_2.aidl.IBookManager.Stub.Proxy(obj);
. }
30.
30.
. @Override
. public android.os.IBinder asBinder(){
. return this;
t back. }
35.
.
@Override
. public boolean onTransact(int code, android.os.Parcel data, . android.os.Parcel reply,int flags)
. throws android.os.RemoteException{
. switch(code){
. ca INTERFACE_TRANSACTION:{
. reply.writeString(DESCRIPTOR);
. return true;
. }
. ca TRANSACTION_getBookList:{
. forceInterface(DESCRIPTOR);
中国国庆节. java.util.List&hapter_2.aidl.Book> _result =this . .getBookList();
.
reply.writeNoException();
. reply.writeTypedList(_result);
. return true;
. }
. ca TRANSACTION_addBook:{
. forceInterface(DESCRIPTOR);
. hapter_2.aidl.Book _arg0;
. if((0!= adInt())){
. _arg0 = hapter_2.aidl.Book.CREATOR
. .createFromParcel(data);
. }el{
carrots
.
_arg0 =null;
. }
appreciated61. }
62. this.addBook(_arg0);
63. reply.writeNoException();
64. return true;
65. }
66. ca TRANSACTION_registerListener:{
67. forceInterface(DESCRIPTOR);
exhibit68. hapter_2.aidl.IOnNewBookArrivedListener _arg0;
69. _arg0 = hapter_2.aidl.IOnNewBookArrivedListener.Stub
70. .adStrongBinder());
71. isterListener(_arg0);
72. reply.writeNoException();
73. return true;
74. }
75. ca TRANSACTION_unregisterListener:{
76. forceInterface(DESCRIPTOR);
77. hapter_2.aidl.IOnNewBookArrivedListener _arg0;
78. _arg0 = hapter_2.aidl.IOnNewBookArrivedListener.Stub
79. .adStrongBinder());
80. this.unregisterListener(_arg0);
81. reply.writeNoException();
82. return true;
83. }
84. }
85. Transact(code, data, reply, flags);
86. }
87.
. private static class Proxy implements
. hapter_2.aidl.IBookManager{
. private android.os.IBinder mRemote;
91.
.
Proxy(android.os.IBinder remote){
92. Proxy(android.os.IBinder remote){
93. mRemote = remote;
94. }
95.
. @Override
. public android.os.IBinder asBinder(){
. return mRemote;
. }
100.
蒋英实. public java.lang.String getInterfaceDescriptor(){
.
return DESCRIPTOR;
. }
104.
. @Override
. public java.util.List&hapter_2.aidl.Book> getBookList()
. throws android.os.RemoteException{
. android.os.Parcel _data = android.os.Parcel.obtain();
. android.os.Parcel _reply = android.os.Parcel.obtain();
. java.util.List&hapter_2.aidl.Book> _result;
砼怎么读 gong. try{
bec中级词汇. _data.writeInterfaceToken(DESCRIPTOR);
.
ansact(Stub.TRANSACTION_getBookList, _data,
. _reply,0);
美国偶像历届冠军. _adException();
. _result = _reply
. .hapter_2.aidl.Book.CREATOR);
. }finally{
. _le();
. _le();
. }
. return _result;