diff options
| -rw-r--r-- | core/java/android/os/ServiceManager.java | 14 | ||||
| -rw-r--r-- | core/java/android/os/ServiceManagerNative.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/Watchdog.java | 32 | 
3 files changed, 43 insertions, 7 deletions
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java index 71344f90de75..f853e67f87d0 100644 --- a/core/java/android/os/ServiceManager.java +++ b/core/java/android/os/ServiceManager.java @@ -288,6 +288,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       * at that time, so no locking is done. diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java index b70b6b5d209e..60acc57d0cfe 100644 --- a/core/java/android/os/ServiceManagerNative.java +++ b/core/java/android/os/ServiceManagerNative.java @@ -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.       * diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index ab24015a1174..c3f429430d64 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -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; @@ -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 */ @@ -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; @@ -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  |