#### 概述

Android系统在6.0之前，权限都是在安装的时候授予的。在6.0及以后，引入了运行时权限。这样应用在安装的时候不会要求确认权限，简化了安装流程，当应用在需要的时候才被授予权限，增强了用户对应用的控制。

#### 调用流程

以定位服务为例

- PackageManagerService.checkUidPermission

  1. 如果用户id不存在，则不授予权限，直接返回PERMISSION_DENIDE
  2. synchronized用于多线程同步，它是给mPackages上了锁，只有获得锁之后才可以执行代码块里的内容
  3. mSetting是Settings的一个实例，存储了动态设置的信息
  4. settingBase对象记录了权限授予情况
  5. PermissionsState.hasPermission判断是否拥有指定权限，申请了权限并不意味着拥有权限，还需要授予权限。

- ManagePermissionsActiveity在设置里管理权限

- GrantPermissionsActivity在弹窗里管理权限

  利用GroupState对象与PackageManagerService通信，来实现管理权限的功能