Add TaggedTracingAppOpsCheckingServiceInterface
This is a decorator that adds tracing to AppOpsCheckingServiceInterface calls. These traces will be captured into the trace file for the purpose of being consumed by Perfetto/CrystalBall. Bug: 252887420 Test: presubmit Change-Id: Ia76702c4224fad46b9ce2c5b49b5953b3a187a77
This commit is contained in:
committed by
Jay Sullivan
parent
63fd970b4d
commit
447639ad18
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -828,8 +828,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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user