Loading core/java/android/os/ServiceManager.java +14 −0 Original line number Diff line number Diff line Loading @@ -287,6 +287,20 @@ public final class ServiceManager { } } /** * Get service debug info. * @return an array of information for each service (like listServices, but with PIDs) * @hide */ public static ServiceDebugInfo[] getServiceDebugInfo() { try { return getIServiceManager().getServiceDebugInfo(); } catch (RemoteException e) { Log.e(TAG, "error in getServiceDebugInfo", e); return null; } } /** * This is only intended to be called when the process is first being brought * up and bound by the activity manager. There is only one thread in the process Loading core/java/android/os/ServiceManagerNative.java +4 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ class ServiceManagerProxy implements IServiceManager { throw new RemoteException(); } public ServiceDebugInfo[] getServiceDebugInfo() throws RemoteException { return mServiceManager.getServiceDebugInfo(); } /** * Same as mServiceManager but used by apps. * Loading services/core/java/com/android/server/Watchdog.java +25 −7 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.os.IPowerManager; import android.os.Looper; import android.os.Process; import android.os.RemoteException; import android.os.ServiceDebugInfo; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; Loading Loading @@ -135,6 +136,11 @@ public class Watchdog extends Thread { "android.system.suspend@1.0::ISystemSuspend" ); public static final String[] AIDL_INTERFACE_PREFIXES_OF_INTEREST = new String[] { "android.hardware.light.ILights/", "android.hardware.power.stats.IPowerStats/", }; private static Watchdog sWatchdog; /* This handler will be used to post message back onto the main thread */ Loading Loading @@ -515,12 +521,11 @@ public class Watchdog extends Thread { return builder.toString(); } private static ArrayList<Integer> getInterestingHalPids() { private static void addInterestingHidlPids(HashSet<Integer> pids) { try { IServiceManager serviceManager = IServiceManager.getService(); ArrayList<IServiceManager.InstanceDebugInfo> dump = serviceManager.debugDump(); HashSet<Integer> pids = new HashSet<>(); for (IServiceManager.InstanceDebugInfo info : dump) { if (info.pid == IServiceManager.PidConstant.NO_PID) { continue; Loading @@ -532,24 +537,37 @@ public class Watchdog extends Thread { pids.add(info.pid); } return new ArrayList<Integer>(pids); } catch (RemoteException e) { return new ArrayList<Integer>(); Log.w(TAG, e); } } private static void addInterestingAidlPids(HashSet<Integer> pids) { ServiceDebugInfo[] infos = ServiceManager.getServiceDebugInfo(); if (infos == null) return; for (ServiceDebugInfo info : infos) { for (String prefix : AIDL_INTERFACE_PREFIXES_OF_INTEREST) { if (info.name.startsWith(prefix)) { pids.add(info.debugPid); } } } } static ArrayList<Integer> getInterestingNativePids() { ArrayList<Integer> pids = getInterestingHalPids(); HashSet<Integer> pids = new HashSet<>(); addInterestingAidlPids(pids); addInterestingHidlPids(pids); int[] nativePids = Process.getPidsForCommands(NATIVE_STACKS_OF_INTEREST); if (nativePids != null) { pids.ensureCapacity(pids.size() + nativePids.length); for (int i : nativePids) { pids.add(i); } } return pids; return new ArrayList<Integer>(pids); } @Override Loading Loading
core/java/android/os/ServiceManager.java +14 −0 Original line number Diff line number Diff line Loading @@ -287,6 +287,20 @@ public final class ServiceManager { } } /** * Get service debug info. * @return an array of information for each service (like listServices, but with PIDs) * @hide */ public static ServiceDebugInfo[] getServiceDebugInfo() { try { return getIServiceManager().getServiceDebugInfo(); } catch (RemoteException e) { Log.e(TAG, "error in getServiceDebugInfo", e); return null; } } /** * This is only intended to be called when the process is first being brought * up and bound by the activity manager. There is only one thread in the process Loading
core/java/android/os/ServiceManagerNative.java +4 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ class ServiceManagerProxy implements IServiceManager { throw new RemoteException(); } public ServiceDebugInfo[] getServiceDebugInfo() throws RemoteException { return mServiceManager.getServiceDebugInfo(); } /** * Same as mServiceManager but used by apps. * Loading
services/core/java/com/android/server/Watchdog.java +25 −7 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.os.IPowerManager; import android.os.Looper; import android.os.Process; import android.os.RemoteException; import android.os.ServiceDebugInfo; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; Loading Loading @@ -135,6 +136,11 @@ public class Watchdog extends Thread { "android.system.suspend@1.0::ISystemSuspend" ); public static final String[] AIDL_INTERFACE_PREFIXES_OF_INTEREST = new String[] { "android.hardware.light.ILights/", "android.hardware.power.stats.IPowerStats/", }; private static Watchdog sWatchdog; /* This handler will be used to post message back onto the main thread */ Loading Loading @@ -515,12 +521,11 @@ public class Watchdog extends Thread { return builder.toString(); } private static ArrayList<Integer> getInterestingHalPids() { private static void addInterestingHidlPids(HashSet<Integer> pids) { try { IServiceManager serviceManager = IServiceManager.getService(); ArrayList<IServiceManager.InstanceDebugInfo> dump = serviceManager.debugDump(); HashSet<Integer> pids = new HashSet<>(); for (IServiceManager.InstanceDebugInfo info : dump) { if (info.pid == IServiceManager.PidConstant.NO_PID) { continue; Loading @@ -532,24 +537,37 @@ public class Watchdog extends Thread { pids.add(info.pid); } return new ArrayList<Integer>(pids); } catch (RemoteException e) { return new ArrayList<Integer>(); Log.w(TAG, e); } } private static void addInterestingAidlPids(HashSet<Integer> pids) { ServiceDebugInfo[] infos = ServiceManager.getServiceDebugInfo(); if (infos == null) return; for (ServiceDebugInfo info : infos) { for (String prefix : AIDL_INTERFACE_PREFIXES_OF_INTEREST) { if (info.name.startsWith(prefix)) { pids.add(info.debugPid); } } } } static ArrayList<Integer> getInterestingNativePids() { ArrayList<Integer> pids = getInterestingHalPids(); HashSet<Integer> pids = new HashSet<>(); addInterestingAidlPids(pids); addInterestingHidlPids(pids); int[] nativePids = Process.getPidsForCommands(NATIVE_STACKS_OF_INTEREST); if (nativePids != null) { pids.ensureCapacity(pids.size() + nativePids.length); for (int i : nativePids) { pids.add(i); } } return pids; return new ArrayList<Integer>(pids); } @Override Loading