android AppOps operation mode设置权限浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/peter_water/article/details/75672402

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,这个权限是系统级应用才可以。



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/peter_water/article/details/75672402
今日推荐