最近整理以前开发中的笔记,发现有点零乱,遂决定将这些笔记整理迁移到 CSDN 上,分享出来与大家一起交流学习。如果有发现不当或有待商榷的地方,欢迎大家拍砖和指正。废话结束,进入本文正题:Android 隐藏的权限管理机制 AppOps。

1  AppOps概述

Android 的权限管理一直被广为诟病,也带来了很多安全隐患。Android 4.3 发布的时候,Google 报道出了一项隐藏功能App Ops(Application Operations),这被看作是Android的原生权限管理机制。不过,从 Android M 开

始,Google 正式推出了运行时权限管理机制 Android Runtime Permission,这也使得 App Ops 只能影藏在幕后了。但是有些隐藏权限的判断还需要用到 AppOps。

值得注意的是:AppOps 不仅仅是对 APP “权限”的管理,而包括对App“动作”的管理。我们平时讲的权限管理多是针对具体的权限(App 开发者在 Manifest 里申请的权限),而 AppOps 所管理的是所有可能涉及用户隐私和安全的操作,包括 access notification, keep weak lock,  activate vpn, display toast 等等,有些操作是不需要Manifest里申请权限的。

2  AppOps设置

AppOps 的权限设置是在系统的 Settings 里(我的华为手机,Settings 里权限管理),这个入口默认是被 Google 关闭了,有些厂商手机没有打开此项,可能没有此设置项。有三种可选项:允许 / 禁止 /提示,用户选择“提示”选项,则该 app在执行这一操作时,系统会给用户相应的提示,待用户选择后 app 继续执行。

3  AppOps 总体架构

AppOps 总体架构如图所示:

  • 核心服务:

AppOpsService

系统服务,系统启动时该服务会启动运行。

参考以下 ActivityManagerService.java,ActivityManagerService 启动过程中:

mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);
  • 配置文件:appops.xml、appops_policy.xml

Appops.xml位于 /data/system/ 目录下,存储各个 app 的权限设置和操作信息。

Appops_policy.xml位于 /system/etc/ 目录下,该文件只在 appops strict mode enable 时才会存在和使用。

  • API接口:AppOpsManager

AppOpsService 实现了大部分的核心功能逻辑,但它不能被其他模块直接调用访问,而是通过 AppOpsManager 提供访问接口。

  • UI层:AppOpsSummary,AppOpsCategory 等

上传UI显示以及基本逻辑处理。

4  AppOpsManager API接口简介

在 Android SDK 里能够看到部分 AppOps 的 API 接口,但是 Google 对此有说明:

     This API is not generally intended for third party application developers; most features are only available to system applications.  Obtain an
instance of it through Context.getSystemService with Context.APP_OPS_SERVICE.

即是说,这些 API 不是让第三方 app 使用的,而是供系统应用调用的。
   使用 Android SDK 开发应用,如果要调用这些 API 的话,也会编译不通过。
   但是想使用的话,可以尝试把 Android 源码里 AppOpsManager.java 打包一下,把 jar包导入自己的工程,就可以使用了。

部分重要的 API 接口如下:

     int checkOp(String op, int uid, String packageName)

Op对应一个权限操作,该接口来检测应用是否具有该项操作权限。

     int noteOp(String op, int uid, String packageName)

和checkOp基本相同,但是在检验后会做记录。

     int checkOpNoThrow(String op, int uid, String packageName)

和checkOp类似,但是权限错误,不会抛出 SecurityException,而是返回 AppOpsManager.MODE_ERRORED。

     int noteOpNoThrow(String op, int uid, String packageName)

类似noteOp,但不会抛出 SecurityException。

     void setMode(int code, int uid, String packageName, int mode)

这个是我们最需要的方法,改变 app 的权限设置,但偏偏被 google 隐藏了。
   code 代表具体的操作权限,mode 代表要更改成的类型(允许/禁止/提示)

正常情况下(如果OEM厂商没有做特殊处理),把 AppOpsManager.java 打包,引入 jar 包到工程内,是可以使用上述 API 接口的,也即是可以自行设计 UI,提供入口来改变 app 权限。具体权限对应的 code,可以查看 AppOpsManager.java 源码里的描述。

