android AppOps operation mode设置权限浅析

来源:互联网 发布:js防水涂料检验批 编辑:程序博客网 时间:2024/05/16 06:57

1. AppOpsManager提供了setMode方法对指定packageName的应用的Operation mode

/** @hide */    public void setMode(int code, int uid, String packageName, int mode) {        try {            mService.setMode(code, uid, packageName, mode);        } catch (RemoteException e) {        }}

2.    主要看mService.setMode()方法,位于AppOpsService.java

@Override    public void setMode(int code, int uid, String packageName, int mode) {        verifyIncomingUid(uid);        verifyIncomingOp(code);        .......        .......}

3.  我们主要看verifyIncomingUid(uid)

 

private void verifyIncomingUid(int uid) {        if (uid == Binder.getCallingUid()) {            return;        }        if (Binder.getCallingPid() == Process.myPid()) {            return;        }        mContext.enforcePermission(android.Manifest.permission.UPDATE_APP_OPS_STATS,                Binder.getCallingPid(), Binder.getCallingUid(), null);    }

总共执行了三步:

1. 如果uid == Binder.getCallingUid(),即配置的对象就是调用者,也就是进程自己配置自己应用的operation。直接return,就是通过了判定。

2. 如果Binder.getCallingPid() == Process.myPid(),即调用者为AppOps进程本身,直接return,就是通过了判定。

3. 如果上述都不符合就调用mContext.enforcePermission()方法,这个是判定调用进程是否拥有android.Manifest.permission.UPDATE_APP_OPS_STATS,这个权限是系统级应用才可以。



 
原创粉丝点击