Android..PackageManagerService权限校验

        在android系统中,应用程序如果想操作系统资源,往往都需要去申请权限。比如:如果想去操作摄像头,那么就需要去申请下面的权限<uses-permission android:name="andorid.permission.CAMERA">

        那android系统是怎么去做这个权限的校验呢?在了解应用程序权限校验之前,先了解每个应用程序权限数据存储结构、权限的解析。我们的应用在第一次安装的时候,都是会经过PKMS来解析,然后在PKMS中会去保存每个应用需要用的权限。

        1、权限数据结构

        保存权限的相关数据结构如下图:

应用权限数据结构

        每个安装的应用都会对应一个变量PackageSettingBase  packageSetting来与之对应,而每个packageSetting都包含一个变量PermissionsState来记录这个应用的权限信息,而每个PermissionsState下面都会有多个PermissionData,每个permissionData来对应一个权限,而permissionData下面有一个permissionState用来直接记录该权限是否授权权限名称等信息。

        2、应用权限的解析

        应用安装完后,所有的信息会保存在data/system/package.xml中,如下图

应用安装信息

        红色框框tag是权限信息,这部分会在PKMS启动的时候,会调用下面的接口来解析对应权限信息。readInstallPermissionsLPr(parser,packageSetting.getPermissionsState());这里会将这个应用所对应的PermissionsState传递进去。

        readInstallPermissionsLPr这个接口是在Settings.java中,接口里面会去获取这个权限的名称,再根据权限的名称向Settings.mPermissions获取这个权限名称所对应的BasePermission 即是PKMS最前解析到的permission与UID的映射BP列表(android应用程序上层权限与底层linux的用户组GID都是一一映射的,用来规定哪些GID的可以进行访问、操作等。映射表是在PKMS构造函数里面解析路径:system/etc/permissions文件所得)

        在readInstallPermissionsLPr()中最后会调用permissionsState.grantInstallPermission(bp) ——>grantPermission()来授权:

授权代码

        这里前后各做了一个computeGids得到oldGids / newGids,再通过比较得出授权后GID是否发生了变化,如果发生变化,那就很明显这个权限是新增的。在这两个computeGids有两个关键函数ensurePermissionData(),permissionData.grant(),其实这两个接口,前面那个是根据权限的name来获取到对应的PermissionData,后面那个接口只是将其下面的变量permission标志为授权而已。

        3、权限校验

        在系统服务中需要可以到看下面这段代码mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BIND_DEVICE_ADMIN,null); 参数是各种各样的权限名称,这部分是做权限校验部分

   权限校验流程

        各个流程就上图,最后会来到PKMS的checkUidPermission()


权限校验

        android原生的代码,权限校验部分,前面说到每个安装的应用都会对应一个变量PackageSettingBase  packageSetting来与之对应,PackageSettingBase的父类就是SettingBase,所以这里面还是一样先去获取这个应用的permissionsState,查看这个权限是否授权,再返回值,注释有一个special case,说明还有例外的情况。。。

        另外如果没有获取到这个应用的LPr,则会继续去判断mSystemPermissions,这个变量跟前面提到的mPermissions是那么一点点联系,解析system/etc/permissions的时候,<permission name ="android.permission.BLUETOOTH">

<group gid="net-bt"/>

</permission>

         上面这部分则会被解析到mPermisisons中,而tag为<assign-permissino ...>则会被解析到这个变量中,mSystemPermissions,原生的注释的意思是给开发者一个更开放的开发环境。比如android开发人员想要查看surface layout的信息,那么他直接可以adb shell后再运行dumpsys SurfaceFlinger,即可以看到信息,这里有一个权限<assign-permission  name ="android.permisison.ACCESS_SURFACE_FLIGNER">,这个权限是在mSystemPermissions中,所以开发人员可以直接利用这个权限去调试,这是属于高等权限之一。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容