diff options
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 322 |
1 files changed, 157 insertions, 165 deletions
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 4c9b1d865ebc..419e686e237d 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -339,11 +339,8 @@ public class AppOpsService extends IAppOpsService.Stub { SparseIntArray mProfileOwners; - @GuardedBy("this") - private CheckOpsDelegate mAppOpsPolicy; - - @GuardedBy("this") - private CheckOpsDelegateDispatcher mCheckOpsDelegateDispatcher; + private volatile CheckOpsDelegateDispatcher mCheckOpsDelegateDispatcher = + new CheckOpsDelegateDispatcher(/*policy*/ null, /*delegate*/ null); /** * Reverse lookup for {@link AppOpsManager#opToSwitch(int)}. Initialized once and never @@ -1781,12 +1778,13 @@ public class AppOpsService extends IAppOpsService.Stub { /** * Sets a policy for handling app ops. * - * @param appOpsPolicy The policy. + * @param policy The policy. */ - public void setAppOpsPolicy(@Nullable CheckOpsDelegate appOpsPolicy) { - synchronized (AppOpsService.this) { - mAppOpsPolicy = appOpsPolicy; - } + public void setAppOpsPolicy(@Nullable CheckOpsDelegate policy) { + final CheckOpsDelegateDispatcher oldDispatcher = mCheckOpsDelegateDispatcher; + final CheckOpsDelegate delegate = (oldDispatcher != null) + ? oldDispatcher.mCheckOpsDelegate : null; + mCheckOpsDelegateDispatcher = new CheckOpsDelegateDispatcher(policy, delegate); } public void packageRemoved(int uid, String packageName) { @@ -2909,53 +2907,28 @@ public class AppOpsService extends IAppOpsService.Stub { } public CheckOpsDelegate getAppOpsServiceDelegate() { - synchronized (this) { - return (mCheckOpsDelegateDispatcher != null) - ? mCheckOpsDelegateDispatcher.getCheckOpsDelegate() - : null; + synchronized (AppOpsService.this) { + final CheckOpsDelegateDispatcher dispatcher = mCheckOpsDelegateDispatcher; + return (dispatcher != null) ? dispatcher.getCheckOpsDelegate() : null; } } public void setAppOpsServiceDelegate(CheckOpsDelegate delegate) { - synchronized (this) { - if (delegate != null) { - mCheckOpsDelegateDispatcher = new CheckOpsDelegateDispatcher(delegate); - } else { - mCheckOpsDelegateDispatcher = null; - } + synchronized (AppOpsService.this) { + final CheckOpsDelegateDispatcher oldDispatcher = mCheckOpsDelegateDispatcher; + final CheckOpsDelegate policy = (oldDispatcher != null) ? oldDispatcher.mPolicy : null; + mCheckOpsDelegateDispatcher = new CheckOpsDelegateDispatcher(policy, delegate); } } @Override public int checkOperationRaw(int code, int uid, String packageName) { - return checkOperationInternal(code, uid, packageName, true /*raw*/); + return mCheckOpsDelegateDispatcher.checkOperation(code, uid, packageName, true /*raw*/); } @Override public int checkOperation(int code, int uid, String packageName) { - return checkOperationInternal(code, uid, packageName, false /*raw*/); - } - - private int checkOperationInternal(int code, int uid, String packageName, boolean raw) { - final CheckOpsDelegate policy; - final CheckOpsDelegateDispatcher delegateDispatcher; - synchronized (AppOpsService.this) { - policy = mAppOpsPolicy; - delegateDispatcher = mCheckOpsDelegateDispatcher; - } - if (policy != null) { - if (delegateDispatcher != null) { - return policy.checkOperation(code, uid, packageName, raw, - delegateDispatcher::checkOperationImpl); - } else { - return policy.checkOperation(code, uid, packageName, raw, - AppOpsService.this::checkOperationImpl); - } - } else if (delegateDispatcher != null) { - delegateDispatcher.getCheckOpsDelegate().checkOperation(code, uid, - packageName, raw, AppOpsService.this::checkOperationImpl); - } - return checkOperationImpl(code, uid, packageName, raw); + return mCheckOpsDelegateDispatcher.checkOperation(code, uid, packageName, false /*raw*/); } private int checkOperationImpl(int code, int uid, String packageName, boolean raw) { @@ -3013,25 +2986,7 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public int checkAudioOperation(int code, int usage, int uid, String packageName) { - final CheckOpsDelegate policy; - final CheckOpsDelegateDispatcher delegateDispatcher; - synchronized (AppOpsService.this) { - policy = mAppOpsPolicy; - delegateDispatcher = mCheckOpsDelegateDispatcher; - } - if (policy != null) { - if (delegateDispatcher != null) { - return policy.checkAudioOperation(code, usage, uid, packageName, - delegateDispatcher::checkAudioOperationImpl); - } else { - return policy.checkAudioOperation(code, usage, uid, packageName, - AppOpsService.this::checkAudioOperationImpl); - } - } else if (delegateDispatcher != null) { - delegateDispatcher.getCheckOpsDelegate().checkAudioOperation(code, usage, - uid, packageName, AppOpsService.this::checkAudioOperationImpl); - } - return checkAudioOperationImpl(code, usage, uid, packageName); + return mCheckOpsDelegateDispatcher.checkAudioOperation(code, usage, uid, packageName); } private int checkAudioOperationImpl(int code, int usage, int uid, String packageName) { @@ -3102,30 +3057,8 @@ public class AppOpsService extends IAppOpsService.Stub { public SyncNotedAppOp noteProxyOperation(int code, AttributionSource attributionSource, boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage, boolean skipProxyOperation) { - final CheckOpsDelegate policy; - final CheckOpsDelegateDispatcher delegateDispatcher; - synchronized (AppOpsService.this) { - policy = mAppOpsPolicy; - delegateDispatcher = mCheckOpsDelegateDispatcher; - } - if (policy != null) { - if (delegateDispatcher != null) { - return policy.noteProxyOperation(code, attributionSource, - shouldCollectAsyncNotedOp, message, shouldCollectMessage, - skipProxyOperation, delegateDispatcher::noteProxyOperationImpl); - } else { - return policy.noteProxyOperation(code, attributionSource, - shouldCollectAsyncNotedOp, message, shouldCollectMessage, - skipProxyOperation, AppOpsService.this::noteProxyOperationImpl); - } - } else if (delegateDispatcher != null) { - delegateDispatcher.getCheckOpsDelegate().noteProxyOperation(code, - attributionSource, shouldCollectAsyncNotedOp, message, - shouldCollectMessage, skipProxyOperation, - AppOpsService.this::noteProxyOperationImpl); - } - return noteProxyOperationImpl(code, attributionSource, shouldCollectAsyncNotedOp, - message, shouldCollectMessage,skipProxyOperation); + return mCheckOpsDelegateDispatcher.noteProxyOperation(code, attributionSource, + shouldCollectAsyncNotedOp, message, shouldCollectMessage, skipProxyOperation); } private SyncNotedAppOp noteProxyOperationImpl(int code, AttributionSource attributionSource, @@ -3185,29 +3118,8 @@ public class AppOpsService extends IAppOpsService.Stub { public SyncNotedAppOp noteOperation(int code, int uid, String packageName, String attributionTag, boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage) { - final CheckOpsDelegate policy; - final CheckOpsDelegateDispatcher delegateDispatcher; - synchronized (AppOpsService.this) { - policy = mAppOpsPolicy; - delegateDispatcher = mCheckOpsDelegateDispatcher; - } - if (policy != null) { - if (delegateDispatcher != null) { - return policy.noteOperation(code, uid, packageName, attributionTag, - shouldCollectAsyncNotedOp, message, shouldCollectMessage, - delegateDispatcher::noteOperationImpl); - } else { - return policy.noteOperation(code, uid, packageName, attributionTag, - shouldCollectAsyncNotedOp, message, shouldCollectMessage, - AppOpsService.this::noteOperationImpl); - } - } else if (delegateDispatcher != null) { - delegateDispatcher.getCheckOpsDelegate().noteOperation(code, uid, packageName, - attributionTag, shouldCollectAsyncNotedOp, message, shouldCollectMessage, - AppOpsService.this::noteOperationImpl); - } - return noteOperationImpl(code, uid, packageName, attributionTag, - shouldCollectAsyncNotedOp, message, shouldCollectMessage); + return mCheckOpsDelegateDispatcher.noteOperation(code, uid, packageName, + attributionTag, shouldCollectAsyncNotedOp, message, shouldCollectMessage); } private SyncNotedAppOp noteOperationImpl(int code, int uid, @Nullable String packageName, @@ -3627,32 +3539,9 @@ public class AppOpsService extends IAppOpsService.Stub { @NonNull AttributionSource attributionSource, boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage, boolean skipProxyOperation) { - final CheckOpsDelegate policy; - final CheckOpsDelegateDispatcher delegateDispatcher; - synchronized (AppOpsService.this) { - policy = mAppOpsPolicy; - delegateDispatcher = mCheckOpsDelegateDispatcher; - } - if (policy != null) { - if (delegateDispatcher != null) { - return policy.startProxyOperation(clientId, code, attributionSource, - startIfModeDefault, shouldCollectAsyncNotedOp, message, - shouldCollectMessage, skipProxyOperation, - delegateDispatcher::startProxyOperationImpl); - } else { - return policy.startProxyOperation(clientId, code, attributionSource, - startIfModeDefault, shouldCollectAsyncNotedOp, message, - shouldCollectMessage, skipProxyOperation, - AppOpsService.this::startProxyOperationImpl); - } - } else if (delegateDispatcher != null) { - delegateDispatcher.getCheckOpsDelegate().startProxyOperation(clientId, code, - attributionSource, startIfModeDefault, shouldCollectAsyncNotedOp, message, - shouldCollectMessage, skipProxyOperation, - AppOpsService.this::startProxyOperationImpl); - } - return startProxyOperationImpl(clientId, code, attributionSource, startIfModeDefault, - shouldCollectAsyncNotedOp, message, shouldCollectMessage, skipProxyOperation); + return mCheckOpsDelegateDispatcher.startProxyOperation(clientId, code, attributionSource, + startIfModeDefault, shouldCollectAsyncNotedOp, message, shouldCollectMessage, + skipProxyOperation); } private SyncNotedAppOp startProxyOperationImpl(IBinder clientId, int code, @@ -3835,25 +3724,7 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void finishProxyOperation(IBinder clientId, int code, @NonNull AttributionSource attributionSource) { - final CheckOpsDelegate policy; - final CheckOpsDelegateDispatcher delegateDispatcher; - synchronized (AppOpsService.this) { - policy = mAppOpsPolicy; - delegateDispatcher = mCheckOpsDelegateDispatcher; - } - if (policy != null) { - if (delegateDispatcher != null) { - policy.finishProxyOperation(clientId, code, attributionSource, - delegateDispatcher::finishProxyOperationImpl); - } else { - policy.finishProxyOperation(clientId, code, attributionSource, - AppOpsService.this::finishProxyOperationImpl); - } - } else if (delegateDispatcher != null) { - delegateDispatcher.getCheckOpsDelegate().finishProxyOperation(clientId, code, - attributionSource, AppOpsService.this::finishProxyOperationImpl); - } - finishProxyOperationImpl(clientId, code, attributionSource); + mCheckOpsDelegateDispatcher.finishProxyOperation(clientId, code, attributionSource); } private Void finishProxyOperationImpl(IBinder clientId, int code, @@ -7011,10 +6882,14 @@ public class AppOpsService extends IAppOpsService.Stub { } } + @Immutable private final class CheckOpsDelegateDispatcher { - private final @NonNull CheckOpsDelegate mCheckOpsDelegate; + private final @Nullable CheckOpsDelegate mPolicy; + private final @Nullable CheckOpsDelegate mCheckOpsDelegate; - CheckOpsDelegateDispatcher(@NonNull CheckOpsDelegate checkOpsDelegate) { + CheckOpsDelegateDispatcher(@Nullable CheckOpsDelegate policy, + @Nullable CheckOpsDelegate checkOpsDelegate) { + mPolicy = policy; mCheckOpsDelegate = checkOpsDelegate; } @@ -7022,25 +6897,100 @@ public class AppOpsService extends IAppOpsService.Stub { return mCheckOpsDelegate; } - public int checkOperationImpl(int code, int uid, String packageName, boolean raw) { + public int checkOperation(int code, int uid, String packageName, boolean raw) { + if (mPolicy != null) { + if (mCheckOpsDelegate != null) { + return mPolicy.checkOperation(code, uid, packageName, raw, + this::checkDelegateOperationImpl); + } else { + return mPolicy.checkOperation(code, uid, packageName, raw, + AppOpsService.this::checkOperationImpl); + } + } else if (mCheckOpsDelegate != null) { + return checkDelegateOperationImpl(code, uid, packageName, raw); + } + return checkOperationImpl(code, uid, packageName, raw); + } + + private int checkDelegateOperationImpl(int code, int uid, String packageName, boolean raw) { return mCheckOpsDelegate.checkOperation(code, uid, packageName, raw, AppOpsService.this::checkOperationImpl); } - public int checkAudioOperationImpl(int code, int usage, int uid, String packageName) { + public int checkAudioOperation(int code, int usage, int uid, String packageName) { + if (mPolicy != null) { + if (mCheckOpsDelegate != null) { + return mPolicy.checkAudioOperation(code, usage, uid, packageName, + this::checkDelegateAudioOperationImpl); + } else { + return mPolicy.checkAudioOperation(code, usage, uid, packageName, + AppOpsService.this::checkAudioOperationImpl); + } + } else if (mCheckOpsDelegate != null) { + return checkDelegateAudioOperationImpl(code, usage, uid, packageName); + } + return checkAudioOperationImpl(code, usage, uid, packageName); + } + + private int checkDelegateAudioOperationImpl(int code, int usage, int uid, + String packageName) { return mCheckOpsDelegate.checkAudioOperation(code, usage, uid, packageName, AppOpsService.this::checkAudioOperationImpl); } - public SyncNotedAppOp noteOperationImpl(int code, int uid, @Nullable String packageName, - @Nullable String featureId, boolean shouldCollectAsyncNotedOp, - @Nullable String message, boolean shouldCollectMessage) { + public SyncNotedAppOp noteOperation(int code, int uid, String packageName, + String attributionTag, boolean shouldCollectAsyncNotedOp, String message, + boolean shouldCollectMessage) { + if (mPolicy != null) { + if (mCheckOpsDelegate != null) { + return mPolicy.noteOperation(code, uid, packageName, attributionTag, + shouldCollectAsyncNotedOp, message, shouldCollectMessage, + this::noteDelegateOperationImpl); + } else { + return mPolicy.noteOperation(code, uid, packageName, attributionTag, + shouldCollectAsyncNotedOp, message, shouldCollectMessage, + AppOpsService.this::noteOperationImpl); + } + } else if (mCheckOpsDelegate != null) { + return noteDelegateOperationImpl(code, uid, packageName, + attributionTag, shouldCollectAsyncNotedOp, message, shouldCollectMessage); + } + return noteOperationImpl(code, uid, packageName, attributionTag, + shouldCollectAsyncNotedOp, message, shouldCollectMessage); + } + + private SyncNotedAppOp noteDelegateOperationImpl(int code, int uid, + @Nullable String packageName, @Nullable String featureId, + boolean shouldCollectAsyncNotedOp, @Nullable String message, + boolean shouldCollectMessage) { return mCheckOpsDelegate.noteOperation(code, uid, packageName, featureId, shouldCollectAsyncNotedOp, message, shouldCollectMessage, AppOpsService.this::noteOperationImpl); } - public SyncNotedAppOp noteProxyOperationImpl(int code, + public SyncNotedAppOp noteProxyOperation(int code, AttributionSource attributionSource, + boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage, + boolean skipProxyOperation) { + if (mPolicy != null) { + if (mCheckOpsDelegate != null) { + return mPolicy.noteProxyOperation(code, attributionSource, + shouldCollectAsyncNotedOp, message, shouldCollectMessage, + skipProxyOperation, this::noteDelegateProxyOperationImpl); + } else { + return mPolicy.noteProxyOperation(code, attributionSource, + shouldCollectAsyncNotedOp, message, shouldCollectMessage, + skipProxyOperation, AppOpsService.this::noteProxyOperationImpl); + } + } else if (mCheckOpsDelegate != null) { + return noteDelegateProxyOperationImpl(code, + attributionSource, shouldCollectAsyncNotedOp, message, + shouldCollectMessage, skipProxyOperation); + } + return noteProxyOperationImpl(code, attributionSource, shouldCollectAsyncNotedOp, + message, shouldCollectMessage,skipProxyOperation); + } + + private SyncNotedAppOp noteDelegateProxyOperationImpl(int code, @NonNull AttributionSource attributionSource, boolean shouldCollectAsyncNotedOp, @Nullable String message, boolean shouldCollectMessage, boolean skipProxyOperation) { @@ -7049,7 +6999,33 @@ public class AppOpsService extends IAppOpsService.Stub { AppOpsService.this::noteProxyOperationImpl); } - public SyncNotedAppOp startProxyOperationImpl(IBinder token, int code, + public SyncNotedAppOp startProxyOperation(IBinder clientId, int code, + @NonNull AttributionSource attributionSource, boolean startIfModeDefault, + boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage, + boolean skipProxyOperation) { + if (mPolicy != null) { + if (mCheckOpsDelegate != null) { + return mPolicy.startProxyOperation(clientId, code, attributionSource, + startIfModeDefault, shouldCollectAsyncNotedOp, message, + shouldCollectMessage, skipProxyOperation, + this::startDelegateProxyOperationImpl); + } else { + return mPolicy.startProxyOperation(clientId, code, attributionSource, + startIfModeDefault, shouldCollectAsyncNotedOp, message, + shouldCollectMessage, skipProxyOperation, + AppOpsService.this::startProxyOperationImpl); + } + } else if (mCheckOpsDelegate != null) { + return startDelegateProxyOperationImpl(clientId, code, + attributionSource, startIfModeDefault, shouldCollectAsyncNotedOp, message, + shouldCollectMessage, skipProxyOperation); + } + return startProxyOperationImpl(clientId, code, attributionSource, startIfModeDefault, + shouldCollectAsyncNotedOp, message, shouldCollectMessage, skipProxyOperation); + } + + + private SyncNotedAppOp startDelegateProxyOperationImpl(IBinder token, int code, @NonNull AttributionSource attributionSource, boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage, boolean skipProxyOperation) { @@ -7058,7 +7034,23 @@ public class AppOpsService extends IAppOpsService.Stub { skipProxyOperation, AppOpsService.this::startProxyOperationImpl); } - public Void finishProxyOperationImpl(IBinder clientId, int code, + public void finishProxyOperation(IBinder clientId, int code, + @NonNull AttributionSource attributionSource) { + if (mPolicy != null) { + if (mCheckOpsDelegate != null) { + mPolicy.finishProxyOperation(clientId, code, attributionSource, + this::finishDelegateProxyOperationImpl); + } else { + mPolicy.finishProxyOperation(clientId, code, attributionSource, + AppOpsService.this::finishProxyOperationImpl); + } + } else if (mCheckOpsDelegate != null) { + finishDelegateProxyOperationImpl(clientId, code, attributionSource); + } + finishProxyOperationImpl(clientId, code, attributionSource); + } + + private Void finishDelegateProxyOperationImpl(IBinder clientId, int code, @NonNull AttributionSource attributionSource) { mCheckOpsDelegate.finishProxyOperation(clientId, code, attributionSource, AppOpsService.this::finishProxyOperationImpl); |