Android权限 - 权限分类

1.andriod6.0权限
    andriod6.0系统把权限分为两个级别:
  (1)Normal Permissions,即普通权限,这类权限不会潜藏有侵害用户隐私和安全的问题,比如,访问网络的权限,访问WIFI的权限等;
  (2)Dangerous Permissions,即危险权限,这类权限会直接威胁到用户的安全和隐私问题,比如说访问短信,相册等权限。
  
权限组:普通权限是单条的权限,而危险权限是以组展示的。所有危险的权限都属于权限组。
也就是说,当你接受一个危险权限时,它所在的这个组里面的其他所有访问权限也将会被自动获取权限(即使是Android 8.0之后的版本,再次获取危险权限组里面的别的权限也不会弹框让用户确认的)。
当然,这类危险权限也是需要在manifest中注册的,否则动态申请会失败。

2.Normal Permissions (普通权限)
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
使用以上权限是不会威胁到用户安全的,所以这类权限是可以直接的在manifest里面直接的使用,而且在安装后也会直接的生效了。

3.Dangerous Permissions (危险权限)
(1)SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
(2)STORAGE(存储)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
(3)CONTACTS(联系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
(4)PHONE(手机)
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
(5)CALENDAR(日历)
READ_CALENDAR
WRITE_CALENDAR
(6)CAMERA(相机)
CAMERA
(7)LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
(8)SENSORS(传感器)
BODY_SENSORS
(9)MICROPHONE(麦克风)
RECORD_AUDIO
危险权限和普通权限也有区别,普通权限是单条的权限,而危险权限是以组展示的。
也就是说,当你接受一个危险权限时,不但接受的是界面上展示的这一个权限,而是它所在这个组里面的其他所有访问权限也将会被自动获取权限。
比如,一旦WRITE_CONTACTS被授权了,App也有READ_CONTACTS和GET_ACCOUNTS的权限了(android 8.0之前),Android 8.0之后的版本,再次获取危险权限组里面的别的权限也不会弹框让用户确认。

4.android 8.0 权限策略变化
    在 Android 8.0 (targetSdkVersion 26)之前,如果应用在运行时请求权限并且被授予该权限,系统会将属于同一权限组并且在清单中注册的其他权限也一起授予应用。
对于针对 Android 8.0 的应用,系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。
例如,假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。
如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。
如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。
如果不申请,会抛异常。

5.Android 10 权限组变化
在STORAGE权限组中,新增了ACCESS_MEDIA_LOCATION(从媒体收藏中读取位置信息)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
ACCESS_MEDIA_LOCATION

6.signature|privileged permissions 签名/特权 权限
常见的一些signature|privileged permissions:
DELETE_PACKAGES
INSTALL_PACKAGES
MANAGE_USERS
UPDATE_APP_OPS_STATS
BATTERY_STATS
WRITE_SECURE_SETTINGS
WRITE_MEDIA_STORAGE
...
等等
这部分权限也需要在AndroidManifest文件中声明。
在AndroidManifest文件中声明后,需要在frameworks\base\data\etc\privapp-permissions-platform.xml中进行声明。格式如下:

<privapp-permissions package="com.android.packageinstaller">
    <permission name="android.permission.DELETE_PACKAGES"/>
    <permission name="android.permission.INSTALL_PACKAGES"/>
    <permission name="android.permission.USE_RESERVED_DISK"/>
    <permission name="android.permission.MANAGE_USERS"/>
    <permission name="android.permission.UPDATE_APP_OPS_STATS"/>
    <permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
    <permission name="android.permission.PACKAGE_USAGE_STATS"/>
</privapp-permissions>

privapp-permissions-platform.xml的说明为:This XML file declares which signature|privileged permissions should be granted to privileged
applications that come with the platform. 

另外,在Android 10中,在frameworks\base\data\etc文件夹下新增了对应包名的xml文件来声明对应包名应用的签名/特权权限,如com.android.settings.xml,com.android.launcher3.xml,com.android.systemui.xml,com.android.dialer.xml等等。
这些文件最终被编译到系统的system/etc/permissions目录,在SystemConfig中被读取出来。

<permissions>
    <privapp-permissions package="com.android.dialer">
        <permission name="android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK"/>
        <permission name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
        <permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
        <permission name="android.permission.MODIFY_PHONE_STATE"/>
        <permission name="android.permission.STATUS_BAR"/>
        <permission name="android.permission.STOP_APP_SWITCHES"/>
        <permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
        <permission name="com.android.voicemail.permission.WRITE_VOICEMAIL"/>
        <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
        <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
    </privapp-permissions>
</permissions>

在SystemConfig中,这些文件中的权限信息即privapp-permissions标签内的内容,通过readPrivAppPermissions解读出来后存储在ArrayMap<String, ArraySet<String>> mPrivAppPermissions中。mPrivAppPermissions中保存的权限信息,通过getPrivAppPermissions来供别的类使用,主要在PermissionManagerService中被使用到。

如果在应用的AndroidManifest文件中声明了使用以上签名/特权权限,而又没有在privapp-permissions-platform.xml中进行声明,会出现以下报错:
04-24 06:11:41.367 11008 11008 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
04-24 06:11:41.367 11008 11008 E AndroidRuntime: java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {com.android.dialer: android.permission.REAL_GET_TASKS}
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.systemReady(PermissionManagerService.java:2979)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.access$100(PermissionManagerService.java:123)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService$PermissionManagerServiceInternalImpl.systemReady(PermissionManagerService.java:3040)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.PackageManagerService.systemReady(PackageManagerService.java:21876)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.SystemServer.startOtherServices(SystemServer.java:2065)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.SystemServer.run(SystemServer.java:521)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.SystemServer.main(SystemServer.java:358)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:913)


 

猜你喜欢

转载自blog.csdn.net/hanhan1016/article/details/105863586