Android M PackageManager应用程序权限管理源码剖析及runtime permission实战

上一篇文章我们介绍了android的包管理器PackageManager对于应用程序apk的安装流程,今天我们主要研究应用程序权限的管理部分。

Android应用权限授予部分主要分为两部分,第一部分是在PKMS启动之后,且扫描完所有的app后,会对应用程序分配linux用户组ID,即授予他们所申请的资源访问权限。

第一部分主要是对install等权限进行无条件授予,而许多核心app的默认权限则还没有授予,对于用户体验来说相对差些,因此,许多必要的默认权限(runtime permission)则会在PKMS.systemReady()方法中去进一步完成。

基本概念

在介绍这两部分内容之前,我们先介绍如下概念:

用户id与组id

/*UID和GID*/

如果你是一个Linux的用户,那么一定会有如下的体验。当你的Linux的系统里面,存在多个用户的时候,你在登录了用户A之后,是没有权限去修改用户B的文件内容的。

再举个极端的例子,用普通用户的权限是没有办法进行Root用户所特有的操作的。

UID:

Linux系统用于区别不同的用户,使用不同的用户名是一种方法。但是用户名只是一种让人方便读的字符串,对机器来讲是没有意义的。

为了方便机器的读取,Linux采用了一个32位的整数记录和区分不同的用户。这个用来区分不同用户的数字被称为UserID,简称UID。

root的UID为0,普通的UID一般是从500开始。在Android上,一个用户 UID标示一个应用程序,相当于linux中的一个用户。应用程序在安装时被分配用户UID,应用程序在设备上的存续期间内,用户UID保持不变。对于普通的应用程序,GID即等于UID。

GID:

除了用户的概念,Linux的系统还有用户组的概念。同一个用户组的用户之间具有相似的特征。

假如我们把某一个用户加入到root组,那么这个用户就可以浏览root用户组目录的文件。如果root用户把某个文件的读写执行权限开放,root用户组的所有用户都可以修改该文件。

Permission概念

Package的权限信息主要通过在AndroidManifest.xml中通过一些标签来指定。

如 <permission> 标签, <permission-group> 标签, <permission-tree> 等标签。如果package需要申请使用某个权限,那么需要使用<use-permission> 标签来指定,系统的权限定义在frameworks/base/core/res/AndroidManifest.xml(framework-res.apk)当中这些权限会由PKMS启动进行扫描的时候添加到对应的数据结构里。

比如要想使用网络功能:

<uses-permissionandroid:name="android.permission.INTERNET" />

这个权限在APK安装扫描过程中会保存在PackageParser.Package.requestedPermissions中,其在platform.xml中对应的item如下:

<permission name="android.permission.INTERNET" >
      <group gid="inet" />                                            
</permission>

这里定义了上层android.permission. INTERNET权限对应的Linux用户组gid为inet。并且在解析xml文件的时间也为每个permission标签创建一个BasePermission对象,该对象中包含一个gids数组,用来保存与该权限对应的Linux用户组。

mGlobalGids数组的值是解析platform.xml文件得到的。

 

·        一个权限主要包含三个方面的信息:权限的名称,属于的权限组和保护级别。一个权限组是指把权限按照功能分成的不同的集合。每一个权限组包含若干具体权限,例如在storage权限组中包含android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE两个和存储访问相关的权限。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值