Android隐藏的权限管理机制:AppOps
最近整理以前开发中的笔记,发现有点零乱,遂决定将这些笔记整理迁移到 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相关推荐
- Android原生权限管理:AppOps
--------------------- 从Android M开始,Google就正式推出了官方的权限管理机制Android Runtime Permission. AppOps终究没有走到台面^^ ...
- android 9.0 权限管理_你真的了解Android权限机制吗?
码个蛋(codeegg)第 610 次推文 作者:FeelsChaotic 原文:https://www.jianshu.com/p/a17c8bed79d9 前言 Android将安全设计贯穿系统架 ...
- Android 6.0 权限管理最佳实践
博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission
- android 权限管理框架,Android 运行时权限管理最佳实践
欢迎访问我的个人博客 传送门 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予.此方法可以简化应用安装过程,因为用户在安装或更新应用时不需 ...
- android 跳转权限管理的代码,Android权限管理
Android权限管理 说明 在targetSdkVersion的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0或以上的设备会没有相应权限而导致崩溃 请求权限后,在onRequ ...
- android 加网络权限管理,Android添加用户组及自定义App权限的方法
Android:4.4.4 一.应用场景 在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0: # ls -l /dev/ttyUSB0 crw-rw-- ...
- Linux驱动学习--android中的内存管理机制ION(一)--简单介绍
目录 一.引言 二.ION的介绍及使用 ------> ION介绍 ------> ION的使用 ------> HEAP种类 三.接口分析 ------> 主要数据结构 -- ...
- Android应用程序权限管理
在Android源码frameworks/base/api/current.txt中定义了所有应用程序所需的权限 https://blog.csdn.net/gjy_it/article/detail ...
- android 华为开发权限管理,android开发 华为 点击跳转到权限管理页面
private void goHuaWeiSetting() { try { //HUAWEI H60-l02 P8max测试通过 Log.d(MainActivity.class.getSimpl ...
最新文章
- node.js查询oracle,nodejs操作oracle数据库示例
- 【历史上的今天】8 月 17 日:Oracle 创始人出生;第一个 COBOL 程序成功跑通!...
- java输出到txt,换行问题
- XAML实例教程系列 - 标记扩展(Markup Extensions)
- jspstudy mysql_使用JspStudy集成环境快速部署jsp项目
- php fseek函数,php fseek函数怎么用?
- 2021年四大流行Android手机自动化测试工具,全在这里了
- 英特尔核显驱动hd630_英特尔首款独显 Xe Max 评测出炉:低于移动端 GTX 1050 Ti
- Klog开发笔记——分页插件 Kaminari 介绍
- jQuery.Revealing图片展示插件
- Java实现阿拉伯数字转换成中文大写数字,以及中文大写数字到阿拉伯数字的转换。
- 德日车企瓜分美系车在华市场
- 计算机专业课838,838计算机科学专业基础综合.docx
- Nginx服务器搭建
- 【dSPACE】从0开启dSPACE之路(2)具体上手操作步骤
- android话费查询接口,Android 小应用--一键查话费移动版(附源码)
- 【至简设计案例系列】基于FPGA的密码锁设计(altera版)
- 怎样改证件照的背景颜色?两种方法教你换背景色
- 2019年终总结,继往开来!
- Windows驱动开发入门 -- HelloWorld