summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Stanislav Zholnin <zholnin@google.com> 2020-06-02 20:26:20 +0100
committer Stanislav Zholnin <zholnin@google.com> 2020-06-06 06:45:16 +0000
commite44f134adbba0ce2671e713c905565cb1a5e98b7 (patch)
tree8681ed7d48e4ff28601e659f82bcc13f1374f820
parent1ca44e0dcf371898386f76100ae79b375985b3ea (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.java29
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java14
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);
}
}