diff --git a/services/java/com/android/server/DropBoxManagerService.java b/services/java/com/android/server/DropBoxManagerService.java
index 5103cf4..e1db6b6 100644
--- a/services/java/com/android/server/DropBoxManagerService.java
+++ b/services/java/com/android/server/DropBoxManagerService.java
@@ -46,7 +46,6 @@
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.Formatter;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -260,7 +259,7 @@
 
         if (PROFILE_DUMP) Debug.startMethodTracing("/data/trace/dropbox.dump");
 
-        Formatter out = new Formatter();
+        StringBuilder out = new StringBuilder();
         boolean doPrint = false, doFile = false;
         ArrayList<String> searchArgs = new ArrayList<String>();
         for (int i = 0; args != null && i < args.length; i++) {
@@ -269,23 +268,23 @@
             } else if (args[i].equals("-f") || args[i].equals("--file")) {
                 doFile = true;
             } else if (args[i].startsWith("-")) {
-                out.format("Unknown argument: %s\n", args[i]);
+                out.append("Unknown argument: ").append(args[i]).append("\n");
             } else {
                 searchArgs.add(args[i]);
             }
         }
 
-        out.format("Drop box contents: %d entries\n", mAllFiles.contents.size());
+        out.append("Drop box contents: ").append(mAllFiles.contents.size()).append(" entries\n");
 
         if (!searchArgs.isEmpty()) {
-            out.format("Searching for:");
-            for (String a : searchArgs) out.format(" %s", a);
-            out.format("\n");
+            out.append("Searching for:");
+            for (String a : searchArgs) out.append(" ").append(a);
+            out.append("\n");
         }
 
         int numFound = 0, numArgs = searchArgs.size();
         Time time = new Time();
-        out.format("\n");
+        out.append("\n");
         for (EntryFile entry : mAllFiles.contents) {
             time.set(entry.timestampMillis);
             String date = time.format("%Y-%m-%d %H:%M:%S");
@@ -297,23 +296,23 @@
             if (!match) continue;
 
             numFound++;
-            out.format("%s.%03d %s", date, entry.timestampMillis % 1000,
-                     entry.tag == null ? "(no tag)" : entry.tag);
+            out.append(date).append(" ").append(entry.tag == null ? "(no tag)" : entry.tag);
             if (entry.file == null) {
-                out.format(" (no file)\n");
+                out.append(" (no file)\n");
                 continue;
             } else if ((entry.flags & DropBoxManager.IS_EMPTY) != 0) {
-                out.format(" (contents lost)\n");
+                out.append(" (contents lost)\n");
                 continue;
             } else {
-                out.format(" (%s%s, %d bytes)\n",
-                        (entry.flags & DropBoxManager.IS_GZIPPED) != 0 ? "compressed " : "",
-                        (entry.flags & DropBoxManager.IS_TEXT) != 0 ? "text" : "data",
-                        entry.file.length());
+                out.append(" (");
+                if ((entry.flags & DropBoxManager.IS_GZIPPED) != 0) out.append("compressed ");
+                out.append((entry.flags & DropBoxManager.IS_TEXT) != 0 ? "text" : "data");
+                out.append(", ").append(entry.file.length()).append(" bytes)\n");
             }
 
             if (doFile || (doPrint && (entry.flags & DropBoxManager.IS_TEXT) == 0)) {
-                out.format("%s%s\n", (doPrint ? "" : "    "), entry.file.getPath());
+                if (!doPrint) out.append("    ");
+                out.append(entry.file.getPath()).append("\n");
             }
 
             if ((entry.flags & DropBoxManager.IS_TEXT) != 0 && (doPrint || !doFile)) {
@@ -329,32 +328,33 @@
                         for (;;) {
                             int n = r.read(buf);
                             if (n <= 0) break;
-                            out.format("%s", new String(buf, 0, n));
+                            out.append(buf, 0, n);
                             newline = (buf[n - 1] == '\n');
                         }
-                        if (!newline) out.format("\n");
+                        if (!newline) out.append("\n");
                     } else {
                         String text = dbe.getText(70);
                         boolean truncated = (text.length() == 70);
-                        out.format("    %s%s\n", text.trim().replace('\n', '/'),
-                                truncated ? " ..." : "");
+                        out.append("    ").append(text.trim().replace('\n', '/'));
+                        if (truncated) out.append(" ...");
+                        out.append("\n");
                     }
                 } catch (IOException e) {
-                    out.format("*** %s\n", e.toString());
+                    out.append("*** ").append(e.toString()).append("\n");
                     Log.e(TAG, "Can't read: " + entry.file, e);
                 } finally {
                     if (dbe != null) dbe.close();
                 }
             }
 
-            if (doPrint) out.format("\n");
+            if (doPrint) out.append("\n");
         }
 
-        if (numFound == 0) out.format("(No entries found.)\n");
+        if (numFound == 0) out.append("(No entries found.)\n");
 
         if (args == null || args.length == 0) {
-            if (!doPrint) out.format("\n");
-            out.format("Usage: dumpsys dropbox [--print|--file] [YYYY-mm-dd] [HH:MM:SS] [tag]\n");
+            if (!doPrint) out.append("\n");
+            out.append("Usage: dumpsys dropbox [--print|--file] [YYYY-mm-dd] [HH:MM:SS] [tag]\n");
         }
 
         pw.write(out.toString());
