Android权限机制(三) 针对权限控制如何设计App

随着Android 5.0的到来,原生的权限管理控制功能AppOps终于登场(虽然4.3的代码中已经包含)。

它的使用路径是Settings -> Security -> AppOps(有些厂商的ROM可能依然屏蔽着,或名字被修改)

AppOps引进的一个新概念"Ops",也就是"Operations"操作。
之前的第三方应用(如LBE)和手机厂商ROM(三星、MIUI),都实现了类似功能,但强调的是permission权限。
而在AppOps中,ops操作是映射到permission的(一般是1:1,但不是所有op都有对应的permission)
(见AppOpsManager.java的sOpToSwitch和sOpPerms数组)

在经历了工信部新版本的入网信息安全标准,以及各大运营商越来越详细的安全功能要求之后,
像AppOps这种权限/操作控制功能(以及更底层的SELinux/SEAndroid)将会是标配。
所以,我们来了解一下,开发者如何针对这些控制,设计开发出稳定的App。

1. 假定app用到的权限会被禁用
开发过程中,当调用到需要权限的API时候,一定要考虑两个问题:“这个API调用一定会成功吗?”“如果调用失败该怎么处理?”
权限控制的方法有很多,比如《Android权限机制(二) 权限控制的设计》中提到的,通过让checkPermission()返回false,这会导致Framework层抛出SecurityException。
所以要try/catch来处理,防止App因此crash。

ContentResolver resolver = getContentResolver();
try {
	Cursor cur = resolver.query(
			ContactsContract.Contacts.CONTENT_URI,
			null,
			null,
			null,
			ContactsContract.Contacts.DISPLAY_NAME
					+ " COLLATE LOCALIZED ASC");
} catch (SecurityException e) {
	Log.e("query", "permission denied");
}

另外一种控制方法就如AppOps、CyanogenMod或XPosed,在调用此类API的时候返回空/假数据,所以调用完API要检查得到的结果是否有效。

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

boolean isNetworkEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Log.i("test", "isNetworkEnabled = " + isNetworkEnabled);

if (isNetworkEnabled) {
	Location location = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
	Log.i("test", "location = " + location);
}
//权限被阻拦的log:
20:09:45.985: I/test(30816): isNetworkEnabled = true
20:09:45.985: I/test(30816): location = null
//权限不被阻拦的log:
20:12:07.955: I/test(31132): isNetworkEnabled = true
20:12:07.955: I/test(31132): location = Location[network *,* acc=104 et=+46m11s701ms]

2. 减少不必要的权限申请
权限的控制,其实就是涉及到的就是manifest中申请的权限,以及运行中调用需要权限的API。
可能有人会问,不申请这些权限,怎么达到我想要的功能?
其实有很多种方法,比如参考《你的Android应用完全不需要那么多的权限》。把需要权限的操作交给系统app去做,是个稳妥的选择。
更有创意的,参考最近知乎一条很有意思的提问,《搜狗号码通 lite 是如何在不越狱的情况下判定骚扰电话的?》。绕开权限控制的方法有很多。

3. 其他的权限控制方法
比如"android.permission.INTERNET"之类的底层权限,并不是在调用API做的检查,而是通过将进程添加进inet用户组来达到允许联网的效果。(/system/netd/include/Permisson.h, /system/netd/server/NetworkController.cpp)。
这就是为什么没有添加这个权限,在Java或NDK下都联网失败的原因。

还有就是在4.3引入,在4.4中强制打开的SELinux/SEAndroid。

虽然SELinux在桌面Linux上被很多人吐槽,但是在服务器和Android中,却运行得很好。
简单来说,移植到Android的SELinux(SEAndroid)是在Linux userspace和kernel共同完成的MAC控制的安全功能,
它可以由管理员/手机厂商的push来配置sepolicy(安全策略)。
常见的由SELinux阻拦导致的错误可以是open()的时候被permission denied。这往往是尝试打开某些系统目录下文件导致的。

总结
在编写App(包括NDK)的时候,一定要有权限被禁用的意识,多考虑可能因此发生的情况。
此外,要知道不同手机厂商ROM对于权限控制功能的实现以及对于sepolicy的配置不尽相同。
有可能这个手机上运行成功,那个手机上就出错了。
因此,多买些手机,多换几个版本,做详尽的测试吧!

时间: 2024-10-22 08:47:11

Android权限机制(三) 针对权限控制如何设计App的相关文章

Android安全模型之Android安全机制(应用权限)

进程沙箱为互不信任的应用程序之间提供了隔离机制,SharedUserID则为具备信任关系的应用程序提供了共享资源的机制.然而,由于用户自行安装的应用程序也不具备可信性,在默认情况下,Android应用程序没有任何权限,不能访问保护的设备API与资源.因此,权限机制是Android安全机制的基础,决定允许还是限制应用程序访问受限的API和系统资源.应用程序的权限需要明确定义,在安装时被用户确认,并且在运行时检查,执行,授予和撤销权限.在定制权限下,文件和内容提供者也可以受到保护. 具体而言,应用程

Android IPC机制(三):浅谈Binder的使用

一.前言 在上一篇博客Android IPC机制(二):AIDL的基本用法中,笔者讲述了安卓进程间通讯的一个主要方式.利用AIDL进行通讯.并介绍了AIDL的基本用法. 事实上AIDL方式利用了Binder来进行跨进程通讯.Binder是Android中的一种跨进程通讯方式.其底层实现原理比較复杂.限于笔者水平,不能展开详谈.所以这篇文章主要谈谈以AIDL为例,谈谈Binder的用法. 二.原理 上一篇文章中创建了一个IMyAidl.aidl文件,即接口文件,随即编译了该文件.生成了一个.jav

android binder 机制三(匿名Service)

什么是匿名Service?凡是没有到ServiceManager上注冊的Service,都是匿名Service. 还是拿上一篇的样例来举例,看代码: status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length) { status_t err = UNKNOWN_ERROR; const sp<IMediaPlayerService>& service(getMediaPlayerService()

linux入门基础——linux权限机制

linux权限机制 权限 权限是操作系统用来限制对资源访问的机制,权限一般分为读.写.执行.系统中每个文件都拥有特定的权限.所属用户以及所属组,通过这样的机制来限制哪些用户.哪些组可以对特定文件进行什么样的操作. 每个进程都以某个用户的身份运行,所以进程的权限与用户的权限一样,用户的权限越大,该进程拥有的权限越大. 文件权限 linux中,每个文件拥有三种权限: 权限        对文件的影响        对目录的影响 r读取    可读取文件内容    可列出目录的内容 w写入    可修

django权限机制

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局 的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model

django自带权限机制

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B

django 权限机制

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B

Django权限机制概述

1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是非常必要的. 1.1 Django的权限控制 Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B

Android随笔之——Android广播机制Broadcast详解

在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理.另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收. 一.Android广播机制三要素: 1.广播(Broadcast):用于发送广播.是一种广泛应用的在应用间传输信息的机制 2.广播接收器(Broadcast