一 什么叫权限管理?
所谓权限管理,就是能够手动配置某个 App 的权限,进而阻止恶意软件以及防止隐私泄漏。当然,更进一步的权限管理,是能够在 App 动态使用某个权限的时候,弹窗提示用户允许和拒绝。这样的权限管理就更加类似于 Windows 中的主动防御。
二、系统架构
2.1. 架构
App Ops 的基本架构如图所示:
其中包含两个重要部分,一个叫做AppOpsService,另外一个叫AppOpsManager。AppOpsService 是一个系统服务,注册的名字叫做 “appops”,由ActivityManagerService启动,启动后会调用 readWhitelist();读取预设的白名单,接下来读取data/system/appops.xml文件,解析里面的元素并存放到一个SparseArray<Op>中,以便权限检查时用。该文件在系统第一次启动的时候是没有的。后续关机或者设置中修改了应用权限的时候通过 writeState() 生成。
AppOpsManager 是一个访问 AppOps 服务的类,同时有 Java 和 C 的实现,为了应对某些 native code 的服务,比如说 Camera。Settings 可以使用 AppOpsManger 来读取和修改权限管理信息。当其他 App 使用某个权限的时候,会通过 Binder 访问服务端的某项服务。在服务端的各个服务中都插入了检查权限的代码,同样通过使用 AppOpsManger 来检查权限。
2.2. 代码分析
2.2.1
检查用户设定权限的函数是:checkOperation() 和 noteOperation(),区别是 checkOperation() 只是检查 Operation 的情况,noteOperation() 还会记录访问时间等信息,代码如下:
public int checkOperation(int code, intuid, String packageName) {
verifyIncomingUid(uid);
verifyIncomingOp(code);