[Android Pro] android 4.4 Android原生权限管理:AppOps
reference : http://m.blog.csdn.net/blog/langzxz/45308199
reference : http://blog.csdn.net/hyhyl1990/article/details/46842915
Android原生是有应用程序权限管理的,即是AppOps,只是Google把它默认隐藏了。
本文对AppOps机制做一简要的分析和描述。
1. AppOps 简介
AppOps全称是 Application Operations,类似我们平时常说的应用程序的操作(权限)管理。AppOps是Google原生Android包含的功能,但是Google在每次版本更新时都会隐藏掉AppOps的入口。
在今年的Google IO大会上,Google透露Android M ( Android 6.0 )会加入Application Permission Manage的功能,该功能应该就是基于AppOps实现的。
注意:AppOps虽然涵盖了 App的权限管理,但是Google原生的设计并不仅仅是对“权限”的管理,而是对App的“动作”的管理。我们平时讲的权限管理多是针对具体的权限(App开发者在Manifest里申请的权限),而AppOps所管理的是所有可能涉及用户隐私和安全的操作,包括 access notification, keep weak lock, activate vpn, display toast 等等,有些操作是不需要Manifest里申请权限的。
2. 功能效果
Setting UI:
AppOps的权限设置是在系统的Settings App里, Settings -> Security -> AppOps.
点击某一app,可以查看该app的权限管理详情
3. AppOps总体概览
核心服务: AppOpsService
系统服务,系统启动时该服务会启动运行。
参考以下ActivityManagerService.java,ActivityManagerService启动过程中:
配置文件: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. 结构图
AppOps整体的工作框架基本如下:
Setting UI通过AppOpsManager与AppOpsService 交互,给用户提供入口管理各个app的操作。
AppOpsService具体处理用户的各项设置,用户的设置项存储在 /data/system/appops.xml文件中。
AppOpsService也会被注入到各个相关的系统服务中,进行权限操作的检验。
各个权限操作对应的系统服务(比如定位相关的Location Service,Audio相关的Audio Service等)中注入AppOpsService的判断。如果用户做了相应的设置,那么这些系统服务就要做出相应的处理。
(比如,LocationManagerSerivce的定位相关接口在实现时,会有判断调用该接口的app是否被用户设置成禁止该操作,如果有该设置,就不会继续进行定位。)
5. 相关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 throughContext.getSystemService
withContext.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.
intnoteOpNoThrow(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源码里的描述。
AppOpsManager 是在是在Android 4.4版本支持的 (api 19)。获得他实例的方法是
Context.getSystemService(Context.APP_OPS_SERVICE)
APP_OPS_SERVICE 的值是 “appops”
AppOpsManager类里有一函数 int checkOp(String op, int uid, String packageName)
public int checkOp(String op, int uid, String packageName) {
return checkOp(strOpToOp(op), uid, packageName);
}
public static int strOpToOp(String op) {
Integer val = sOpStrToOp.get(op);
if (val == null) {
throw new IllegalArgumentException("Unknown operation string: " + op);
}
return val;
}
功能就是快速检测某个应用是否具有某些权限,看上面的源码可知道最终调用了下面的代码
public int checkOp(int op, int uid, String packageName) {
try {
int mode = mService.checkOperation(op, uid, packageName);
if (mode == MODE_ERRORED) {
throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
}
return mode;
} catch (RemoteException e) {
}
return MODE_IGNORED;
}
op 的值是 0 ~ 47,其中0代表粗略定位权限,1代表精确定位权限,24代表悬浮窗权限。
uid 当前应用用到的uid ,可通过 Binder.getCallingUid()获得。
packageName 应用程序的包名,通过getPackageName获得。
通过上面的知识,写一函数 用来判断 程序是否具有某些权限的函数
private static int checkOp(Context context, int op){
final int version = Build.VERSION.SDK_INT;
if (version >= 19){
Object object = context.getSystemService("appops");
Class c = object.getClass();
try {
Class[] cArg = new Class[3];
cArg[0] = int.class;
cArg[1] = int.class;
cArg[2] = String.class;
Method lMethod = c.getDeclaredMethod("checkOp", cArg);
return (Integer) lMethod.invoke(object, op, Binder.getCallingUid(), context.getPackageName());
} catch(NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return -1;
}
调用上面的函数,返回 0 就代表有权限,1代表没有权限,-1函数出错啦
[Android Pro] android 4.4 Android原生权限管理:AppOps的更多相关文章
- Android获取设备隐私 忽略6.0权限管理
1.前言 (1).由于MIUI等部分国产定制系统也有权限管理,没有相关api,故无法判断用户是否允许获取联系人等隐私.在Android 6.0之后,新增权限管理可以通过官方api判断用户的运行状态: ...
- Android 开发者必知必会的权限管理知识
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ 导语 本 ...
- [Android Pro] 开发一流的 Android SDK:Fabric SDK 的创建经验
cp from : https://academy.realm.io/cn/posts/oredev-ty-smith-building-android-sdks-fabric/ Ty Smith T ...
- [Android Pro] 自己动手编译Android源码(超详细)
cp from : https://www.jianshu.com/p/367f0886e62b 在Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈andro ...
- [Android Pro] app_process command in Android
reference to : http://blog.csdn.net/wangkaiblog/article/details/46050587 本来以为存放在/systen/bin/下的monkey ...
- ant design pro (十六)advanced 权限管理
一.概述 原文地址:https://pro.ant.design/docs/authority-management-cn 权限控制是中后台系统中常见的需求之一,你可以利用我们提供的权限控制组件,实现 ...
- [Android Pro] 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能
reference to : http://www.cnblogs.com/soaringEveryday/p/4991563.html 以往的Android开发有一个头疼的且拖慢速度的问题,就是你每 ...
- Android 开发 权限管理
Android 开发 权限管理 https://sspai.com/post/42779 $ adb shell pm list permissions -d -g https://zhuanlan. ...
- Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用
PermissionsDispatcher2.3.2使用 Android6.0权限官网https://developer.android.com/about/versions/marshmallow/ ...
随机推荐
- Ubuntu 14 修改默认打开方式
通过研究,有三种修改方式. 方式一: 修改路径:右上角“系统设置” -> 详细信息 -> 默认应用程序 但是,有个缺陷,可修改的项比较少. 方式二: 例如,修改pdf的打开方式,只要查看任 ...
- HNU 12868 Island (简单题)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12868&courseid=272 解题报告:输入n*m ...
- iOS开发——高级篇——内存分析,Instruments
一.内存分析 1.静态内存分析(Analyze)不运行程序,直接对代码进行内存分析,查看代码是否有内存泄露优点:分析速度快,并且可以对所有的代码进行内存分析缺点:分析结果不一定准确(没有运行程序,根据 ...
- 安装sqlserver2012时出现的丧心病狂的错误
Service Pack 安装程序 ------------------------------ 出现以下错误: 安装程序集“Microsoft.VC80.ATL,version="8.0. ...
- 我所理解的cocos2dx自适配屏幕大小方案
这里主要有两个点: 1.屏幕大小的设置,也就是手机窗口的大小,在各个手机上面或者平板上的屏幕的大小. 这个大小的设置就是代码里面的:glview->setFrameSize(width, hig ...
- 剑指Offer 连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- PHP 中的行为 ,与什么是切面
行为(Behavior)扩展以及插件(Plug or Hook)详解: 行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为即可以独立调用,也可以绑定到某个 标签中进行监听,官 ...
- EXT Grid 默认展开所有行
grid.getStore().load({ //默认展开所有行. callback:function() { var expander = grid.plugins[0]; var count = ...
- bootstrap框架----像素
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 保存字符串到手机SDcard为txt文件
try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File sdCardDir ...