Android AIDL使用详解

本文详细介绍了Android Interfacedefinition language (AIDL) 的概念及其使用方法,包括创建AIDL文件、实现接口方法、暴露接口给客户端的过程。此外,还提供了AIDL中使用Java类的具体步骤及一个完整的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口
icp:interprocess communication :内部进程通信

 

2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述:

--1.Create your .aidl file - This file defines an interface (YourInterface.aidl) that defines the methods and fields available to a client.
创建你的aidl文件,我在后面给出了一个例子,它的aidl文件定义如下:写法跟java代码类似,但是这里有一点值得注意的就是它可以引用其它aidl文件中定义的接口,但是不能够引用你的java类文件中定义的接口

--2.Add the .aidl file to your makefile - (the ADT Plugin for Eclipse manages this for you). Android includes the compiler, called AIDL, in the tools/ directory.
编译你的aidl文件,这个只要是在eclipse中开发,你的adt插件会像资源文件一样把aidl文件编译成java代码生成在gen文件夹下,不用手动去编译:编译生成AIDLService.java如我例子中代码


--3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from your AIDL interface. This interface has an inner abstract class named Stub that inherits the interface (and implements a few additional methods necessary for the IPC call). You must create a class that extends YourInterface.Stub and implements the methods you declared in your .aidl file.
实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService
Stub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法,下面是我在例子中实现的Stub类:
 

Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了。

--4.Expose your interface to clients - If you're writing a service, you should extend Service and override Service.onBind(Intent) to return an instance of your class that implements your interface.
第四步告诉你怎么在客户端如何调用服务端得aidl描述的接口对象,doc只告诉我们需要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,绑定服务时不是需要一个ServiceConnection对象么,在没有了解aidl用法前一直不知道它是什么作用,其实他就是用来在客户端绑定service时接收service返回的IBinder对象的:

 

mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。

4.aidl中使用java类,需要实现Parcelable接口,并且在定义类相同包下面对类进行声明:

上面我定义了Rect1类
之后你就可以在aidl接口中对该类进行使用了
package com.cao.android.demos.binder.aidl; 
import com.cao.android.demos.binder.aidl.Rect1;
interface AIDLActivity {  
    void performAction(in Rect1 rect);  

注意in/out的说明,我这里使用了in表示输入参数,out没有试过,为什么使用in/out暂时没有做深入研究。

5.aidl使用完整示例,为了清除说明aidl使用,我这里写了一个例子,例子参考了博客:

http://blog.csdn.net/saintswordsman/archive/2010/01/04/5130947.aspx

作出说明

例子实现了一个AIDLTestActivity,AIDLTestActivity通过bindservice绑定一个服务AIDLTestService,通过并获取AIDLTestActivity的一个aidl对象AIDLService,该对象提供两个方法,一个是registerTestCall注册一个aidl对象,通过该方法,AIDLTestActivity把本身实现的一个aidl对象AIDLActivity传到AIDLTestService,在AIDLTestService通过操作AIDLActivity这个aidl远端对象代理,使AIDLTestActivity弹出一个toast,完整例子见我上传的资源:

http://download.csdn.net/source/3284820

文章仓促而成,有什么疑问欢迎大家一起讨论。

 

对比启明星辰、绿盟、安恒等品牌WAF在应用攻击保护时的策略防护能力。 二. 测试步骤 2.1 环境漏洞验证 验证序号 1 验证方法 用and 1=1and 1=2验证注入漏洞 测试步骤 1. 在浏览器打开http://192.168.1.155/ypnew_view.asp?id=791正常页面 2. 修改浏览器URL:http://192.168.1.155/ypnew_view.asp?id=791 and 1=1-- 3. 修改浏览器URL:http://192.168.1.155/ypnew_view.asp?id=791 and 1=2-- 漏洞验证 若执行步骤2与步骤1均能正常访问页面,执行步骤3得出不同的访问页面,说明存在注入漏洞 验证结果 用户签字 2.2 防护效果测试 测试序号 1 测试项目 防止黑客利用注入漏洞获取数据库版本操作系统信息 描述 获取数据库版本操作系统信息是黑客入侵的前提,本项主要是测试WEB防护设备能否有效的防止数据库版本操作系统信息的泄漏 测试步骤 1、 正常浏览192.168.1.155/ypnew_view.asp?id=791 2、 在攻击机浏览器中输入以下URL: http://192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,@@version,'6',null,null,null,null,null,null,null,null from sysobjects-- 预期结果 数据库版本信息未泄露 备注 如出现下图,说明数据库版本信息泄露,WEB应用防护设备未起作用 测试结果 用户签字 测试序号 2 测试项目 防止黑客利用注入漏洞获取数据库库名 描述 数据库库名是黑客进行SQL注入时常获取的信息,有效地防护数据库信息可以能大大降低注入攻击的风险,本项主要测试WEB应用防护设备是否能防护数据库信息泄露漏洞 测试步骤 在攻击机浏览器中输入以下URL: http://192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,db_name(),'6',null,null,null,null,null,null,null,null from sysobjects-- 预期结果 数据库信息未泄露 备注 若在测试结果中出现下图,说明没有防护效果。 测试结果 客户签名 测试序号 3 测试项目 防止黑客通过注入漏洞获取数据库表名信息 描述 当黑客成功获得数据库的版本数据库库名后,数据库中表的名称内容就是SQL注入攻击的下一目标,本项主要测试WEB应用防护设备是否能防护获取数据库表名的攻击 测试步骤 1. 在攻击机浏览器中输入以下URL: 192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,(select top 1 name from sysobjects where xtype='U' and name not in (select top 2 name from sysobjects where xtype='U')),null,null,null,null,null,null,null,null,null from sysobjects-- 2. 在攻击机浏览器中输入以下URL: 192.168.1.155/ypnew_view.asp?id=791 and 1=2 union all select 1,2,3,4,(select top 1 name from sysobjects where xtype='U' and name not in (select top 37 name from sysobjects where xtype='U')),null,null,null,null,null,null,null,null,null from sysobjects-- 预期结果 数据库table名未泄露 备注 如出现以下图示,说明WEB防护效果未起作用,数据库表泄漏 测试结果 用户签字 测试序号 4 测试项目 防止黑客利用update修改数据库的内容 描述 如果黑客成功获取了数据库表的相关信息,将会尝试修改表内的数据,直接篡改网站内容,因此对于恶意修改数据库内容的入侵要求严格防护.本项将测试web防护设备是否能防护通过update方式修改数据库内容的恶意攻击 测试步骤 利用注入漏洞使用Update方式修改数据库内容 预期结果 数据库内容未被篡改 备注 攻击机中输入以下URL,如出现页面被篡改,说明防护失效 http://192.168.1.155/ypnew_view.asp?id=791 测试结果 用户签字 测试序号 5 测试项目 防止黑客利用注入漏洞获取后台账号信息 描述 后台管理员的账号密码信息如果泄露,黑客就可以对网站进行各种严重损坏客户利益的破坏,本项测试WEB应用防护设备能否有效防护网站管理员后台账号密码信息泄漏 测试步骤 利用注入漏洞获取后台账号信息 预期结果 不能获得后台用户名密码: 备注 当出现下图时,说明用户名密码被盗取,WEB应用防护设备无效果 打开http://192.168.1.155/admin/index.asp,输入用户名密码,可直接管理后台:http://192.168.1.155/admin 测试结果 客户签名
评论 117
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值