Binder

作者: pure粹 | 来源:发表于2019-04-10 11:04 被阅读0次

    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)返回值做反序列化

    相关文章

      网友评论

          本文标题:Binder

          本文链接:https://www.haomeiwen.com/subject/wwvvvqtx.html