以上是个人对于 Android 隐藏的权限管理机制 AppOps 的认知,如有不当之处欢迎指正。如要了解 Android 更多的权限管理问题欢迎访问 Android动态权限管理:Android Runtime Permission。

Android隐藏的权限管理机制:AppOps相关推荐

  1. Android原生权限管理:AppOps

    --------------------- 从Android M开始,Google就正式推出了官方的权限管理机制Android Runtime Permission. AppOps终究没有走到台面^^ ...

  2. android 9.0 权限管理_你真的了解Android权限机制吗?

    码个蛋(codeegg)第 610 次推文 作者:FeelsChaotic 原文:https://www.jianshu.com/p/a17c8bed79d9 前言 Android将安全设计贯穿系统架 ...

  3. Android 6.0 权限管理最佳实践

    博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission

  4. android 权限管理框架,Android 运行时权限管理最佳实践

    欢迎访问我的个人博客 传送门 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予.此方法可以简化应用安装过程,因为用户在安装或更新应用时不需 ...

  5. android 跳转权限管理的代码,Android权限管理

    Android权限管理 说明 在targetSdkVersion的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0或以上的设备会没有相应权限而导致崩溃 请求权限后,在onRequ ...

  6. android 加网络权限管理,Android添加用户组及自定义App权限的方法

    Android:4.4.4 一.应用场景 在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0: # ls -l /dev/ttyUSB0 crw-rw-- ...

  7. Linux驱动学习--android中的内存管理机制ION(一)--简单介绍

    目录 一.引言 二.ION的介绍及使用 ------> ION介绍 ------> ION的使用 ------> HEAP种类 三.接口分析 ------> 主要数据结构 -- ...

  8. Android应用程序权限管理

    在Android源码frameworks/base/api/current.txt中定义了所有应用程序所需的权限 https://blog.csdn.net/gjy_it/article/detail ...

  9. android 华为开发权限管理,android开发 华为 点击跳转到权限管理页面

    private void goHuaWeiSetting()  { try { //HUAWEI H60-l02 P8max测试通过 Log.d(MainActivity.class.getSimpl ...

最新文章

  1. node.js查询oracle,nodejs操作oracle数据库示例
  2. 【历史上的今天】8 月 17 日:Oracle 创始人出生;第一个 COBOL 程序成功跑通!...
  3. java输出到txt,换行问题
  4. XAML实例教程系列 - 标记扩展(Markup Extensions)
  5. jspstudy mysql_使用JspStudy集成环境快速部署jsp项目
  6. php fseek函数,php fseek函数怎么用?
  7. 2021年四大流行Android手机自动化测试工具,全在这里了
  8. 英特尔核显驱动hd630_英特尔首款独显 Xe Max 评测出炉:低于移动端 GTX 1050 Ti
  9. Klog开发笔记——分页插件 Kaminari 介绍
  10. jQuery.Revealing图片展示插件
  11. Java实现阿拉伯数字转换成中文大写数字,以及中文大写数字到阿拉伯数字的转换。
  12. 德日车企瓜分美系车在华市场
  13. 计算机专业课838,838计算机科学专业基础综合.docx
  14. Nginx服务器搭建
  15. 【dSPACE】从0开启dSPACE之路(2)具体上手操作步骤
  16. android话费查询接口,Android 小应用--一键查话费移动版(附源码)
  17. 【至简设计案例系列】基于FPGA的密码锁设计(altera版)
  18. 怎样改证件照的背景颜色?两种方法教你换背景色
  19. 2019年终总结,继往开来!
  20. Windows驱动开发入门 -- HelloWorld

热门文章

  1. R项目:使用R分析人力资源数据
  2. iPad goodnotes 5 打开很慢“准备自己的资料库,获得更快体验”解决
  3. Win10 系统设置共享文件
  4. 能够做到亚马逊月销售额50w以上的运营,他们有什么共同点 和技巧
  5. 如何 拆 贴片电容 而不是把焊盘给搞坏
  6. PS作业-Camera Raw滤镜练习
  7. Pandas-数据结构-DataFrame(七):添加元素、修改元素、删除元素
  8. doucument.referrer部分安卓机型一直为空问题
  9. csrf攻击与防护—2用flask简单演示防范csrf攻击之referer
  10. 常见测试用例设计之水杯