Binder

2019-04-10  本文已影响0人  pure粹

1.通过aidl接口自动产生java文件理解binder机制
1).定义aidl接口
interface IUserManager {
int getUserAge(in String userName);
}

2).生成IUserManager.java文件
生成的接口IUserManager 继承IInterface
包含服务端stub(继承Binder,实现IUserManager )
客户端proxy(实现IUserManager ,本身并不是Binder,所以只能代理Binder)

3).服务端
a.Stub继承Binder --> Stub实现IUserManager 即IInterface 的asBinder可以返回this
b.Stub抽象类并没有自己实现IUserManager的用户接口,由子类实现
c.OnTransaction响应客户端操作()
d.asInterface核心方法区分客户端和服务端,服务端进程返回Stub对象,客户端进程返回Proxy对象
//Stub构造方法调用:绑定descriptor和owner

  public void attachInterface(@Nullable IInterface owner, @Nullable String descriptor) {
      mOwner = owner;  
      mDescriptor = descriptor;
  }
  
  public static com.susion.demo.aidl.IUserManager asInterface(android.os.IBinder obj) {
        if ((obj == null)) {
            return null;
        }
        android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
        if (((iin != null) && (iin instanceof com.susion.demo.aidl.IUserManager))) {
            return ((com.susion.demo.aidl.IUserManager) iin);
        }
        return new com.susion.demo.aidl.IUserManager.Stub.Proxy(obj);
    }

调用者和Binder对象位于同一个进程
那么系统就会直接传给你在这个进程创建的Stub(Binder)。所以 obj.queryLocalInterface(DESCRIPTOR):

    public  IInterface queryLocalInterface(String descriptor) {
        if (mDescriptor.equals(descriptor)) {
            return mOwner;
         }
          return null;
      }

即如果参数descriptor和这个Binder的功能唯一描述相同。就会返回Binder的功能mOwner。

调用者和Binder对象不在同一个进程
这时系统实际传的是一个BinderProxy, 你可以理解为它是另一个进程中的Binder的替身。我们就可以把它当成另一个进程的Binder。我们看一下BinderProxy的queryLocalInterface()方法:

public IInterface queryLocalInterface(String descriptor) {
    return null;
}

所以此时asInterface()返回的是: IUserManager.Stub.Proxy(obj), 即代理对象,它代理了BinderProxy。
4).客户端IUserManager.Stub.Proxy
a.构造方法:mRemote代理IBinder
b.实现用户接口IUserManager:getUserAge实现,通过_data 序列化后的入参,_reply 序列化后的返回值
Proxy类的作用跨进程调用时对传给mRemote(BinderProxy)的参数做序列化,对mRemote(BinderProxy)返回值做反序列化

上一篇下一篇

猜你喜欢

热点阅读