欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android - Binder驱动

程序员文章站 2022-07-11 20:37:57
AIDL使用以及IPC原理分析(进程间通信) 概要 为了大家能够更好的理解android的进程间通信原理,以下将会从以下几个方面讲解跨进程通讯信: 1. 必要了解的概念 2. 为什么要使用aidl进程间通信 3. 可能遇到的问题以及解决办法 4. aidl的使用,通过android提供的aidl实现 ......

aidl使用以及ipc原理分析(进程间通信)

概要

为了大家能够更好的理解android的进程间通信原理,以下将会从以下几个方面讲解跨进程通讯信:
1. 必要了解的概念
2. 为什么要使用aidl进程间通信
3. 可能遇到的问题以及解决办法
4. aidl的使用,通过android提供的aidl实现一个进程间通信
5. 不使用aidl,手动编写binder实现进程间通信
6. 分析aidl的原理,梳理andriod进程间通信相关知识

 

我们从android对aidl文件自动生成的java类中可以看到asinterface()这个接口的实现,大概的意思就是:
如果客户端和服务端在同一个进程下,那么asinterface()将返回stub对象本身,否则返回stub.proxy对象。

也就是说asinterface()返回的对象有两种可能(实际上有三种,还有一种是null),stub和stub.proxy。它们有什么区别呢?

如果在同一个进程下的话,那么asinterface()将返回服务端的stub对象本身,因为此时根本不需要跨进称通信,那么直接调用stub对象的接口就可以了,返回的实现就是服务端的stub实现,也就是根本没有跨进程通信;

如果不是同一个进程,那么asinterface()返回是stub.proxy对象,该对象持有着远程的binder引用,因为现在需要跨进程通信,所以如果调用stub.proxy的接口的话,那么它们都将是ipc调用,它会通过调用transact方法去与服务端通信。

以上就是两者的区别。

 

 

android 跨进程通信 深入浅出aidl(二)

 

 

在android系统中不同的app拥有不同的进程,每个进程都在各自的内存区域。相互不同通信,这是linux底层决定的。不同的进程之间想要通信,就需要通过binder。

binder驱动位于系统的底层,有一块共享内存区域,不同的进程想要相互通信,就需要通过binder驱动,被访问的进程也就是服务端会在binder驱动这块共享内存中产生一个引用。
客户端进程会持有同样的引用到这块共享内存中找到这个引用。所有的通信都是在这块共享内存中完成的。

进程a想访问进程b,进程a中aidl文件中的proxy会将数据写到底层binder驱动里面,然后让binder驱动里面的c、c++去访问进程b中aidl文件的stub里面的函数。

执行mremote.transact(stub.transaction_connect, _data, _reply, 0);之后,binder驱动通过ibinder引用找到服务端进程aidl引用,调用服务端aidl对象中的方法,

通过ontransact(int code, android.os.parcel data, android.os.parcel reply, int flags)回调给客户端。

什么时候把aidl引用写入到binder驱动的,在构造函数初始化的时候,也会执行父类binder的构造函数,在父类的构造函数中执行写入。
  public stub() {
this.attachinterface(this, descriptor);
  }
  public binder(){
       //native方法
       init();

 }
  private native final void init();

 

 

 

android - binder驱动