🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Android系统提供了一种描述语言来定义具有跨进程访问能力的服务接口,这种描述语言称为Android接口描述语言(Android Interface Definition Language,AIDL)。以AIDL定义的服务接口文件是以aidl为后缀名的,在编译时,编译系统会将它们转换成Java文件,然后再对它们进行编译。在本节中,我们将使用AIDL来定义硬件访问服务接口IFregService。 在Android系统中,通常把硬件访问服务接口定义在frameworks/base/core/java/android/os目录中,因 此,我们把定义了硬件访问服务接口IFregService的文件IFregService.aidl也保存在这个目录中,它的内容如下所示。 **frameworks/base/core/java/android/os/IFregService.aidl** ~~~ package android.os; interface IFregService { void setVal(int val); int getVal(); } ~~~ IFregService服务接口只定义了两个成员函数,它们分别是setVal和getVal。其中,成员函数setVal用来往虚拟硬件设备freg的寄存器val中写入一个整数,而成员函数getVal用来从虚拟硬件设备freg的寄存器val中读出一个整数。 由于服务接口IFregService是使用AIDL语言描述的,因此,我们需要将其添加到编译脚本文件中,这样编译系统才能将其转换为Java文件,然后再对它进行编译。进入到frameworks/base目录中,打开里面的Android.mk文件,修改LOCAL_SRC_FILES变量的值。 ~~~ LOCAL_SRC_FILES += \ ...... voip/java/android/net/sip/ISipService.aidl \ core/java/android/os/IFregService.aidl ~~~ 修改这个编译脚本文件之后,我们就可以使用mmm命令对硬件访问服务接口IFregService进行编译了。 ~~~ USER@MACHINE:~/Android$ mmm ./frameworks/base/ ~~~ 编译后得到的framework.jar文件就包含有IFregService接口,它继承了android.os.IInterface接口。在IFregService接口内部,定义了一个Binder本地对象类Stub,它实现了IFregService接口,并且继承了android.os.Binder类。此外,在IFregService.Stub类内部,还定义了一个Binder代理对象类Proxy,它同样也实现了IFregService接口。 前面提到,用AIDL定义的服务接口是用来进行进程间通信的,其中,提供服务的进程称为Server进程,而使用服务的进程称为Client进程。在Server进程中,每一个服务都对应有一个Binder本地对象,它通过一个桩(Stub)来等待Client进程发送进程间通信请求。Client进程在访问运行Server进程中的服务之前,首先要获得它的一个Binder代理对象接口(Proxy),然后通过这个Binder代理对象接口向它发送进程间通信请求。 在接下来的2.4.2小节中,我们就将硬件访问服务FregService从IFregService.Stub类继承下来,并且实现IFregService接口的成员函数setVal和getVal。在2.5小节中,我们再介绍如何在应用程序中获得硬件访问服务FregService的一个Binder代理对象接口,即IFregService.Stub.Proxy接口。