summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Stanislav Zholnin <zholnin@google.com> 2020-05-31 13:06:40 +0100
committer Stanislav Zholnin <zholnin@google.com> 2020-06-05 11:53:49 +0100
commit56ac4df9781bae497e7926e97f555637d8fa3ba7 (patch)
tree806f048a18ac9df933349b868efa8ad0a28d7933
parentebe62e4882ac9376f451ecb291e72eef9bb8e000 (diff)
Optimize stack trace reporting puller for speed.
Resampling new package takes some time (because of PackageManager related queries), while it is not necessary to perform it immediately after stack trace was collected. To minimize puller running time we offloaded resampling task to background thread. Test: statsd_testdrive 10069 && atest RuntimeMessageCollectionTest Bug: 143519689 Change-Id: Iac4637ca5ad81ccb20792b7d3faccd652571dc40
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java29
1 files changed, 19 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index a33ad7dc0ea1..37ab1df3fa0c 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;
@@ -1776,8 +1776,7 @@ public class AppOpsService extends IAppOpsService.Stub {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
- List<String> packageNames = getPackageNamesForSampling();
- resamplePackageAndAppOpLocked(packageNames);
+ List<String> packageNames = getPackageListAndResample();
initializeRarelyUsedPackagesList(new ArraySet<>(packageNames));
}
}, RARELY_USED_PACKAGES_INITIALIZATION_DELAY_MILLIS);
@@ -5967,11 +5966,13 @@ public class AppOpsService extends IAppOpsService.Stub {
mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
Binder.getCallingPid(), Binder.getCallingUid(), null);
RuntimeAppOpAccessMessage result;
- List<String> packageNames = getPackageNamesForSampling();
synchronized (this) {
result = mCollectedRuntimePermissionMessage;
- resamplePackageAndAppOpLocked(packageNames);
+ mCollectedRuntimePermissionMessage = null;
}
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::getPackageListAndResample,
+ this));
return result;
}
@@ -5995,6 +5996,15 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
+ /** Obtains package list and resamples package and appop to watch. */
+ private List<String> getPackageListAndResample() {
+ List<String> packageNames = getPackageNamesForSampling();
+ synchronized (this) {
+ resamplePackageAndAppOpLocked(packageNames);
+ }
+ return packageNames;
+ }
+
/** Resamples package and appop to watch from the list provided. */
private void resamplePackageAndAppOpLocked(@NonNull List<String> packageNames) {
if (!packageNames.isEmpty()) {
@@ -6010,7 +6020,6 @@ public class AppOpsService extends IAppOpsService.Stub {
mSampledAppOpCode = ThreadLocalRandom.current().nextInt(_NUM_OP);
mAcceptableLeftDistance = _NUM_OP;
mSampledPackage = packageName;
- mCollectedRuntimePermissionMessage = null;
}
/**