diff options
| author | 2020-06-02 20:26:20 +0100 | |
|---|---|---|
| committer | 2020-06-06 06:45:16 +0000 | |
| commit | e44f134adbba0ce2671e713c905565cb1a5e98b7 (patch) | |
| tree | 8681ed7d48e4ff28601e659f82bcc13f1374f820 | |
| parent | 1ca44e0dcf371898386f76100ae79b375985b3ea (diff) | |
Keep unforwarded operation for noted ops.
Align treatment of noted ops with AsyncNotedOps.
Fixes: 154775996
Test: atest AppOpsLoggingTest#disableCollectedAndNoteSyncOpAndCheckLog
Change-Id: I3dcd8275b6229946875bc184d25b18d2da76d5ba
Merged-In: I3dcd8275b6229946875bc184d25b18d2da76d5ba
| -rw-r--r-- | core/java/android/app/AppOpsManager.java | 29 | ||||
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 14 |
2 files changed, 36 insertions, 7 deletions
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index b058dcd714dd..e844a6624849 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -182,6 +182,8 @@ public class AppOpsManager { @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) public static final long CALL_BACK_ON_CHANGED_LISTENER_WITH_SWITCHED_OP_CHANGE = 148180766L; + private static final int MAX_UNFORWARDED_OPS = 10; + final Context mContext; @UnsupportedAppUsage @@ -217,6 +219,17 @@ public class AppOpsManager { private static @Nullable OnOpNotedCallback sOnOpNotedCallback; /** + * Sync note-ops collected from {@link #readAndLogNotedAppops(Parcel)} that have not been + * delivered to a callback yet. + * + * Similar to {@link com.android.server.appop.AppOpsService#mUnforwardedAsyncNotedOps} for + * {@link COLLECT_ASYNC}. Used in situation when AppOpsManager asks to collect stacktrace with + * {@link #sMessageCollector}, which forces {@link COLLECT_SYNC} mode. + */ + @GuardedBy("sLock") + private static ArrayList<SyncNotedAppOp> sUnforwardedOps = new ArrayList<>(); + + /** * Additional collector that collect accesses and forwards a few of them them via * {@link IAppOpsService#reportRuntimeAppOpAccessMessageAndGetConfig}. */ @@ -8163,6 +8176,11 @@ public class AppOpsManager { code = notedAppOps.nextSetBit(code + 1)) { if (sOnOpNotedCallback != null) { sOnOpNotedCallback.onNoted(new SyncNotedAppOp(code, attributionTag)); + } else { + sUnforwardedOps.add(new SyncNotedAppOp(code, attributionTag)); + if (sUnforwardedOps.size() > MAX_UNFORWARDED_OPS) { + sUnforwardedOps.remove(0); + } } } } @@ -8229,6 +8247,17 @@ public class AppOpsManager { } } } + synchronized (this) { + int numMissedSyncOps = sUnforwardedOps.size(); + for (int i = 0; i < numMissedSyncOps; i++) { + final SyncNotedAppOp syncNotedAppOp = sUnforwardedOps.get(i); + if (sOnOpNotedCallback != null) { + sOnOpNotedCallback.getAsyncNotedExecutor().execute( + () -> sOnOpNotedCallback.onNoted(syncNotedAppOp)); + } + } + sUnforwardedOps.clear(); + } } } } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index a33ad7dc0ea1..aeaf608e8e91 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -16,6 +16,11 @@ package com.android.server.appop; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; @@ -66,11 +71,6 @@ import static android.content.Intent.EXTRA_REPLACING; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; import static android.content.pm.PermissionInfo.PROTECTION_FLAG_APPOP; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; import static com.android.server.appop.AppOpsService.ModeCallback.ALL_OPS; import static java.lang.Long.max; @@ -249,7 +249,7 @@ public class AppOpsService extends IAppOpsService.Stub { OP_CAMERA, }; - private static final int MAX_UNFORWARED_OPS = 10; + private static final int MAX_UNFORWARDED_OPS = 10; private static final int MAX_UNUSED_POOLED_OBJECTS = 3; private static final int RARELY_USED_PACKAGES_INITIALIZATION_DELAY_MILLIS = 300000; @@ -3372,7 +3372,7 @@ public class AppOpsService extends IAppOpsService.Stub { } unforwardedOps.add(asyncNotedOp); - if (unforwardedOps.size() > MAX_UNFORWARED_OPS) { + if (unforwardedOps.size() > MAX_UNFORWARDED_OPS) { unforwardedOps.remove(0); } } |