Android是一种权限分离的操作系统,其中每个应用以唯一的身份标识(Linux用户ID和组ID)运行。系统的不同部分也分成不同的身份。因而 Linux吧应用之间以及应用与系统之间相互隔离起来。
附加细粒度的安全功能是通过一个“许可“的机制,限定特定的进程能够执行指定的操作以及给予对每一个资源点对点的访问的URI许可。
Android安全体系结构的中心是,没有哪个应用陈旭默认可以执行对其他应用程序、操作系统或者用户有害的操作。其中包括读写用户的私有数据(如联系人或电子邮件),读写其它应用程序的文件,进行网络访问或唤醒设备。
由于内核让每一个应用程序运行在独立的沙盒之中,应用程序必须明确的分享资源及数据。他们通过声明他们所需要的沙盒未提供的权限。应用程序静态的声明他们所需要的权限,android系统在程序安装时提示用户同意它们获取这些权限。Dalvik虚拟机并不是安全的边界,因为应用程序可以执行本地代码。所有类型的应用程序——Java、native和混合的——均用相同的方式置于砂箱中并且有着相同的安全等级。
所有的Android应用程序(apk文件)必须使用一个开发人员掌握私钥的证书进行签名。该证书用于识别应用程序的作者。该证书并不需要由证书颁发机构进行签名:它是非常宽松的,典型的Android应用程序使用自签名的证书。Android证书的主要目的是要区分应用程序的作者。这样可以让系统可以给予或拒绝应用程序使用签名级别的权限或者让系统这可以允许或拒绝应用程序请求和其它应用程序相同的身份标识。
在安装的时候,Android给予每个程序包不同的Linux用户ID。软件包在设备上的生命周期中身份标识保持不变在。在不同的设备上,同样的软件包有着不同的身份标识,重要的是每个包都有不同的身份标识在给定的设备上。
安全在进程级别上实现,任意两个程序包的代码不能正常运行在同一进程中,因为他们需要以不同的Linux用户运行。可以使用每个程序包的AndroidManifest.xml中的manifest标签中的shareUserId属性将它们分配相同的用户ID。这样做的主要目的是为了安全,这两个包将被视作为同一个应用程序,拥有相同的用户ID和文件的权限。为了保持安全,只有具有相同签名(并请求同样的sharedUserId)的应用程序才会分配通用的用户ID。
任何由应用程序存储的数据将被赋予应用程序的用户ID,正常情况不能被其它应用程序访问。当使用getSharedPreferences(String,int), openFileOutput(String,int), or openOrCreateDatabase(String,int, SQLiteDatabase.CursorFactory)创建一个新的文件时,可以使用MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE标志允许任何其他应用程序来读/写入文件。当设置这些标志,该文件仍然为创建文件的应用程序所拥有,但其全局读写权限已经被设置,所以任何其他应用程序可以看到它。
一个基本的Android应用程序没有任何的权限,这意味着它不能做任何会对用户体验或设备上的任何数据造成不利影响的操作。为了使用该设备的保护功能,必须在AndroidManifest.xmlone文件中的一个或多个<uses-permission>标签上声明应用程序所需要的权限。
例如,一个应用程序需要监控接收短信会注明:
<manifest xmlns:android="http://schemas./apk/res/android"
package="com.android.app.myapp" >
<uses-permission android:name="android.permission.RECEIVE_SMS" />
...
</manifest>
应用程序在安装时,应用程序所需的权限被安装者基于签名的应用程序所声明的权限交互的进行授权。应用程序运行时不会进行权限检查,它们或者成功执行所拥有的权限,或者试图尝试自己不拥有的权限而失败并且不会对用户有任何提示。
通常一个请求权限的失败将导致应用程序抛出一个SecurityException异常。但这不一定会发生。例如,sendBroadcast(Intent)方法在所有数据被投递到接收者,当方法返回后才会进行对于数据的权限检查,所以不能接收到任何权限异常。几乎所有情况下,权限异常将会记录在日志中。
所有Android系统提供的权限可以在Manifest.permission中找到。任何应用程序也可以定义并执行其自己的权限,所以这不是所有可能的权限的详细清单。
· 特定的权限可能在程序执行的几个时刻执行:
· 当调用系统调用时,阻止应用程序执行特定的功能。
· 启动一个Activity时,组织程序打开一个Activity。
· 在发送或接受广播时,控制谁可以接受你的广播或者谁可以向你发送广播。
· 谁可以访问或操作一个特定的内容提供商。
· 绑定或者启动一项服务。