zoukankan      html  css  js  c++  java
  • 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驱动

  • 相关阅读:
    10.$和#的区别 | 11.添加对象时如何把生成的id返回
    9. Mybatis的分页助手(pageHelper):
    8.逆向工程
    7.动态Sql语句
    6.关联查询
    5.解决列名与属性名不一致的情况
    4.接口与映射文件结合使用
    3.优化Mybatis
    2、Mybatis的编程Demo
    阿帕奇ab测试
  • 原文地址:https://www.cnblogs.com/lipeineng/p/9719508.html
Copyright © 2011-2022 走看看