Android应用程序的权限机制

  (一)Android安全架构

  Android安全架构中一个中心思想就是:应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作。

  一个应用程序的进程就是一个安全的沙盒。它不能干扰其它应用程序,除非显式地声明了“permissions”,以从而获取基本沙盒所不具备的能力。对于应用程序请求的“permissions” 可以有几种处理方式:如自动允许该权限,通过用户提示或者证书来允许或禁止该权限。应用程序需要的“permissions”在程序中静态声明,在程序安装时被系统知晓,并不会再改变。

  所有的Android应用程序(.apk文件)必须用数字证书进行签名认证,该证书的私钥由开发者保有。该证书可用以识别应用程序的作者。该证书无需CA签名认证(注:CA就是一个第三方的证书认证机构,如verisign等)。Android应用程序允许(而且一般也都是)使用self-signed证书(自签名证书)。证书主要用于在应用程序之间建立信任关系,而不是用于控制程序是否可以安装。签名影响安全性的最重要的方式是通过决定谁可以进入基于签名的permisssions,以及谁可以共享用户IDs。

  (二)应用程序的用户IDs和数据访问机制

  应用程序的用户IDs:

  每一个Android应用程序(.apk文件)都会在安装时获取一个独有的Linux用户ID,这就为它建立了一个沙盒,使其不能与其他应用程序进行接触。该用户ID在安装时分配,并在该设备上一直保持同一数值。

  由于安全性限制措施是发生在进程级,所以两个package中的代码不会运行在同一个进程当中,而是作为不同的Linux用户出现。我们可以通过使用AndroidManifest.xml文件中的manifest标签的sharedUserId属性,来使不同的package共用同一个用户ID。通过这种方式,这两个package就会被认为是同一个应用程序,拥有同一个用户ID(实际不一定),并且拥有同样的文件存取权限。

  注意:为了保持安全,仅当两个应用程序被同一个签名签署的时候(并且请求了同一个sharedUserId)才会被分配同样的用户ID。

  数据访问机制:

  所有存储在应用程序中的数据都会被赋予一个属性——该应用程序的用户ID,这使得其他应用程序无法访问这些数据。当通过以下方法getSharedPreferences(String, int),openFileOutput(String, int)或者 openOrCreateDatabase(String, int,SQLiteDatabase.CursorFactory)来创建一个新文件时,你可以通过使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE标志位来设置是否允许其他应用程序来读写这个文件。当设置这些标志位时,该文件仍然属于该应用程序,但是它对于其他任何应用程序也是可见的。

  (三)权限(permission)

  权限用来描述是否允许做某件事。Android系统中权限分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system)。系统中所有预定义的权限根据作用的不同,分别属于不同的级别。

  对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限,应用程序拥有platform级别的认证才能申请。当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。

  系统应用可以使用任何权限。权限的声明者可无条件使用该权限。

  目前Android系统定义了许多权限,通过SDK文档用户可以查询到哪些操作需要哪些权限,然后按需申请。

  要赋予应用程序权限,首先要在AndroidManifest.xml中使用一个或多个标签进行声明。例如,一个应用程序想用控制谁能启动一个activities,它可以为声明一个该操作的许可,如下:

  

  <permission< p="">

  android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"

  android:label="@string/permlab_deadlyActivity"

  android:description="@string/permdesc_deadlyActivity"

  android:permissionGroup="android.permission-group.COST_MONEY"

  android:protectionLevel="dangerous"

  />

 

  (四)使用权限(uses-permission)

  应用需要的权限应当在users-permission属性中申请,所申请的权限应是已经被系统或某个应用程序定义过的,否则视为无效申请。同时,使用权限的申请需要遵循权限授予条件,非platform认证的应用程序无法申请高级权限。

  所以,应用程序的权限级别大致分为两种:

   第一种低级点的(permission的protectlevel属性为normal或者dangerous),其调用者apk只需声明即可拥有其permission。

   第二种高级点的(permission的protectlevel属性为signature或者signatureorsystem),其调用者apk就需要和被调用的apk一样拥有相同的signature。

  若想拥有所需的权限,必须在AndroidManifest.xml文件中包含一个或更多的标签来声明此权限。

  例如低级权限需要监听来自SMS消息的应用程序将要指定如下内容:

本文标题:Android应用程序的权限机制
http://www.ltesting.net/ceshi/ceshijishu/sjcs/android/2011/0624/202781.html

更多相关文章

  1. [置顶] Android模拟打电话应用程序实现分析
  2. Android应用程序框架层和系统运行库层日志系统源代码分析
  3. 10个常见的 Android(安卓)新手误区
  4. android应用程序签名
  5. Android架构组件简介
  6. 【23】Android(安卓)应用程序入口探究
  7. Android(安卓)设备root 原理及方法
  8. Android自定义权限的使用
  9. 史上最全的Android开发学习教程集锦【初学者】

随机推荐

  1. Android(安卓)性能测试实践(一)
  2. 分析android预装apk以及相关的实现手段
  3. android设置控件样式(边框颜色,圆角)和图片
  4. Android系统源代码情景分析 第3版
  5. 【2017年学习输出内容记录】Android系统
  6. Flutter Android(安卓)端热修复(热更新)实
  7. Android(安卓)应用程序窗体显示状态操作(r
  8. Android(安卓)Button及TextView动态变换
  9. Android(安卓)SQLite最简单demo实现(增删
  10. Android用Application设置全局变量以及使