Merge "Add TaggedTracingAppOpsCheckingServiceInterface"
diff --git a/services/core/java/com/android/server/appop/AppOpsCheckingServiceTracingDecorator.java b/services/core/java/com/android/server/appop/AppOpsCheckingServiceTracingDecorator.java
new file mode 100644
index 0000000..4436002
--- /dev/null
+++ b/services/core/java/com/android/server/appop/AppOpsCheckingServiceTracingDecorator.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appop;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.AppOpsManager;
+import android.os.Trace;
+import android.util.ArraySet;
+import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
+
+import java.io.PrintWriter;
+
+/**
+ * Surrounds all AppOpsCheckingServiceInterface method calls with Trace.traceBegin and
+ * Trace.traceEnd. These traces are used for performance testing.
+ */
+public class AppOpsCheckingServiceTracingDecorator implements AppOpsCheckingServiceInterface {
+ private static final long TRACE_TAG = Trace.TRACE_TAG_SYSTEM_SERVER;
+ private final AppOpsCheckingServiceInterface mService;
+
+ AppOpsCheckingServiceTracingDecorator(
+ @NonNull AppOpsCheckingServiceInterface appOpsCheckingServiceInterface) {
+ mService = appOpsCheckingServiceInterface;
+ }
+
+ @Override
+ public SparseIntArray getNonDefaultUidModes(int uid) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getNonDefaultUidModes");
+ try {
+ return mService.getNonDefaultUidModes(uid);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public int getUidMode(int uid, int op) {
+ Trace.traceBegin(TRACE_TAG, "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getUidMode");
+ try {
+ return mService.getUidMode(uid, op);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public boolean setUidMode(int uid, int op, @AppOpsManager.Mode int mode) {
+ Trace.traceBegin(TRACE_TAG, "TaggedTracingAppOpsCheckingServiceInterfaceImpl#setUidMode");
+ try {
+ return mService.setUidMode(uid, op, mode);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public int getPackageMode(@NonNull String packageName, int op, @UserIdInt int userId) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getPackageMode");
+ try {
+ return mService.getPackageMode(packageName, op, userId);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void setPackageMode(@NonNull String packageName, int op, @AppOpsManager.Mode int mode,
+ @UserIdInt int userId) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#setPackageMode");
+ try {
+ mService.setPackageMode(packageName, op, mode, userId);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public boolean removePackage(@NonNull String packageName, @UserIdInt int userId) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#removePackage");
+ try {
+ return mService.removePackage(packageName, userId);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void removeUid(int uid) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#removeUid");
+ try {
+ mService.removeUid(uid);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public boolean areUidModesDefault(int uid) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#areUidModesDefault");
+ try {
+ return mService.areUidModesDefault(uid);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public boolean arePackageModesDefault(String packageName, @UserIdInt int userId) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#arePackageModesDefault");
+ try {
+ return mService.arePackageModesDefault(packageName, userId);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void clearAllModes() {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#clearAllModes");
+ try {
+ mService.clearAllModes();
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void startWatchingOpModeChanged(@NonNull OnOpModeChangedListener changedListener,
+ int op) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#startWatchingOpModeChanged");
+ try {
+ mService.startWatchingOpModeChanged(changedListener, op);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void startWatchingPackageModeChanged(@NonNull OnOpModeChangedListener changedListener,
+ @NonNull String packageName) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#startWatchingPackageModeChanged");
+ try {
+ mService.startWatchingPackageModeChanged(changedListener, packageName);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void removeListener(@NonNull OnOpModeChangedListener changedListener) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#removeListener");
+ try {
+ mService.removeListener(changedListener);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public ArraySet<OnOpModeChangedListener> getOpModeChangedListeners(int op) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getOpModeChangedListeners");
+ try {
+ return mService.getOpModeChangedListeners(op);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public ArraySet<OnOpModeChangedListener> getPackageModeChangedListeners(
+ @NonNull String packageName) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getPackageModeChangedListeners");
+ try {
+ return mService.getPackageModeChangedListeners(packageName);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void notifyWatchersOfChange(int op, int uid) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#notifyWatchersOfChange");
+ try {
+ mService.notifyWatchersOfChange(op, uid);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void notifyOpChanged(@NonNull OnOpModeChangedListener changedListener, int op, int uid,
+ @Nullable String packageName) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#notifyOpChanged");
+ try {
+ mService.notifyOpChanged(changedListener, op, uid, packageName);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public void notifyOpChangedForAllPkgsInUid(int op, int uid, boolean onlyForeground,
+ @Nullable OnOpModeChangedListener callbackToIgnore) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#notifyOpChangedForAllPkgsInUid");
+ try {
+ mService.notifyOpChangedForAllPkgsInUid(op, uid, onlyForeground, callbackToIgnore);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public SparseBooleanArray evalForegroundUidOps(int uid, SparseBooleanArray foregroundOps) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#evalForegroundUidOps");
+ try {
+ return mService.evalForegroundUidOps(uid, foregroundOps);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public SparseBooleanArray evalForegroundPackageOps(String packageName,
+ SparseBooleanArray foregroundOps, @UserIdInt int userId) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#evalForegroundPackageOps");
+ try {
+ return mService.evalForegroundPackageOps(packageName, foregroundOps, userId);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+
+ @Override
+ public boolean dumpListeners(int dumpOp, int dumpUid, String dumpPackage,
+ PrintWriter printWriter) {
+ Trace.traceBegin(TRACE_TAG,
+ "TaggedTracingAppOpsCheckingServiceInterfaceImpl#dumpListeners");
+ try {
+ return mService.dumpListeners(dumpOp, dumpUid, dumpPackage, printWriter);
+ } finally {
+ Trace.traceEnd(TRACE_TAG);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/appop/AppOpsServiceImpl.java b/services/core/java/com/android/server/appop/AppOpsServiceImpl.java
index ddcccb5..c3d2717 100644
--- a/services/core/java/com/android/server/appop/AppOpsServiceImpl.java
+++ b/services/core/java/com/android/server/appop/AppOpsServiceImpl.java
@@ -849,8 +849,8 @@
mSwitchedOps.put(switchCode,
ArrayUtils.appendInt(mSwitchedOps.get(switchCode), switchedCode));
}
- mAppOpsServiceInterface =
- new AppOpsCheckingServiceImpl(this, this, handler, context, mSwitchedOps);
+ mAppOpsServiceInterface = new AppOpsCheckingServiceTracingDecorator(
+ new AppOpsCheckingServiceImpl(this, this, handler, context, mSwitchedOps));
mAppOpsRestrictions = new AppOpsRestrictionsImpl(context, handler,
mAppOpsServiceInterface);