Fix issue #28641630: Service client dumps are timing out for no reason
Actually, no reason. The reason is that to do the dump we are doing synchronous calls out to each service, but that is with the activity manager lock held, so they can get blocked if their main thread does any call back in to the activity manager. To fix this, re-organize the dumping code so that the "with client" path is separate, and doesn't require holding a lock the entire time. Change-Id: Ia96861c10da81048b3d2ac93a25760b68623cf34
This commit is contained in:
@@ -2805,28 +2805,63 @@ public final class ActiveServices {
|
||||
/**
|
||||
* Prints a list of ServiceRecords (dumpsys activity services)
|
||||
*/
|
||||
void dumpServicesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
|
||||
int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) {
|
||||
boolean needSep = false;
|
||||
boolean printedAnything = false;
|
||||
|
||||
ItemMatcher matcher = new ItemMatcher();
|
||||
matcher.build(args, opti);
|
||||
|
||||
pw.println("ACTIVITY MANAGER SERVICES (dumpsys activity services)");
|
||||
try {
|
||||
if (mLastAnrDump != null) {
|
||||
pw.println(" Last ANR service:");
|
||||
pw.print(mLastAnrDump);
|
||||
pw.println();
|
||||
List<ServiceRecord> collectServicesToDumpLocked(ItemMatcher matcher, String dumpPackage) {
|
||||
final ArrayList<ServiceRecord> services = new ArrayList<>();
|
||||
final int[] users = mAm.mUserController.getUsers();
|
||||
for (int user : users) {
|
||||
ServiceMap smap = getServiceMap(user);
|
||||
if (smap.mServicesByName.size() > 0) {
|
||||
for (int si=0; si<smap.mServicesByName.size(); si++) {
|
||||
ServiceRecord r = smap.mServicesByName.valueAt(si);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
services.add(r);
|
||||
}
|
||||
}
|
||||
int[] users = mAm.mUserController.getUsers();
|
||||
}
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
final class ServiceDumper {
|
||||
private final FileDescriptor fd;
|
||||
private final PrintWriter pw;
|
||||
private final String[] args;
|
||||
private final int opti;
|
||||
private final boolean dumpAll;
|
||||
private final String dumpPackage;
|
||||
private final ItemMatcher matcher;
|
||||
private final ArrayList<ServiceRecord> services = new ArrayList<>();
|
||||
|
||||
private final long nowReal = SystemClock.elapsedRealtime();
|
||||
|
||||
private boolean needSep = false;
|
||||
private boolean printedAnything = false;
|
||||
private boolean printed = false;
|
||||
|
||||
/**
|
||||
* Note: do not call directly, use {@link #newServiceDumperLocked} instead (this
|
||||
* must be called with the lock held).
|
||||
*/
|
||||
ServiceDumper(FileDescriptor fd, PrintWriter pw, String[] args,
|
||||
int opti, boolean dumpAll, String dumpPackage) {
|
||||
this.fd = fd;
|
||||
this.pw = pw;
|
||||
this.args = args;
|
||||
this.opti = opti;
|
||||
this.dumpAll = dumpAll;
|
||||
this.dumpPackage = dumpPackage;
|
||||
matcher = new ItemMatcher();
|
||||
matcher.build(args, opti);
|
||||
|
||||
final int[] users = mAm.mUserController.getUsers();
|
||||
for (int user : users) {
|
||||
ServiceMap smap = getServiceMap(user);
|
||||
boolean printed = false;
|
||||
if (smap.mServicesByName.size() > 0) {
|
||||
long nowReal = SystemClock.elapsedRealtime();
|
||||
needSep = false;
|
||||
for (int si=0; si<smap.mServicesByName.size(); si++) {
|
||||
ServiceRecord r = smap.mServicesByName.valueAt(si);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
@@ -2835,215 +2870,325 @@ public final class ActiveServices {
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
if (!printed) {
|
||||
if (printedAnything) {
|
||||
pw.println();
|
||||
services.add(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void dumpHeaderLocked() {
|
||||
pw.println("ACTIVITY MANAGER SERVICES (dumpsys activity services)");
|
||||
if (mLastAnrDump != null) {
|
||||
pw.println(" Last ANR service:");
|
||||
pw.print(mLastAnrDump);
|
||||
pw.println();
|
||||
}
|
||||
}
|
||||
|
||||
void dumpLocked() {
|
||||
dumpHeaderLocked();
|
||||
|
||||
try {
|
||||
int[] users = mAm.mUserController.getUsers();
|
||||
for (int user : users) {
|
||||
// Find the first service for this user.
|
||||
int serviceIdx = 0;
|
||||
while (serviceIdx < services.size() && services.get(serviceIdx).userId != user) {
|
||||
serviceIdx++;
|
||||
}
|
||||
printed = false;
|
||||
if (serviceIdx < services.size()) {
|
||||
needSep = false;
|
||||
while (serviceIdx < services.size()) {
|
||||
ServiceRecord r = services.get(serviceIdx);
|
||||
serviceIdx++;
|
||||
if (r.userId != user) {
|
||||
break;
|
||||
}
|
||||
pw.println(" User " + user + " active services:");
|
||||
printed = true;
|
||||
dumpServiceLocalLocked(r);
|
||||
}
|
||||
printedAnything = true;
|
||||
if (needSep) {
|
||||
pw.println();
|
||||
}
|
||||
pw.print(" * ");
|
||||
pw.println(r);
|
||||
if (dumpAll) {
|
||||
r.dump(pw, " ");
|
||||
needSep = true;
|
||||
} else {
|
||||
pw.print(" app=");
|
||||
pw.println(r.app);
|
||||
pw.print(" created=");
|
||||
TimeUtils.formatDuration(r.createTime, nowReal, pw);
|
||||
pw.print(" started=");
|
||||
pw.print(r.startRequested);
|
||||
pw.print(" connections=");
|
||||
pw.println(r.connections.size());
|
||||
if (r.connections.size() > 0) {
|
||||
pw.println(" Connections:");
|
||||
for (int conni=0; conni<r.connections.size(); conni++) {
|
||||
ArrayList<ConnectionRecord> clist = r.connections.valueAt(conni);
|
||||
for (int i = 0; i < clist.size(); i++) {
|
||||
ConnectionRecord conn = clist.get(i);
|
||||
pw.print(" ");
|
||||
pw.print(conn.binding.intent.intent.getIntent()
|
||||
.toShortString(false, false, false, false));
|
||||
pw.print(" -> ");
|
||||
ProcessRecord proc = conn.binding.client;
|
||||
pw.println(proc != null ? proc.toShortString() : "null");
|
||||
}
|
||||
}
|
||||
needSep |= printed;
|
||||
}
|
||||
|
||||
dumpUserRemainsLocked(user);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Exception in dumpServicesLocked", e);
|
||||
}
|
||||
|
||||
dumpRemainsLocked();
|
||||
}
|
||||
|
||||
void dumpWithClient() {
|
||||
synchronized(mAm) {
|
||||
dumpHeaderLocked();
|
||||
}
|
||||
|
||||
try {
|
||||
int[] users = mAm.mUserController.getUsers();
|
||||
for (int user : users) {
|
||||
// Find the first service for this user.
|
||||
int serviceIdx = 0;
|
||||
while (serviceIdx < services.size() && services.get(serviceIdx).userId != user) {
|
||||
serviceIdx++;
|
||||
}
|
||||
printed = false;
|
||||
if (serviceIdx < services.size()) {
|
||||
needSep = false;
|
||||
while (serviceIdx < services.size()) {
|
||||
ServiceRecord r = services.get(serviceIdx);
|
||||
serviceIdx++;
|
||||
if (r.userId != user) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (dumpClient && r.app != null && r.app.thread != null) {
|
||||
pw.println(" Client:");
|
||||
pw.flush();
|
||||
try {
|
||||
TransferPipe tp = new TransferPipe();
|
||||
try {
|
||||
r.app.thread.dumpService(tp.getWriteFd().getFileDescriptor(),
|
||||
r, args);
|
||||
tp.setBufferPrefix(" ");
|
||||
// Short timeout, since blocking here can
|
||||
// deadlock with the application.
|
||||
tp.go(fd, 2000);
|
||||
} finally {
|
||||
tp.kill();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
pw.println(" Failure while dumping the service: " + e);
|
||||
} catch (RemoteException e) {
|
||||
pw.println(" Got a RemoteException while dumping the service");
|
||||
synchronized(mAm) {
|
||||
dumpServiceLocalLocked(r);
|
||||
}
|
||||
needSep = true;
|
||||
dumpServiceClient(r);
|
||||
}
|
||||
needSep |= printed;
|
||||
}
|
||||
|
||||
synchronized(mAm) {
|
||||
dumpUserRemainsLocked(user);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Exception in dumpServicesLocked", e);
|
||||
}
|
||||
|
||||
synchronized(mAm) {
|
||||
dumpRemainsLocked();
|
||||
}
|
||||
}
|
||||
|
||||
private void dumpUserHeaderLocked(int user) {
|
||||
if (!printed) {
|
||||
if (printedAnything) {
|
||||
pw.println();
|
||||
}
|
||||
pw.println(" User " + user + " active services:");
|
||||
printed = true;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (needSep) {
|
||||
pw.println();
|
||||
}
|
||||
}
|
||||
|
||||
private void dumpServiceLocalLocked(ServiceRecord r) {
|
||||
dumpUserHeaderLocked(r.userId);
|
||||
pw.print(" * ");
|
||||
pw.println(r);
|
||||
if (dumpAll) {
|
||||
r.dump(pw, " ");
|
||||
needSep = true;
|
||||
} else {
|
||||
pw.print(" app=");
|
||||
pw.println(r.app);
|
||||
pw.print(" created=");
|
||||
TimeUtils.formatDuration(r.createTime, nowReal, pw);
|
||||
pw.print(" started=");
|
||||
pw.print(r.startRequested);
|
||||
pw.print(" connections=");
|
||||
pw.println(r.connections.size());
|
||||
if (r.connections.size() > 0) {
|
||||
pw.println(" Connections:");
|
||||
for (int conni=0; conni<r.connections.size(); conni++) {
|
||||
ArrayList<ConnectionRecord> clist = r.connections.valueAt(conni);
|
||||
for (int i = 0; i < clist.size(); i++) {
|
||||
ConnectionRecord conn = clist.get(i);
|
||||
pw.print(" ");
|
||||
pw.print(conn.binding.intent.intent.getIntent()
|
||||
.toShortString(false, false, false, false));
|
||||
pw.print(" -> ");
|
||||
ProcessRecord proc = conn.binding.client;
|
||||
pw.println(proc != null ? proc.toShortString() : "null");
|
||||
}
|
||||
}
|
||||
needSep |= printed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void dumpServiceClient(ServiceRecord r) {
|
||||
final ProcessRecord proc = r.app;
|
||||
if (proc == null) {
|
||||
return;
|
||||
}
|
||||
final IApplicationThread thread = proc.thread;
|
||||
if (thread == null) {
|
||||
return;
|
||||
}
|
||||
pw.println(" Client:");
|
||||
pw.flush();
|
||||
try {
|
||||
TransferPipe tp = new TransferPipe();
|
||||
try {
|
||||
thread.dumpService(tp.getWriteFd().getFileDescriptor(), r, args);
|
||||
tp.setBufferPrefix(" ");
|
||||
// Short timeout, since blocking here can
|
||||
// deadlock with the application.
|
||||
tp.go(fd, 2000);
|
||||
} finally {
|
||||
tp.kill();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
pw.println(" Failure while dumping the service: " + e);
|
||||
} catch (RemoteException e) {
|
||||
pw.println(" Got a RemoteException while dumping the service");
|
||||
}
|
||||
needSep = true;
|
||||
}
|
||||
|
||||
private void dumpUserRemainsLocked(int user) {
|
||||
ServiceMap smap = getServiceMap(user);
|
||||
printed = false;
|
||||
for (int si=0, SN=smap.mDelayedStartList.size(); si<SN; si++) {
|
||||
ServiceRecord r = smap.mDelayedStartList.get(si);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
if (!printed) {
|
||||
if (printedAnything) {
|
||||
pw.println();
|
||||
}
|
||||
pw.println(" User " + user + " delayed start services:");
|
||||
printed = true;
|
||||
}
|
||||
printedAnything = true;
|
||||
pw.print(" * Delayed start "); pw.println(r);
|
||||
}
|
||||
printed = false;
|
||||
for (int si=0, SN=smap.mStartingBackground.size(); si<SN; si++) {
|
||||
ServiceRecord r = smap.mStartingBackground.get(si);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
if (!printed) {
|
||||
if (printedAnything) {
|
||||
pw.println();
|
||||
}
|
||||
pw.println(" User " + user + " starting in background:");
|
||||
printed = true;
|
||||
}
|
||||
printedAnything = true;
|
||||
pw.print(" * Starting bg "); pw.println(r);
|
||||
}
|
||||
}
|
||||
|
||||
private void dumpRemainsLocked() {
|
||||
if (mPendingServices.size() > 0) {
|
||||
printed = false;
|
||||
for (int si=0, SN=smap.mDelayedStartList.size(); si<SN; si++) {
|
||||
ServiceRecord r = smap.mDelayedStartList.get(si);
|
||||
for (int i=0; i<mPendingServices.size(); i++) {
|
||||
ServiceRecord r = mPendingServices.get(i);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
if (!printed) {
|
||||
if (printedAnything) {
|
||||
pw.println();
|
||||
}
|
||||
pw.println(" User " + user + " delayed start services:");
|
||||
printed = true;
|
||||
}
|
||||
printedAnything = true;
|
||||
pw.print(" * Delayed start "); pw.println(r);
|
||||
}
|
||||
printed = false;
|
||||
for (int si=0, SN=smap.mStartingBackground.size(); si<SN; si++) {
|
||||
ServiceRecord r = smap.mStartingBackground.get(si);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
if (!printed) {
|
||||
if (printedAnything) {
|
||||
pw.println();
|
||||
}
|
||||
pw.println(" User " + user + " starting in background:");
|
||||
printed = true;
|
||||
}
|
||||
printedAnything = true;
|
||||
pw.print(" * Starting bg "); pw.println(r);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Slog.w(TAG, "Exception in dumpServicesLocked", e);
|
||||
}
|
||||
|
||||
if (mPendingServices.size() > 0) {
|
||||
boolean printed = false;
|
||||
for (int i=0; i<mPendingServices.size(); i++) {
|
||||
ServiceRecord r = mPendingServices.get(i);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (!printed) {
|
||||
if (needSep) pw.println();
|
||||
needSep = true;
|
||||
pw.println(" Pending services:");
|
||||
printed = true;
|
||||
}
|
||||
pw.print(" * Pending "); pw.println(r);
|
||||
r.dump(pw, " ");
|
||||
}
|
||||
needSep = true;
|
||||
}
|
||||
|
||||
if (mRestartingServices.size() > 0) {
|
||||
boolean printed = false;
|
||||
for (int i=0; i<mRestartingServices.size(); i++) {
|
||||
ServiceRecord r = mRestartingServices.get(i);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (!printed) {
|
||||
if (needSep) pw.println();
|
||||
needSep = true;
|
||||
pw.println(" Restarting services:");
|
||||
printed = true;
|
||||
}
|
||||
pw.print(" * Restarting "); pw.println(r);
|
||||
r.dump(pw, " ");
|
||||
}
|
||||
needSep = true;
|
||||
}
|
||||
|
||||
if (mDestroyingServices.size() > 0) {
|
||||
boolean printed = false;
|
||||
for (int i=0; i< mDestroyingServices.size(); i++) {
|
||||
ServiceRecord r = mDestroyingServices.get(i);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (!printed) {
|
||||
if (needSep) pw.println();
|
||||
needSep = true;
|
||||
pw.println(" Destroying services:");
|
||||
printed = true;
|
||||
}
|
||||
pw.print(" * Destroy "); pw.println(r);
|
||||
r.dump(pw, " ");
|
||||
}
|
||||
needSep = true;
|
||||
}
|
||||
|
||||
if (dumpAll) {
|
||||
boolean printed = false;
|
||||
for (int ic=0; ic<mServiceConnections.size(); ic++) {
|
||||
ArrayList<ConnectionRecord> r = mServiceConnections.valueAt(ic);
|
||||
for (int i=0; i<r.size(); i++) {
|
||||
ConnectionRecord cr = r.get(i);
|
||||
if (!matcher.match(cr.binding.service, cr.binding.service.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && (cr.binding.client == null
|
||||
|| !dumpPackage.equals(cr.binding.client.info.packageName))) {
|
||||
continue;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (!printed) {
|
||||
if (needSep) pw.println();
|
||||
needSep = true;
|
||||
pw.println(" Connection bindings to services:");
|
||||
pw.println(" Pending services:");
|
||||
printed = true;
|
||||
}
|
||||
pw.print(" * "); pw.println(cr);
|
||||
cr.dump(pw, " ");
|
||||
pw.print(" * Pending "); pw.println(r);
|
||||
r.dump(pw, " ");
|
||||
}
|
||||
needSep = true;
|
||||
}
|
||||
|
||||
if (mRestartingServices.size() > 0) {
|
||||
printed = false;
|
||||
for (int i=0; i<mRestartingServices.size(); i++) {
|
||||
ServiceRecord r = mRestartingServices.get(i);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (!printed) {
|
||||
if (needSep) pw.println();
|
||||
needSep = true;
|
||||
pw.println(" Restarting services:");
|
||||
printed = true;
|
||||
}
|
||||
pw.print(" * Restarting "); pw.println(r);
|
||||
r.dump(pw, " ");
|
||||
}
|
||||
needSep = true;
|
||||
}
|
||||
|
||||
if (mDestroyingServices.size() > 0) {
|
||||
printed = false;
|
||||
for (int i=0; i< mDestroyingServices.size(); i++) {
|
||||
ServiceRecord r = mDestroyingServices.get(i);
|
||||
if (!matcher.match(r, r.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
|
||||
continue;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (!printed) {
|
||||
if (needSep) pw.println();
|
||||
needSep = true;
|
||||
pw.println(" Destroying services:");
|
||||
printed = true;
|
||||
}
|
||||
pw.print(" * Destroy "); pw.println(r);
|
||||
r.dump(pw, " ");
|
||||
}
|
||||
needSep = true;
|
||||
}
|
||||
|
||||
if (dumpAll) {
|
||||
printed = false;
|
||||
for (int ic=0; ic<mServiceConnections.size(); ic++) {
|
||||
ArrayList<ConnectionRecord> r = mServiceConnections.valueAt(ic);
|
||||
for (int i=0; i<r.size(); i++) {
|
||||
ConnectionRecord cr = r.get(i);
|
||||
if (!matcher.match(cr.binding.service, cr.binding.service.name)) {
|
||||
continue;
|
||||
}
|
||||
if (dumpPackage != null && (cr.binding.client == null
|
||||
|| !dumpPackage.equals(cr.binding.client.info.packageName))) {
|
||||
continue;
|
||||
}
|
||||
printedAnything = true;
|
||||
if (!printed) {
|
||||
if (needSep) pw.println();
|
||||
needSep = true;
|
||||
pw.println(" Connection bindings to services:");
|
||||
printed = true;
|
||||
}
|
||||
pw.print(" * "); pw.println(cr);
|
||||
cr.dump(pw, " ");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!printedAnything) {
|
||||
pw.println(" (nothing)");
|
||||
if (!printedAnything) {
|
||||
pw.println(" (nothing)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ServiceDumper newServiceDumperLocked(FileDescriptor fd, PrintWriter pw, String[] args,
|
||||
int opti, boolean dumpAll, String dumpPackage) {
|
||||
return new ServiceDumper(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
}
|
||||
|
||||
/**
|
||||
* There are three ways to call this:
|
||||
* - no service specified: dump all the services
|
||||
|
||||
@@ -13771,8 +13771,18 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
dumpAssociationsLocked(fd, pw, args, opti, true, dumpClient, dumpPackage);
|
||||
}
|
||||
} else if ("services".equals(cmd) || "s".equals(cmd)) {
|
||||
synchronized (this) {
|
||||
mServices.dumpServicesLocked(fd, pw, args, opti, true, dumpClient, dumpPackage);
|
||||
if (dumpClient) {
|
||||
ActiveServices.ServiceDumper dumper;
|
||||
synchronized (this) {
|
||||
dumper = mServices.newServiceDumperLocked(fd, pw, args, opti, true,
|
||||
dumpPackage);
|
||||
}
|
||||
dumper.dumpWithClient();
|
||||
} else {
|
||||
synchronized (this) {
|
||||
mServices.newServiceDumperLocked(fd, pw, args, opti, true,
|
||||
dumpPackage).dumpLocked();
|
||||
}
|
||||
}
|
||||
} else if ("locks".equals(cmd)) {
|
||||
LockGuard.dump(fd, pw, args);
|
||||
@@ -13794,50 +13804,105 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
}
|
||||
|
||||
// No piece of data specified, dump everything.
|
||||
synchronized (this) {
|
||||
dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpBroadcastsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpPermissionsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
mServices.dumpServicesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpRecentsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
|
||||
if (mAssociations.size() > 0) {
|
||||
if (dumpClient) {
|
||||
ActiveServices.ServiceDumper sdumper;
|
||||
synchronized (this) {
|
||||
dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
|
||||
dumpBroadcastsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpPermissionsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
sdumper = mServices.newServiceDumperLocked(fd, pw, args, opti, dumpAll,
|
||||
dumpPackage);
|
||||
}
|
||||
sdumper.dumpWithClient();
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
synchronized (this) {
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpRecentsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
|
||||
if (mAssociations.size() > 0) {
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
|
||||
}
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
}
|
||||
|
||||
} else {
|
||||
synchronized (this) {
|
||||
dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpBroadcastsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpPermissionsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
mServices.newServiceDumperLocked(fd, pw, args, opti, dumpAll, dumpPackage)
|
||||
.dumpLocked();
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpRecentsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
|
||||
if (mAssociations.size() > 0) {
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
|
||||
}
|
||||
pw.println();
|
||||
if (dumpAll) {
|
||||
pw.println("-------------------------------------------------------------------------------");
|
||||
}
|
||||
dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
}
|
||||
dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage);
|
||||
}
|
||||
Binder.restoreCallingIdentity(origId);
|
||||
}
|
||||
@@ -16142,8 +16207,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
catPw.println();
|
||||
dumpProcessesLocked(null, catPw, emptyArgs, 0, false, null);
|
||||
catPw.println();
|
||||
mServices.dumpServicesLocked(null, catPw, emptyArgs, 0,
|
||||
false, false, null);
|
||||
mServices.newServiceDumperLocked(null, catPw, emptyArgs, 0,
|
||||
false, null).dumpLocked();
|
||||
catPw.println();
|
||||
dumpActivitiesLocked(null, catPw, emptyArgs, 0, false, false, null);
|
||||
catPw.flush();
|
||||
|
||||
Reference in New Issue
Block a user