summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2018-08-28 02:48:54 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-08-28 02:48:54 +0000
commit03fa971ac3046735d02a0c6b25c9f89d0c0542e6 (patch)
tree9a480b9810ae8ebd0d37cd083f5c2d791908904e
parentb7cc5351c01618c7062d0df2dfc39aacda844a2f (diff)
parent1eb7d38d3bd4503dc99cc799be8cfb52d3756a5a (diff)
Merge "Track processing duration of each broadcast receiver"
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java22
-rw-r--r--services/core/java/com/android/server/am/BroadcastRecord.java6
2 files changed, 17 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index b36b5d35f28e..bc2331639005 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -16,15 +16,7 @@
package com.android.server.am;
-import android.content.pm.IPackageManager;
-import android.content.pm.PermissionInfo;
-import android.os.Trace;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Set;
+import static com.android.server.am.ActivityManagerDebugConfig.*;
import android.app.ActivityManager;
import android.app.AppGlobals;
@@ -37,7 +29,9 @@ import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ActivityInfo;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
@@ -47,13 +41,19 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.Trace;
import android.os.UserHandle;
import android.util.EventLog;
import android.util.Slog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
-import static com.android.server.am.ActivityManagerDebugConfig.*;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Set;
/**
* BROADCASTS
@@ -409,10 +409,12 @@ public final class BroadcastQueue {
String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
final int state = r.state;
final ActivityInfo receiver = r.curReceiver;
+ final long finishTime = SystemClock.uptimeMillis();
r.state = BroadcastRecord.IDLE;
if (state == BroadcastRecord.IDLE) {
Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
}
+ r.duration[r.nextReceiver - 1] = finishTime - r.receiverTime;
r.receiver = null;
r.intent.setComponent(null);
if (r.curApp != null && r.curApp.curReceivers.contains(r)) {
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 7e15947a1f28..9b7dc44e5a73 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -18,8 +18,8 @@ package com.android.server.am;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
-import android.content.IIntentReceiver;
import android.content.ComponentName;
+import android.content.IIntentReceiver;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ResolveInfo;
@@ -62,6 +62,7 @@ final class BroadcastRecord extends Binder {
final BroadcastOptions options; // BroadcastOptions supplied by caller
final List receivers; // contains BroadcastFilter and ResolveInfo
final int[] delivery; // delivery state of each receiver
+ final long[] duration; // duration a receiver took to process broadcast
IIntentReceiver resultTo; // who receives final result if non-null
long enqueueClockTime; // the clock time the broadcast was enqueued
long dispatchTime; // when dispatch started on this set of receivers
@@ -203,6 +204,7 @@ final class BroadcastRecord extends Binder {
case DELIVERY_TIMEOUT: pw.print("Timeout"); break;
default: pw.print("???????"); break;
}
+ pw.print(" "); TimeUtils.formatDuration(duration[i], pw);
pw.print(" #"); pw.print(i); pw.print(": ");
if (o instanceof BroadcastFilter) {
pw.println(o);
@@ -239,6 +241,7 @@ final class BroadcastRecord extends Binder {
options = _options;
receivers = _receivers;
delivery = new int[_receivers != null ? _receivers.size() : 0];
+ duration = new long[delivery.length];
resultTo = _resultTo;
resultCode = _resultCode;
resultData = _resultData;
@@ -274,6 +277,7 @@ final class BroadcastRecord extends Binder {
options = from.options;
receivers = from.receivers;
delivery = from.delivery;
+ duration = from.duration;
resultTo = from.resultTo;
enqueueClockTime = from.enqueueClockTime;
dispatchTime = from.dispatchTime;