【笔记】AppOpsService 相关

AppOpsService 相关:

1.构造函数:
读取/data/system/appops.xml 下 权限相关设置信息;

2.权限检测:
SDK >23 时,调用ContextCompat::checkSelfPermission() 就可以检测是否有权限。
SDK <23 时,6.0 一下的系统,主要权限在权限清单中,都是返回true

3.权限的读取/修改:
  1.系统最开始的权限配置卸载AppOpsManager.sOpDefaultMode[] 数组里;
  2.开机后,PKMS 会生成/data/system/appops.xml ,此文件保存 appops 中各个pkg 的权限配置(注:appops.xml记录的不是实时的权限配置,权限的修改是有延时的)
  3.修改权限调用AppOpsManag.setMode,主要修改的是AppOpsService 维护的一个包含 op 这个单位变量的数组,各个权限对应的 op  是实时变化的,但是同步到 appops.xml 上是有时间延时的!!!同步到appops.xml 上是直接将AppOpsService 上所有的op 一次性全部同步到appops.xml 上。
  4.获取的pkg 对应权限的状态是获取此pkg 对应是op 的状态,并没有直接读取 appops.xml 这个文件!!!!
  5.AppOpsService 里的op类 初始化时,op.mode 就是直接获取AppOpsManager.sOpDefaultMode[]这个数组里配置的信息,所以创建了op 后,最后同步到appops.xml 上时就是把sOpDefaultMode[] 数组的配置信息写到appops.xml 里了。
  6. op类的成员变量uid , packageName ,mode

AppOpsManager 相关:
1.  public int checkOpNoThrow(String op, int uid, String packageName)


2. 数组:
   0.sOpToSwitch : 【一个int数组,包含当前AppOps控制的所有权限对应的 permission number】
   1.sOpToString : 【一个string数组,包含当前AppOps控制的所有权限对应的正式string 类型名称,类似“android:read_contacts”,用于在AndroidManifest中做对应】
   2.sOpNames :    【一个string数组,包含当前AppOps控制的所有权限对应的代码里代称的string类型名称,类似“READ_EXTERNAL_STORAGE”】
   3.sOpPerms :    【一个string数组,包含当前AppOps控制的所有权限对应的AndroidManifest.xml中标记的名称,类似Manifest.permission.READ_EXTERNAL_STORAGE】
   4.sOpRestrictions : 【一个string数组,记录当前各个权限对应的UserRestriction配置:UserManager 的多用户功能中,会有一个User 创建时默认的各种操作对应的允许/不允许 配置,某一种操作是在UserManager 上定义的,但是UserManager上定义的一种操作实际上包含AppOpsManager上多个权限,这个数组就是把UserManager 上定义的操作 和 AppOpsManager 上定义的权限对应起来】
   4.sOpDefaultMode :【一个int数组,包含当前AppOps控制的所有权限默认的MODE_ALLOWED "0"/MODE_IGNORED "1"/MODE_ERRORED "2"/MODE_DEFAULT "3"/ MODE_NOTED "4"】

3.AppOpsManager.opToDefaultMode(op.getOp()) 获取此权限default 的allow/disallow 状态
  
  
  
4.在6.0引入动态权限之后,权限被分为了一般权限和危险权限。一般权限只要在清单文件中注册可使用,危险权限可以通过动态获取来获得(比如获取联系人)

5.Android 8 之前都是安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都可以被安装。Android8.0的变化是,未知应用安装权限的开关被除掉,取而代之的是未知来源应用的管理列表,需要在里面打开每个应用的未知来源的安装权限。Google这么做是为了防止一开始正经的应用后来开始通过升级来做一些不合法的事情,侵犯用户权益。

修改权限:

1.AppOpsManage.setMode(int code, int uid, String packageName, int mode)
  --> AppOpsService.setMode(int code, int uid, String packageName, int mode)
      ... code = AppOpsManager.opToSwitch(code); 【获取代码里写的权限对应的op_num】
      ... Op op = getOpLocked(code, uid, packageName, true); 【获取/生成 权限对应的 op 成员变量,FW层里权限的处理单位】
      ... cbs = mPackageModeWatchers.get(packageName); 【注册此pkg 权限的监听回调】
          -->scheduleFastWriteLocked()
             ... mHandler.postDelayed(mWriteRunner, 10*1000); 【延时10s 后开始向 /data/system/appops.xml 中修改权限配置】
         (或者)*** scheduleWriteLocked()
             ... mHandler.postDelayed(mWriteRunner, WRITE_DELAY);【WRITE_DELAY= DEBUG ? 1000 : 30*60*1000 ,正常情况是30min 才会修改/data/system/appops.xml 中的权限配置信息】
        

*************************************************************************************************
问题1:/data/system/appops.xml 文件中的信息具体是什么含义? 和 AppOpsManager 上定义的数据有什么联系?
问题2:UserManager 和AppOps 的关系: UserManager 是用户操作控制的manager, AppOps是系统权限的manager,一个用户的一种操作可能包含多种系统的权限。
问题3:如何拦截未知来源的APP 的安装需求?
 

你可能感兴趣的:(Android,学习,笔记,AppOps)