Add Debug.dumpService(), a public method for "dumpsys" functionality
diff --git a/api/current.xml b/api/current.xml
index 4146859..2e434af 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -114301,6 +114301,23 @@
 <exception name="IOException" type="java.io.IOException">
 </exception>
 </method>
+<method name="dumpService"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+<parameter name="fd" type="java.io.FileDescriptor">
+</parameter>
+<parameter name="args" type="java.lang.String[]">
+</parameter>
+</method>
 <method name="enableEmulatorTraceOutput"
  return="void"
  abstract="false"
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index a4c595d..2e14667 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -57,6 +57,8 @@
  */
 public final class Debug
 {
+    private static final String TAG = "Debug";
+
     /**
      * Flags for startMethodTracing().  These can be ORed together.
      *
@@ -1111,7 +1113,7 @@
                 }
             }
         } else {
-            Log.w("android.os.Debug",
+            Log.wtf(TAG,
                   "setFieldsOn(" + (cl == null ? "null" : cl.getName()) +
                   ") called in non-DEBUG build");
         }
@@ -1127,4 +1129,31 @@
     @Retention(RetentionPolicy.RUNTIME)
     public @interface DebugProperty {
     }
+
+    /**
+     * Get a debugging dump of a system service by name.
+     *
+     * <p>Most services require the caller to hold android.permission.DUMP.
+     *
+     * @param name of the service to dump
+     * @param fd to write dump output to (usually an output log file)
+     * @param args to pass to the service's dump method, may be null
+     * @return true if the service was dumped successfully, false if
+     *     the service could not be found or had an error while dumping
+     */
+    public static boolean dumpService(String name, FileDescriptor fd, String[] args) {
+        IBinder service = ServiceManager.getService(name);
+        if (service == null) {
+            Log.e(TAG, "Can't find service to dump: " + name);
+            return false;
+        }
+
+        try {
+            service.dump(fd, args);
+            return true;
+        } catch (RemoteException e) {
+            Log.e(TAG, "Can't dump service: " + name, e);
+            return false;
+        }
+    }
 }