Loading core/java/android/os/BinderProxy.java +10 −0 Original line number Diff line number Diff line Loading @@ -359,6 +359,16 @@ public final class BinderProxy implements IBinder { } } /** * Returns the number of binder proxies held in this process. * @return number of binder proxies in this process */ public static int getProxyCount() { synchronized (sProxyMap) { return sProxyMap.size(); } } /** * Dump proxy debug information. * Loading services/core/java/com/android/server/am/ActivityManagerService.java +38 −10 Original line number Diff line number Diff line Loading @@ -496,6 +496,18 @@ public class ActivityManagerService extends IActivityManager.Stub // The minimum memory growth threshold (in KB) for low RAM devices. private static final int MINIMUM_MEMORY_GROWTH_THRESHOLD = 10 * 1000; // 10 MB /** * The number of binder proxies we need to have before we start warning and * dumping debug info. */ private static final int BINDER_PROXY_HIGH_WATERMARK = 6000; /** * Low watermark that needs to be met before we consider dumping info again, * after already hitting the high watermark. */ private static final int BINDER_PROXY_LOW_WATERMARK = 5500; /** * State indicating that there is no need for any blocking for network. */ Loading Loading @@ -8477,7 +8489,8 @@ public class ActivityManagerService extends IActivityManager.Stub mAtmInternal.resumeTopActivities(false /* scheduleIdle */); mUserController.sendUserSwitchBroadcasts(-1, currentUserId); BinderInternal.nSetBinderProxyCountWatermarks(6000,5500); BinderInternal.nSetBinderProxyCountWatermarks(BINDER_PROXY_HIGH_WATERMARK, BINDER_PROXY_LOW_WATERMARK); BinderInternal.nSetBinderProxyCountEnabled(true); BinderInternal.setBinderProxyCountCallback( new BinderInternal.BinderProxyLimitListener() { Loading Loading @@ -9217,11 +9230,6 @@ public class ActivityManagerService extends IActivityManager.Stub if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } dumpBinderProxies(pw); pw.println(); if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } dumpLmkLocked(pw); } pw.println(); Loading @@ -9235,6 +9243,19 @@ public class ActivityManagerService extends IActivityManager.Stub } dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage, dumpAppId); } if (dumpPackage == null) { // Intentionally dropping the lock for this, because dumpBinderProxies() will make many // outgoing binder calls to retrieve interface descriptors; while that is system code, // there is nothing preventing an app from overriding this implementation by talking to // the binder driver directly, and hang up system_server in the process. So, dump // without locks held, and even then only when there is an unreasonably large number of // proxies in the first place. pw.println(); if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } dumpBinderProxies(pw, BINDER_PROXY_HIGH_WATERMARK /* minToDump */); } } /** Loading Loading @@ -9373,7 +9394,7 @@ public class ActivityManagerService extends IActivityManager.Stub cmd, fd, pw, args, opti, true /* dumpAll */, dumpClient, dumpPackage); } else if ("binder-proxies".equals(cmd)) { if (opti >= args.length) { dumpBinderProxies(pw); dumpBinderProxies(pw, 0 /* minToDump */); } else { String uid = args[opti]; opti++; Loading Loading @@ -9714,10 +9735,17 @@ public class ActivityManagerService extends IActivityManager.Stub return false; } void dumpBinderProxies(PrintWriter pw) { void dumpBinderProxies(PrintWriter pw, int minCountToDumpInterfaces) { pw.println("ACTIVITY MANAGER BINDER PROXY STATE (dumpsys activity binder-proxies)"); final int proxyCount = BinderProxy.getProxyCount(); if (proxyCount >= minCountToDumpInterfaces) { dumpBinderProxyInterfaceCounts(pw, "Top proxy interface names held by SYSTEM"); } else { pw.print("Not dumping proxy interface counts because size (" + Integer.toString(proxyCount) + ") looks reasonable"); pw.println(); } dumpBinderProxiesCounts(pw, " Counts of Binder Proxies held by SYSTEM"); } Loading Loading
core/java/android/os/BinderProxy.java +10 −0 Original line number Diff line number Diff line Loading @@ -359,6 +359,16 @@ public final class BinderProxy implements IBinder { } } /** * Returns the number of binder proxies held in this process. * @return number of binder proxies in this process */ public static int getProxyCount() { synchronized (sProxyMap) { return sProxyMap.size(); } } /** * Dump proxy debug information. * Loading
services/core/java/com/android/server/am/ActivityManagerService.java +38 −10 Original line number Diff line number Diff line Loading @@ -496,6 +496,18 @@ public class ActivityManagerService extends IActivityManager.Stub // The minimum memory growth threshold (in KB) for low RAM devices. private static final int MINIMUM_MEMORY_GROWTH_THRESHOLD = 10 * 1000; // 10 MB /** * The number of binder proxies we need to have before we start warning and * dumping debug info. */ private static final int BINDER_PROXY_HIGH_WATERMARK = 6000; /** * Low watermark that needs to be met before we consider dumping info again, * after already hitting the high watermark. */ private static final int BINDER_PROXY_LOW_WATERMARK = 5500; /** * State indicating that there is no need for any blocking for network. */ Loading Loading @@ -8477,7 +8489,8 @@ public class ActivityManagerService extends IActivityManager.Stub mAtmInternal.resumeTopActivities(false /* scheduleIdle */); mUserController.sendUserSwitchBroadcasts(-1, currentUserId); BinderInternal.nSetBinderProxyCountWatermarks(6000,5500); BinderInternal.nSetBinderProxyCountWatermarks(BINDER_PROXY_HIGH_WATERMARK, BINDER_PROXY_LOW_WATERMARK); BinderInternal.nSetBinderProxyCountEnabled(true); BinderInternal.setBinderProxyCountCallback( new BinderInternal.BinderProxyLimitListener() { Loading Loading @@ -9217,11 +9230,6 @@ public class ActivityManagerService extends IActivityManager.Stub if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } dumpBinderProxies(pw); pw.println(); if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } dumpLmkLocked(pw); } pw.println(); Loading @@ -9235,6 +9243,19 @@ public class ActivityManagerService extends IActivityManager.Stub } dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage, dumpAppId); } if (dumpPackage == null) { // Intentionally dropping the lock for this, because dumpBinderProxies() will make many // outgoing binder calls to retrieve interface descriptors; while that is system code, // there is nothing preventing an app from overriding this implementation by talking to // the binder driver directly, and hang up system_server in the process. So, dump // without locks held, and even then only when there is an unreasonably large number of // proxies in the first place. pw.println(); if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } dumpBinderProxies(pw, BINDER_PROXY_HIGH_WATERMARK /* minToDump */); } } /** Loading Loading @@ -9373,7 +9394,7 @@ public class ActivityManagerService extends IActivityManager.Stub cmd, fd, pw, args, opti, true /* dumpAll */, dumpClient, dumpPackage); } else if ("binder-proxies".equals(cmd)) { if (opti >= args.length) { dumpBinderProxies(pw); dumpBinderProxies(pw, 0 /* minToDump */); } else { String uid = args[opti]; opti++; Loading Loading @@ -9714,10 +9735,17 @@ public class ActivityManagerService extends IActivityManager.Stub return false; } void dumpBinderProxies(PrintWriter pw) { void dumpBinderProxies(PrintWriter pw, int minCountToDumpInterfaces) { pw.println("ACTIVITY MANAGER BINDER PROXY STATE (dumpsys activity binder-proxies)"); final int proxyCount = BinderProxy.getProxyCount(); if (proxyCount >= minCountToDumpInterfaces) { dumpBinderProxyInterfaceCounts(pw, "Top proxy interface names held by SYSTEM"); } else { pw.print("Not dumping proxy interface counts because size (" + Integer.toString(proxyCount) + ") looks reasonable"); pw.println(); } dumpBinderProxiesCounts(pw, " Counts of Binder Proxies held by SYSTEM"); } Loading