Android AIDL相关

2022-12-07  本文已影响0人  梁佳凝

一、AIDL

AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,我们无需自己去写这段繁杂的代码,只需要在需要的时候调用即可。

在aidl生成的java代码中

比如有aidl文件:

package com.scott.aidl;

interface IPerson{

    String greet(String someone);

}

生成的代码:

public interface IPerson extends android.os.IInterface {

 // Stub类是继承于Binder类的

  public  static  abstract  class  Stub  extends  android.os.Binder  implements com.scott.aidl.IPerson {

  //asInterface方法

     public static com.scott.aidl.IPerson asInterface(android.os.IBinder obj) {

            if ((obj == null)) {

                return null;

            }

            android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);

            if (((iin != null) && (iin instanceof com.scott.aidl.IPerson))) {

                return ((com.scott.aidl.IPerson) iin);

            }

            return new com.scott.aidl.IPerson.Stub.Proxy(obj);

        }

 }

private  static  class  Proxy  implements  com.scott.aidl.IPerson {

}

}

1、Stub类

Stub类是继承于Binder类的,也就是说Stub实例就是Binder实例。

2、Stub.asInterface(IBinder obj) 函数的作用

如果客户端和服务端在同一个进程下,那么asInterface()将返回Stub对象本身,否则返回Stub.Proxy对象。

也就是说asInterface()返回的对象有两种可能(实际上有三种,还有一种是null),Stub和Stub.Proxy。

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

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

参考:理解Aidl中Stub和Stub.Proxy

https://blog.csdn.net/scnuxisan225/article/details/49970217

上一篇下一篇

猜你喜欢

热点阅读