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 0000000000000..44360028704e4 --- /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 getOpModeChangedListeners(int op) { + Trace.traceBegin(TRACE_TAG, + "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getOpModeChangedListeners"); + try { + return mService.getOpModeChangedListeners(op); + } finally { + Trace.traceEnd(TRACE_TAG); + } + } + + @Override + public ArraySet 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 ddcccb527ff41..c3d2717ce7952 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 @@ class AppOpsServiceImpl implements AppOpsServiceInterface { 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);