一、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
网友评论