Disable freezer during AM provider/service dump

This change disables the freezer during ActiveServices.dumpService() and
ProviderMap.dumpProvider() in order to avoid 'dumpsys activity
<service|provider>' from timing out during bug reports.

Test: Using health/bugreport/capturebugreport, verify that the 'dumpsys
      activity' sections no longer time out at 60 seconds.
Bug: 276451949
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:353c04e22e6817f3cef2c7540534d899dec50858)
Merged-In: I22c5a83e545cfaaab9bfb6f9cae99146c3c51d8c
Change-Id: I22c5a83e545cfaaab9bfb6f9cae99146c3c51d8c
This commit is contained in:
Kevin Jeon
2023-03-31 16:41:36 -04:00
committed by Cherrypicker Worker
parent eaf91796a3
commit fc854c65b5
2 changed files with 53 additions and 43 deletions

View File

@@ -7222,47 +7222,52 @@ public final class ActiveServices {
*/
protected boolean dumpService(FileDescriptor fd, PrintWriter pw, String name, int[] users,
String[] args, int opti, boolean dumpAll) {
final ArrayList<ServiceRecord> services = new ArrayList<>();
try {
mAm.mOomAdjuster.mCachedAppOptimizer.enableFreezer(false);
final ArrayList<ServiceRecord> services = new ArrayList<>();
final Predicate<ServiceRecord> filter = DumpUtils.filterRecord(name);
final Predicate<ServiceRecord> filter = DumpUtils.filterRecord(name);
synchronized (mAm) {
if (users == null) {
users = mAm.mUserController.getUsers();
}
for (int user : users) {
ServiceMap smap = mServiceMap.get(user);
if (smap == null) {
continue;
synchronized (mAm) {
if (users == null) {
users = mAm.mUserController.getUsers();
}
ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByInstanceName;
for (int i=0; i<alls.size(); i++) {
ServiceRecord r1 = alls.valueAt(i);
if (filter.test(r1)) {
services.add(r1);
for (int user : users) {
ServiceMap smap = mServiceMap.get(user);
if (smap == null) {
continue;
}
ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByInstanceName;
for (int i=0; i<alls.size(); i++) {
ServiceRecord r1 = alls.valueAt(i);
if (filter.test(r1)) {
services.add(r1);
}
}
}
}
}
if (services.size() <= 0) {
return false;
}
// Sort by component name.
services.sort(Comparator.comparing(WithComponentName::getComponentName));
boolean needSep = false;
for (int i=0; i<services.size(); i++) {
if (needSep) {
pw.println();
if (services.size() <= 0) {
return false;
}
needSep = true;
dumpService("", fd, pw, services.get(i), args, dumpAll);
// Sort by component name.
services.sort(Comparator.comparing(WithComponentName::getComponentName));
boolean needSep = false;
for (int i=0; i<services.size(); i++) {
if (needSep) {
pw.println();
}
needSep = true;
dumpService("", fd, pw, services.get(i), args, dumpAll);
}
return true;
} finally {
mAm.mOomAdjuster.mCachedAppOptimizer.enableFreezer(true);
}
return true;
}
/**

View File

@@ -351,21 +351,26 @@ public final class ProviderMap {
protected boolean dumpProvider(FileDescriptor fd, PrintWriter pw, String name, String[] args,
int opti, boolean dumpAll) {
ArrayList<ContentProviderRecord> providers = getProvidersForName(name);
try {
mAm.mOomAdjuster.mCachedAppOptimizer.enableFreezer(false);
ArrayList<ContentProviderRecord> providers = getProvidersForName(name);
if (providers.size() <= 0) {
return false;
}
boolean needSep = false;
for (int i=0; i<providers.size(); i++) {
if (needSep) {
pw.println();
if (providers.size() <= 0) {
return false;
}
needSep = true;
dumpProvider("", fd, pw, providers.get(i), args, dumpAll);
boolean needSep = false;
for (int i=0; i<providers.size(); i++) {
if (needSep) {
pw.println();
}
needSep = true;
dumpProvider("", fd, pw, providers.get(i), args, dumpAll);
}
return true;
} finally {
mAm.mOomAdjuster.mCachedAppOptimizer.enableFreezer(true);
}
return true;
}
/**