博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AIDL使用以及原理分析
阅读量:6008 次
发布时间:2019-06-20

本文共 1328 字,大约阅读时间需要 4 分钟。

概要

为了大家能够更好的理解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方法去与服务端通信。

以上就是两者的区别。

 

 

 

 

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();

 

 

 

转载于:https://www.cnblogs.com/lipeineng/p/9719508.html

你可能感兴趣的文章
[20150913]文件检查点-表空间offline.txt
查看>>
腾讯玩O2O手机维修 巨头入局引市场大变
查看>>
HDOJ 2021 发工资咯:)(利用了一种取余的思想)
查看>>
ASP.NET程序读取二代身份证(附源码)
查看>>
Oracle的dbms_output包的put()和put_line()的区别只是有没有回车换行吗?(转)
查看>>
HDOJ 2056 Rectangles
查看>>
第四章——SQLServer2008-2012资源及性能监控(2) .
查看>>
HDOJ 1420 Prepared for New Acmer(DP)
查看>>
View的Layout过程源码分析
查看>>
Step by step guide to set up master and slave machines(转)
查看>>
HDOJ(HDU) 2103 Family planning(需要注意范围)
查看>>
我的Android进阶之旅------>Android关于dp(dip)、sp转px的工具类
查看>>
[Phoenix] 二、数据类型
查看>>
第三届中国互联网安全领袖峰会:聚焦新秩序下网络安全之道
查看>>
pthread_rwlock_t读写锁函数说明
查看>>
股市猜测6个历史和未来的最高最低点位
查看>>
判断输入年份是否为闰年的另一种方法
查看>>
使用TT模板+mvc+wcf实现简单查询
查看>>
linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
查看>>
Kubernetes持续部署Docker Apps
查看>>