diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-07-26 12:30:19 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-07-26 12:30:19 -0700 |
commit | 9fb0bb8292ab35983777f2decc3565377199f54c (patch) | |
tree | 1f13d6c772325d90c95db3961c515204728c4502 | |
parent | fd1fbcad5862877ca44f2d50d7cc063c8455f02d (diff) | |
parent | b6022e3d500f248cf1abe94e8f1509e27ab25736 (diff) | |
download | frameworks_base-9fb0bb8292ab35983777f2decc3565377199f54c.zip frameworks_base-9fb0bb8292ab35983777f2decc3565377199f54c.tar.gz frameworks_base-9fb0bb8292ab35983777f2decc3565377199f54c.tar.bz2 |
am b6022e3d: am 14bfa398: Infrastructure to report running services to developer.
Merge commit 'b6022e3d500f248cf1abe94e8f1509e27ab25736'
* commit 'b6022e3d500f248cf1abe94e8f1509e27ab25736':
Infrastructure to report running services to developer.
-rw-r--r-- | core/java/android/app/ApplicationErrorReport.java | 68 | ||||
-rw-r--r-- | services/java/com/android/server/am/ActivityManagerService.java | 33 |
2 files changed, 93 insertions, 8 deletions
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java index 48cbd46..ddc2b1f 100644 --- a/core/java/android/app/ApplicationErrorReport.java +++ b/core/java/android/app/ApplicationErrorReport.java @@ -79,6 +79,11 @@ public class ApplicationErrorReport implements Parcelable { public static final int TYPE_STRICT_MODE_VIOLATION = 4; /** + * An error report about a StrictMode violation. + */ + public static final int TYPE_RUNNING_SERVICE = 5; + + /** * Type of this report. Can be one of {@link #TYPE_NONE}, * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, or {@link #TYPE_BATTERY}. */ @@ -130,6 +135,12 @@ public class ApplicationErrorReport implements Parcelable { public BatteryInfo batteryInfo; /** + * If this report is of type {@link #TYPE_RUNNING_SERVICE}, contains an instance + * of RunningServiceInfo; otherwise null. + */ + public RunningServiceInfo runningServiceInfo; + + /** * Create an uninitialized instance of {@link ApplicationErrorReport}. */ public ApplicationErrorReport() { @@ -223,6 +234,9 @@ public class ApplicationErrorReport implements Parcelable { case TYPE_BATTERY: batteryInfo.writeToParcel(dest, flags); break; + case TYPE_RUNNING_SERVICE: + runningServiceInfo.writeToParcel(dest, flags); + break; } } @@ -239,16 +253,25 @@ public class ApplicationErrorReport implements Parcelable { crashInfo = new CrashInfo(in); anrInfo = null; batteryInfo = null; + runningServiceInfo = null; break; case TYPE_ANR: anrInfo = new AnrInfo(in); crashInfo = null; batteryInfo = null; + runningServiceInfo = null; break; case TYPE_BATTERY: batteryInfo = new BatteryInfo(in); anrInfo = null; crashInfo = null; + runningServiceInfo = null; + break; + case TYPE_RUNNING_SERVICE: + batteryInfo = null; + anrInfo = null; + crashInfo = null; + runningServiceInfo = new RunningServiceInfo(in); break; } } @@ -494,6 +517,51 @@ public class ApplicationErrorReport implements Parcelable { } } + /** + * Describes a running service report. + */ + public static class RunningServiceInfo { + /** + * Duration in milliseconds that the service has been running. + */ + public long durationMillis; + + /** + * Dump of debug information about the service. + */ + public String serviceDetails; + + /** + * Create an uninitialized instance of RunningServiceInfo. + */ + public RunningServiceInfo() { + } + + /** + * Create an instance of RunningServiceInfo initialized from a Parcel. + */ + public RunningServiceInfo(Parcel in) { + durationMillis = in.readLong(); + serviceDetails = in.readString(); + } + + /** + * Save a RunningServiceInfo instance to a parcel. + */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(durationMillis); + dest.writeString(serviceDetails); + } + + /** + * Dump a BatteryInfo instance to a Printer. + */ + public void dump(Printer pw, String prefix) { + pw.println(prefix + "durationMillis: " + durationMillis); + pw.println(prefix + "serviceDetails: " + serviceDetails); + } + } + public static final Parcelable.Creator<ApplicationErrorReport> CREATOR = new Parcelable.Creator<ApplicationErrorReport>() { public ApplicationErrorReport createFromParcel(Parcel source) { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 0c8769e..fa2ec1f 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -6755,7 +6755,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } return; } else if ("service".equals(cmd)) { - dumpService(fd, pw, args, opti, true); + dumpService(fd, pw, args, opti, dumpAll); return; } else if ("services".equals(cmd) || "s".equals(cmd)) { synchronized (this) { @@ -7061,20 +7061,28 @@ public final class ActivityManagerService extends ActivityManagerNative implemen componentNameString = args[opti]; opti++; ComponentName componentName = ComponentName.unflattenFromString(componentNameString); - r = componentName != null ? mServices.get(componentName) : null; + synchronized (this) { + r = componentName != null ? mServices.get(componentName) : null; + } newArgs = new String[args.length - opti]; if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, args.length - opti); } if (r != null) { - dumpService(fd, pw, r, newArgs); + dumpService(fd, pw, r, newArgs, dumpAll); } else { - for (ServiceRecord r1 : mServices.values()) { - if (componentNameString == null - || r1.name.flattenToString().contains(componentNameString)) { - dumpService(fd, pw, r1, newArgs); + ArrayList<ServiceRecord> services = new ArrayList<ServiceRecord>(); + synchronized (this) { + for (ServiceRecord r1 : mServices.values()) { + if (componentNameString == null + || r1.name.flattenToString().contains(componentNameString)) { + services.add(r1); + } } } + for (int i=0; i<services.size(); i++) { + dumpService(fd, pw, services.get(i), newArgs, dumpAll); + } } } @@ -7082,8 +7090,16 @@ public final class ActivityManagerService extends ActivityManagerNative implemen * Invokes IApplicationThread.dumpService() on the thread of the specified service if * there is a thread associated with the service. */ - private void dumpService(FileDescriptor fd, PrintWriter pw, ServiceRecord r, String[] args) { + private void dumpService(FileDescriptor fd, PrintWriter pw, ServiceRecord r, String[] args, + boolean dumpAll) { pw.println(" Service " + r.name.flattenToString()); + if (dumpAll) { + synchronized (this) { + pw.print(" * "); pw.println(r); + r.dump(pw, " "); + } + pw.println(""); + } if (r.app != null && r.app.thread != null) { try { // flush anything that is already in the PrintWriter since the thread is going @@ -7091,6 +7107,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen pw.flush(); r.app.thread.dumpService(fd, r, args); pw.print("\n"); + pw.flush(); } catch (RemoteException e) { pw.println("got a RemoteException while dumping the service"); } |