Android权限管理--权限类型

目录

1.普通权限(normal)

2.运行时权限(dangerous)

3.签名权限(signature)

4.特殊权限(privileged)

查看android权限的等级

判断应用是否拥有对应权限


 Android 将权限分为不同的类型,包括安装时权限、运行时权限和特殊权限。每种权限类型都指明了当系统授予应用该权限后,应用可以访问的受限数据范围以及应用可以执行的受限操作范围。

1.普通权限(normal)

此类权限允许访问超出应用沙盒的数据和执行超出应用沙盒的操作。但这些数据和操作对用户隐私及对其他应用的操作带来的风险非常小。

2.运行时权限(dangerous)

运行时权限也称为危险权限,此类权限授予应用对受限数据的额外访问权限,并允许应用执行对系统和其他应用具有更严重影响的受限操作。因此需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。当应用请求运行时权限时,系统会显示运行时权限弹窗提示。

3.签名权限(signature)

当应用声明了其他应用已定义的签名权限时,如果两个应用使用同一证书进行签名,系统会在安装时向前者授予该权限。否则,系统无法向前者授予该权限。(注意:有些签名权限不适合第三方应用使用。)

该权限只需要在manifest中声明使用,同时应用和这类权限定义者拥有一样的签名系统就会默认授予应用这类权限;系统授予这类权限后应用无需像运行时权限一样动态申请。

4.特殊权限(privileged)

特殊权限与特定的应用操作相对应。只有平台和原始设备制造商 (OEM) 可以定义特殊权限。此外,如果平台和 OEM 想要防止有人执行功能特别强大的操作(例如通过其他应用绘图),通常会定义特殊权限。系统设置中的特殊应用访问权限页面包含一组用户可切换的操作。其中的许多操作都以特殊权限的形式实现。每项特殊权限都有自己的实现细节。系统会为特殊权限分配“appop”保护级别。

该权限只需要在manifest中声明使用,同时拥有系统签名且不是预置到 **/priv_app/ (如:system/priv-app)目录下,系统就会默认授予;如果应用是预置到 **/priv_app/ 目录下则需要在配置文件privapp-permissions-platform.xml中配置权限信息,否则系统不会授予权限,并且也会无法通过cts测试

查看android权限的等级

在系统源码中找到文件 /frameworks/base/core/res/AndroidManifest.xml ,这个文件中定义了系统权限等信息。

如 WRITE_MEDIA_STORAGE权限 具体如下:

权限名称:android.permission.WRITE_MEDIA_STORAGE

权限等级为:signature|privileged (该权限既是signature也是privileged权限)

<!-- @SystemApi @TestApi Allows an application to write to internal media storage
     @hide  -->
<permission android:name="android.permission.WRITE_MEDIA_STORAGE"
    android:protectionLevel="signature|privileged" />


如 READ_CONTACTS权限 具体如下:

权限名称:android.permission.READ_CONTACTS

权限等级为:dangerous (该权限为运行时权限,也就是需要应用去动态申请)

<!-- Allows an application to read the user's contacts data.
    <p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CONTACTS"
    android:permissionGroup="android.permission-group.UNDEFINED"
    android:label="@string/permlab_readContacts"
    android:description="@string/permdesc_readContacts"
    android:protectionLevel="dangerous" />

同时,也可以如下adb命令来获取权限等级

adb shell dumpsys package permision |grep -i prot

判断应用是否拥有对应权限

使用如下命令查看 adb shell dumpsys package com.miui.home

下面的install permissions记录的是该应用拥有的普通权限以及签名权限的信息,如果应用申请的权限被系统授予了,在对应权限后面就会显示 granted=true

相反,如果没有搜到相关权限的字符串,说明该应用没有声明使用这个权限

C:\Users\Administrator>adb shell dumpsys package com.miui.home
Activity Resolver Table:
... ...
... ...
Packages:
  Package [com.miui.home] (41dff44):
    userId=10089
    pkg=Package{724982d com.miui.home}
install permissions:
      android.permission.REAL_GET_TASKS: granted=true
      com.android.settings.permission.CLOUD_SETTINGS_PROVIDER: granted=true
      android.permission.WRITE_SETTINGS: granted=true
      miui.autoinstall.config.permission.AUTOINSTALL: granted=true
      android.permission.SET_PROCESS_LIMIT: granted=true
      android.permission.MODIFY_AUDIO_SETTINGS: granted=true
      miui.os.permisson.INIT_MIUI_ENVIRONMENT: granted=true
      android.miui.permission.SHELL: granted=true
      android.permission.SYSTEM_ALERT_WINDOW: granted=true

为什么应用在manifest中申请了signature权限或者privileged权限,但是还报错没有权限错误

1.对于signature权限,先判断应用是否拥有平台签名。可以通过dump命令来判断,执行 adb shell dumpsys package 包名 |findstr -i signatures 和adb shell dumpsys package android | findstr signatures,对比两者的签名是否一致。

2.对于privileged权限,先判断应用的预置路径。是否预置到.../priv-app/路径下(获取通过包信息查看应用的flag是否带有privileged),如果是就把/system/etc/permissions/的配置文件pull出来,配置文件为:privapp-permissions-platform.xml,查看自己的应用是否在这两个文件里面配置了,如果没有配置则需要在代码中进行配置。(可以将修改的文件push到/system/etc/permissions/目录,然后重启手机验证是否生效)