基于AIDL进程间通信技术研究与分析

时间:2022-09-27 08:48:39

基于AIDL进程间通信技术研究与分析

摘 要:进程间通信是操作系统中非常重要基础功能,实现进程通信有多种技术,比如管道通信流,IPC机制等,本文针对Android平台中进程通信技术AIDL 进行较为深入的分析探讨,并给出实例加以论述。

关键词:Android;AIDL;进程通讯

操作系统中,多个进程间进行通讯、共享资源实现系统功能平台,是非常基础和重要的功能应用;同时,进程通讯也是操作系统内核的重要功能部分。Linux操纵系统中,进程通讯一般使用传统的IPC(Inter-Process Communication,IPC)模式,且IPC模式实现了共享内存、管道、消息队列和socket等等,虽然IPC模式广泛使用,但IPC模式中UID/PID数据是由应用程序填入,存在着可靠性差,容易被篡改,难于维护等问题。

AIDL(Android Interface Definition Language)是Android系统自定义的接口描述语言,是Android平台中实现进程间通讯方式一种,属轻量级通讯机制,有着实现简单、效率较高等优点。

1 AIDL实现原理及过程

AIDL语言属于系统级原语,但语法结构和Java语言非常相似,AIDL中主要用于定义访问接口,无实现过程。与Java不同的是,AIDL允许定义函数参数传递的方向,AIDL中支持三种方向:in,out,inout。

标识为in的参数将从调用者传递到远程服务中;

标识为out的参数将从远程服务传递到调用者中;

标识为inout的参数将先从调用者传递到远程服务中,再从远程服务返回给调用者。

ADIL实现过程一般按以下步骤:(1)创建AIDL接口描述文件;(2)通过继承android.os.Iinterface接口实现远程服务AIDL接口的Java接口;(3)绑定和使用远程服务;(4)客户端调用。

AIDL通讯案例中,服务端一般由一个AIDL文件和一个IService实现接口及Service实现类组成,其中IService接口用于实现AIDL所定义的访问方法,且IService必须是android.os.Iinterface子接口,Service实现类则是AIDL接口具体的实现类。

1)定义如下AIDL文件如下:

interface IService {

int getAccountBalance();

int getCustomerList(in String branch, out String[] customerList);

}

2)Iservice接口的实现

在实现AIDL接口的Service接口其内部结构由三部分组成,1)内部静态抽象类Stub,Stub类及其子类在整个AIDL通讯中非常重要,是用于实现AIDL接口的实现类,Stub必须是Android.os.Binder的子类及IService的实现类。2)内部静态类Proxy,Proxy类属于是向远程服务提供调用接口类。3)是IService中实现的AIDL访问接口方法。Iservice接口部分代码如下所示:

public interface IService extends android.os.IInterface

{

public static abstract class Stub extends android.os.Binder {//Stub 内部静态抽象类…..

private static class Proxy implements com.lifeblood.ITestService

/内部静态类Proxy /………..

public int getAccountBalance();

public int getCustomerList(in String branch, out String[] customerList);

//现的AIDL访问接口方法

3)TestService类的实现

TestService实现类,是Android中普通Service类Android.os.Service子类,是实现AIDL描述接口的重要实现类,但其实现过程有点特殊,是通过定义ItestService.Stub类型成员变量,实现Iservice接口中调用方法,也就是AIDL中定义的描述接口方法。

4)Activity类中启动Service服务

本案例中Service只是提供远程服务,无需在本地Activity中进行访问,所以使用Intent类启动Service即可,代码结构如下: Intent service = new Intent(this, TestService.class);

startService(service);

5) AndroidManifest.XML中的配置

AndroidManifest.XML文件的配置非常重要,远程服务时其他进程访问定位到服务,就是通过AndroidManifest文件的配置名称进行定位,其Service段配置如下:

6)客户端进程调用

客户进程调用时与JNDI方式相似,通过实现ServiceConnection接口绑定远程服务,获取Service对象,从而实现调用,在客户端实例中也需拷贝AIDL接口文件。

2 测试运行

程序运行步骤如下:首先运行TestService服务端;再运行AIDLClient客户端;点击绑定连接AIDL获取Service服务,并显示调用信息。效果如图1所示。

3 结束语

本文对AIDL接口描述语言的语法结构及实现原理方式,以及在远程调用过程中AIDL的实现过程,及相关的配置方法进行了分析与探讨。AIDL是按面向对象的设计思想实现进程通讯,且AIDL语言符合Android平台中系统原语规则,为Android系统级开发过程中,进程间通讯提供了较为便利和简单访问模型。

上一篇:会计学国家特色专业分层次实践教学建设的构想 下一篇:邮政国内小包辅助分拣系统