Android开发艺术探索学习-IPC之Binder(三)

本文介绍了在Android中如何通过AIDL进行权限认证以保护远程服务,防止未授权访问。详细讲解了如何在服务端添加权限声明,并在`onBind`方法中进行权限检查。此外,还探讨了通过检查客户端包名进一步增强安全性的方法。最后,文章通过分析SmsManager源码展示了如何直接通过IBinder的`transact`方法发送短信,强调了理解Binder工作原理对于提升Android开发技能的重要性。
摘要由CSDN通过智能技术生成
    其实正常情况下,项目中能用到AIDL的机会不多,但是有一种情况是比较常用的,比如一些大厂,开发了好几个App,如果这些App都是热门应用,那么他们之间就会出现相互“勾结”的情况,AIDL就有了用武之地。以前我在某一个项目中使用到好几次AIDL,不过是给白盒测试留有接口用的。那么这里就会有一个安全问题,默认情况下我们的远程服务任何人都可以连接使用,如果不进行权限认证,将会带来某些安全隐患。因此,本节开始介绍如何在AIDL中进行权限认证。
    Android提供permission机制给第三方应用进行权限认证,这种机制我们肯定不陌生,比如应用需要申请联网功能,那么我们就需要在AndroidManifest.xml文件中申请联网功能权限。这里为MyService添加如下权限声明。
    <permission
        android:name="com.example.severdemo.permisson.ACCESS_SERVICE"
        android:protectionLevel="normal" >
    </permission>
接着上节的demo代码,我们为服务端的MyService类中的onBind(Intent intent)方法增加权限认证。
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		int checkPermission = checkCallingOrSelfPermission("com.example.severdemo.permisson.ACCESS_SERVICE");
		if (checkPermission == PackageManager.PERMISSION_DENIED) {
			return null;
		}
		return new MyServiceImpl();
	}
通过上述的步骤后,如果我们需要使用服务端的远程服务,那么就需要在客户端的AndroidManifest.xml中声明对应的权限就行。
    《Android开发艺术探索》中同时也介绍了另外一种权限认证的方法。我们可以重写服务端的onTransact方法进行权限认证,如果权限认证失败就直接返回false,这样服务端就会终止执行AIDL的方法从而达到保护服务端的效果,这里的验证方法跟上面一种方法是一样的,也是通过permission权限认证,代码示例如下。
	public class MyServiceImpl extends IAidlCall.Stub {

		@Override
		public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
				throws RemoteException {
			// TODO Auto-generated method stub
			int checkPermission = checkCallingOrSelfPermission("com.example.severdemo.permisson.ACCESS_SERVICE");
			if (checkPermission == Packa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值