AIDL原理

简介: AIDL原理

这个IPeopleManager 继承了IInterface,明显是用来IPC的,而IInterface里方法asBinder()由内部类实现,而我们在aidl里定义的四个方法,就放在这个接口里

public interface IPeopleManager extends android.os.IInterface

这个接口有一个静态内部类,Stub。它是抽象类,继承于Binder,实现了外面的接口IPersonManagerInterface

public static abstract class Stub extends android.os.Binder implements com.example.aidl.IPeopleManager

而Stub也有一个静态内部类,叫做Proxy,但只是实现了外层的接口

private static class Proxy implements com.example.aidl.IPeopleManager

Stub

Stub是工作在aidl进程的(我们的Service实例化了一个Stub,所以我们的aidl进程就是Service进程)

public static abstract class Stub extends android.os.Binder implements com.example.aidl.IPeopleManager
  {
    private static final java.lang.String DESCRIPTOR = "com.example.aidl.IPeopleManager";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.example.aidl.IPeopleManager interface,
     * generating a proxy if needed.
     */
     // 我们在onServiceConnected()方法中,就是用这个asInterface()方法,来把Service的onBind()返回的IBinder对象转化为Stub对象或Proxy对象
    public static com.example.aidl.IPeopleManager asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
       // 寻找本地Stub接口,也就是当前进程的Stub接口
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      // 如果找到了,就表示和aidl是在一个进程里
      // 否则,就不是一个进程里,比如Client
      if (((iin!=null)&&(iin instanceof com.example.aidl.IPeopleManager))) {
      // 在一个进程里,返回的是Service类里的Stub对象
        return ((com.example.aidl.IPeopleManager)iin);
      }
       // 不在一个进程里,就返回一个Proxy,所以Client获取的是proxy
            // 传入的参数,就是Service的onBind()方法返回值
      return new com.example.aidl.IPeopleManager.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    // 此方法仅用于ipc,如果是一个进程里用不到
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_basicTypes:
        {
          data.enforceInterface(descriptor);
          int _arg0;
          _arg0 = data.readInt();
          long _arg1;
          _arg1 = data.readLong();
          boolean _arg2;
          _arg2 = (0!=data.readInt());
          float _arg3;
          _arg3 = data.readFloat();
          double _arg4;
          _arg4 = data.readDouble();
          java.lang.String _arg5;
          _arg5 = data.readString();
          this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5);
          reply.writeNoException();
          return true;
        }
        case TRANSACTION_getAge:
        {
          data.enforceInterface(descriptor);
          int _result = this.getAge();
          reply.writeNoException();
          reply.writeInt(_result);
          return true;
        }
        case TRANSACTION_getName:
        {
          data.enforceInterface(descriptor);
          java.lang.String _result = this.getName();
          reply.writeNoException();
          reply.writeString(_result);
          return true;
        }
        case TRANSACTION_addPeople:
        {
          data.enforceInterface(descriptor);
          com.example.aidl.People _arg0;
          if ((0!=data.readInt())) {
            _arg0 = com.example.aidl.People.CREATOR.createFromParcel(data);
          }
          else {
            _arg0 = null;
          }
          this.addPeople(_arg0);
          reply.writeNoException();
          return true;
        }
        case TRANSACTION_getPeople:
        {
          data.enforceInterface(descriptor);
          com.example.aidl.People _result = this.getPeople();
          reply.writeNoException();
          if ((_result!=null)) {
            reply.writeInt(1);
            _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
          }
          else {
            reply.writeInt(0);
          }
          return true;
        }
        case TRANSACTION_updatePeople:
        {
          data.enforceInterface(descriptor);
          com.example.aidl.People _arg0;
          _arg0 = new com.example.aidl.People();
          com.example.aidl.People _result = this.updatePeople(_arg0);
          reply.writeNoException();
          if ((_result!=null)) {
            reply.writeInt(1);
            _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
          }
          else {
            reply.writeInt(0);
          }
          if ((_arg0!=null)) {
            reply.writeInt(1);
            _arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
          }
          else {
            reply.writeInt(0);
          }
          return true;
        }
        case TRANSACTION_updatePeople2:
        {
          data.enforceInterface(descriptor);
          com.example.aidl.People _arg0;
          if ((0!=data.readInt())) {
            _arg0 = com.example.aidl.People.CREATOR.createFromParcel(data);
          }
          else {
            _arg0 = null;
          }
          com.example.aidl.People _result = this.updatePeople2(_arg0);
          reply.writeNoException();
          if ((_result!=null)) {
            reply.writeInt(1);
            _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
          }
          else {
            reply.writeInt(0);
          }
          if ((_arg0!=null)) {
            reply.writeInt(1);
            _arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
          }
          else {
            reply.writeInt(0);
          }
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }

如果调用方和aidl在一个进程里,asInterface()获取到的就是Service.onBind()方法的返回结果,调用的就是Service里的Stub的方法,再加上同一进程用的是同一块内存空间,所以才导致in、out、inout没了实际作用

Proxy是IPC时,工作在调用方进程的,通过IBinder.transact()方法调用aidl进程的Stub.onTransact()方法


目录
相关文章
|
6月前
|
Java C++
AIDL与HIDL核心概念
AIDL与HIDL核心概念
178 0
|
6月前
AIDL中的in,out,inout
AIDL中的in,out,inout
44 0
|
6月前
|
Android开发
AIDL的使用
AIDL的使用
45 0
|
6月前
|
存储 安全 Android开发
Android数据存储:请解释ContentProvider是什么,它的主要作用是什么?
ContentProvider是Android的四大组件之一,主要负责结构化数据的管理与共享。它封装数据并提供安全的访问接口,通过URI实现应用间数据的标准化共享。ContentResolver与ContentProvider协作,处理数据的CRUD操作,使得其他应用能方便地调用和操作数据。
57 0
|
6月前
|
Java 开发工具 Android开发
[Android AIDL] --- AIDL原理简析
[Android AIDL] --- AIDL原理简析
108 0
|
Java 开发工具 Android开发
跨进程访问(AIDL服务)
跨进程访问(AIDL服务)
112 0
|
设计模式 Java Android开发
跨进程单例 | Andorid进程通信AIDL原理及应用
设计模式中的单例模式在多进程场景下会演变成多例,存在线程安全问题。本文通过跨进程通信机制让多进程共享单例。
432 0
|
Java
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(二)
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(二)
133 0
|
Java
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(一)
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(一)
221 0
|
Java
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(三)
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(三)
158 0