精品时尚网_打造成为最具影响力时尚网
您当前的位置 : 精品时尚网  >  消费
安卓系统权限检查机制,存储位置,数据结构!
2020-11-19 07:53:44 来源:互联网 阅读:-
安卓系统权限检查机制,存储位置,数据结构

简介

Android系统越来越安全的同时,系统也越来越复杂。5.x以前(包括5.x)应用程序需要的权限,写入AndroidManifest.xml配置文件,即可。从6.0开始出现了运行时权限检查的概念,运行时权限要在代码里面去主动申请。

从此,Android系统的权限分为安装权限(install permission)和运行时权限(runtime permission)。安装权限在AndroidManifest.xml清单文件中进行配置。运行时权限需要在代码里面动态申请。

应用层

举个例子:我要做个通讯录/电话本。通讯录需要读取系统的联系人信息,然后进行显示。Android系统要求:读取系统联系人信息,必须要申请READ_CONTACTS权限。在用户授权之后,才可以去读取联系人信息。我们分别看一下5.x以前和6.x以后,是怎样申请权限的?

1. 5.x以前

安卓系统权限检查机制,存储位置,数据结构

在5.x(包括5.x)以前,只需要在应用程序的AndroidManifest.xml文件,加入上面这句,就可以了。

用户在安装这个应用程序的时候,会在安装界面上显示,应用程序申请的权限,用户可以进行权限管理,然后开始安装。应用程序在运行的时候,有读取联系人的权限就可以运行成功,否则就会失败,开发者不能在运行阶段去申请权限。

2. 6.x以后

READ_CONTACTS是运行时权限。

安卓系统权限检查机制,存储位置,数据结构

这是Google官网,发布Android 6.0的时候,对版本新特性的介绍。

主要从用户和开发者的角度来对运行时权限进行介绍。用户可以在应用程序运行的时候,管理应用权限,对权限进行授权或撤销。用户可以更好的了解和控制权限。同时,为应用开发者精简了安装和自动更新过程。

通过checkSelfPermission()检查权限,通过requestPermissions()请求权限。

安卓系统权限检查机制,存储位置,数据结构

安卓系统权限检查机制,存储位置,数据结构

首先检查,本应用是否已经获得了读取通讯录的权限。如果没有获得权限,就去主动申请权限。系统会回调onRequestPermissionsResult()方法,来通知应用程序用户是否授权。

系统层

本节从系统源码的角度,去看一下下层的设计和实现逻辑。

我们先看看checkSelfPermission()的实现逻辑。

Frameworks/base/core/java/android/app/ContextImpl.java

安卓系统权限检查机制,存储位置,数据结构

安卓系统权限检查机制,存储位置,数据结构

Frameworks/base/core/java/android/app/ActivityManagerNative.java

安卓系统权限检查机制,存储位置,数据结构

Binder IPC,下面会调用到AMS里面去。

Frameworks/base/services/core/java/com/android/server/ActivityManagerService.java

安卓系统权限检查机制,存储位置,数据结构

安卓系统权限检查机制,存储位置,数据结构

Frameworks/base/core/java/android/app/ActivityManager.java

安卓系统权限检查机制,存储位置,数据结构

这里又一次进行Binder通讯,调用到PMS。

Frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

安卓系统权限检查机制,存储位置,数据结构

permissionsState里面存储着从packages.xml读取的系统授权信息,通过调用hasPermission()获取uid是否有permName的授权。

Android系统授权信息

授权数据是保存在文件里面/data/system/packages.xml。程序运行过程中存储授权数据的数据结构在下面的类:

frameworks/base/services/core/java/com/android/server/pm/PermissionsState.java

安卓系统权限检查机制,存储位置,数据结构

PermissionsState的内部类PermissionState。一个三个变量mFlags暂不清楚有啥作用,mName存储权限的名字,mGranted标示这个权限是否被授权。这里是最小的数据单元。

安卓系统权限检查机制,存储位置,数据结构

安卓系统权限检查机制,存储位置,数据结构

PermissionData也是PermissionsState的内部类,用来存储所有uid的某一权限的授权数据。这里用到一个数据结构SparseArray,也是用来存储key-value,不过key只能是int或long。这是一个双数组结构,一个数组用来存储key,一个数组用来存储value,通过两个数组的下标进行key-value的对应。

安卓系统权限检查机制,存储位置,数据结构

PermissonsState类里面的ArrayMap的数据结构存放着系统所有的权限数据。ArrayMap是一个特殊实现的哈希表,存放的也是key-value。每一个权限,对应一个PermissionData。

安卓系统权限检查机制,存储位置,数据结构

安卓系统权限检查机制,存储位置,数据结构

安卓系统权限检查机制,存储位置,数据结构

总结一下,授权数据存放涉及到的数据结构,就是上面这三个截图。mPermissions是一个特殊的哈希表,里面存放着系统所有的授权数据,每个权限对应一个PermissionData。mUserStates是一个双数组,存放的也是key-value,存放uid和对应的授权数据,uid对应一个PermissionState。PermissionState是一个元数据类,存放一个权限的授权状态。

推荐阅读:商洛都市网

频道推荐
  • 河南也有一座花果山?曾是3A级景区,后又被撤销,今游客稀少
    河南也有一座花果山?曾是3A级景区,后又被撤

    如今在我国的很多地方上说,它的地方大部分都是有属于自己的一些山川美景,虽然比不上全国闻名的山,但也是在区域内产生较大的影响力,所以这在我国很多的旅游角度上说,都...

    2020-03-18
  • 北京最大湿地公园开园!每天限流1万人
    北京最大湿地公园开园!每天限流1万人

    受疫情影响已经关闭一个多月的南海子公园,日前重新开放。...

    2020-03-18
  • 我国首个国家森林公园,《阿凡达》中国取景地,门票225可以玩4天
    我国首个国家森林公园,《阿凡达》中国取景地,

    国家森林公园,是我国最高等级的森林公园,自然和人文景观都比较丰富,设置国家森林公园不仅是为了让游人游览,对于森林生态环境保护也有重要的意义。目前国家森林公园有近...

    2020-03-18
  • 红石河森林公园
    红石河森林公园

    红石河森林公园位于中厂镇。石红水碧,河水清冽,雾霭云霞,婀娜多姿,集奇山、怪石、幽洞、碧潭、飞瀑、古寺、古战场等自然、人文景观为一体,是一处山奇石怪、水秀潭幽、...

    2020-03-18
  • 最值得去的五个西南小众美景地
    最值得去的五个西南小众美景地

    如果你想寻一处景美人少,那么西南这五个小众美景地确实是一个不错的选择。凉山邛海邛海湖形似蜗牛,头在西北的海河出湖口—带,湖长11.5公里,最宽5.5公里。邛海是...

    2020-03-18
  • 河南必游的5个景区,除了清明上河园,都和山有关
    河南必游的5个景区,除了清明上河园,都和山有

    河南有着五千年的文明历史,也有着纵横交错的大好河山,这些都赋予了河南大量优质的旅游资源。河南境内,存在着大量各类型的景区,其中,光5A级景区就有20个。山爸觉得...

    2020-03-18