Android系统进程间通信Binder机制在应用程序框架层(5)

二. HelloService接口的定义

前面我们在学习Android系统的硬件抽象层(HAL)时,在在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务这篇文章中,我们编写了一个硬件服务HelloService,它的服务接口定义在frameworks/base/core/java/android/os/IHelloService.aidl文件中:

package android.os;      interface IHelloService   {       void setVal(int val);       int getVal();   }  

这个服务接口很简单,只有两个函数,分别用来读写硬件寄存器。

注意,这是一个aidl文件,编译后会生成一个IHelloService.java。我们来看一下这个文件的内容隐藏着什么奥秘,可以这么神奇地支持进程间通信。

/*   * This file is auto-generated.  DO NOT MODIFY.   * Original file: frameworks/base/core/java/android/os/IHelloService.aidl   */   package android.os;   public interface IHelloService extends android.os.IInterface   {       /** Local-side IPC implementation stub class. */       public static abstract class Stub extends android.os.Binder implements android.os.IHelloService       {           private static final java.lang.String DESCRIPTOR = "android.os.IHelloService";           /** Construct the stub at attach it to the interface. */           public Stub()           {               this.attachInterface(this, DESCRIPTOR);           }              /**          * Cast an IBinder object into an android.os.IHelloService interface,          * generating a proxy if needed.          */           public static android.os.IHelloService 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 android.os.IHelloService))) {                   return ((android.os.IHelloService)iin);               }               return new android.os.IHelloService.Stub.Proxy(obj);           }              public android.os.IBinder asBinder()           {               return this;           }              @Override            public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException           {               switch (code)               {                   case INTERFACE_TRANSACTION:                   {                       reply.writeString(DESCRIPTOR);                       return true;                   }                   case TRANSACTION_setVal:                   {                       data.enforceInterface(DESCRIPTOR);                       int _arg0;                       _arg0 = data.readInt();                       this.setVal(_arg0);                       reply.writeNoException();                       return true;                   }                   case TRANSACTION_getVal:                   {                       data.enforceInterface(DESCRIPTOR);                       int _result = this.getVal();                       reply.writeNoException();                       reply.writeInt(_result);                       return true;                   }               }               return super.onTransact(code, data, reply, flags);           }              private static class Proxy implements android.os.IHelloService           {               private android.os.IBinder mRemote;                  Proxy(android.os.IBinder remote)               {                   mRemote = remote;               }                  public android.os.IBinder asBinder()               {                   return mRemote;               }                  public java.lang.String getInterfaceDescriptor()               {                   return DESCRIPTOR;               }                  public void setVal(int val) throws android.os.RemoteException               {                   android.os.Parcel _data = android.os.Parcel.obtain();                   android.os.Parcel _reply = android.os.Parcel.obtain();                   try {                       _data.writeInterfaceToken(DESCRIPTOR);                       _data.writeInt(val);                       mRemote.transact(Stub.TRANSACTION_setVal, _data, _reply, 0);                       _reply.readException();                   }                   finally {                       _reply.recycle();                       _data.recycle();                   }               }                  public int getVal() throws android.os.RemoteException               {                   android.os.Parcel _data = android.os.Parcel.obtain();                   android.os.Parcel _reply = android.os.Parcel.obtain();                   int _result;                   try {                       _data.writeInterfaceToken(DESCRIPTOR);                       mRemote.transact(Stub.TRANSACTION_getVal, _data, _reply, 0);                       _reply.readException();                       _result = _reply.readInt();                   }                   finally {                       _reply.recycle();                       _data.recycle();                   }                   return _result;               }           }              static final int TRANSACTION_setVal = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);           static final int TRANSACTION_getVal = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);       }          public void setVal(int val) throws android.os.RemoteException;       public int getVal() throws android.os.RemoteException;   }  

这里我们可以看到IHelloService.aidl这个文件编译后的真面目,原来就是根据IHelloService接口的定义生成相应的Stub和Proxy类,这个就是我们熟悉的Binder机制的内容了,即实现这个HelloService的Server必须继续于这里的IHelloService.Stub类,而这个HelloService的远程接口就是这里的IHelloService.Stub.Proxy对象获得的IHelloService接口。接下来的内容,我们就可以看到IHelloService.Stub和IHelloService.Stub.Proxy是怎么创建或者使用的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwjzdd.html