版权声明:本文为博主原创文章,未经博主允许不得转载。 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,这个权限是系统级应用才可以。