OSDN Git Service

Recursively delete directories in handleAftermath().
authorTao Bao <tbao@google.com>
Tue, 18 Aug 2015 19:37:02 +0000 (12:37 -0700)
committerTao Bao <tbao@google.com>
Tue, 18 Aug 2015 20:48:17 +0000 (13:48 -0700)
RecoverySystem.handleAftermath() is called to clean up recovery-related
files. It needs to handle non-empty directories as well such as leftover
stashes from failed OTAs.

Bug: 23199081
Change-Id: I33fb326d376d04c793ad7b5948a10e8c1c572812

core/java/android/os/RecoverySystem.java

index 52b10be..2a2ad26 100644 (file)
@@ -68,7 +68,7 @@ public class RecoverySystem {
     /** Send progress to listeners no more often than this (in ms). */
     private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500;
 
-    /** Used to communicate with recovery.  See bootable/recovery/recovery.c. */
+    /** Used to communicate with recovery.  See bootable/recovery/recovery.cpp. */
     private static File RECOVERY_DIR = new File("/cache/recovery");
     private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");
     private static File UNCRYPT_FILE = new File(RECOVERY_DIR, "uncrypt_file");
@@ -506,18 +506,32 @@ public class RecoverySystem {
         String[] names = RECOVERY_DIR.list();
         for (int i = 0; names != null && i < names.length; i++) {
             if (names[i].startsWith(LAST_PREFIX)) continue;
-            File f = new File(RECOVERY_DIR, names[i]);
-            if (!f.delete()) {
-                Log.e(TAG, "Can't delete: " + f);
-            } else {
-                Log.i(TAG, "Deleted: " + f);
-            }
+            recursiveDelete(new File(RECOVERY_DIR, names[i]));
         }
 
         return log;
     }
 
     /**
+     * Internally, delete a given file or directory recursively.
+     */
+    private static void recursiveDelete(File name) {
+        if (name.isDirectory()) {
+            String[] files = name.list();
+            for (int i = 0; files != null && i < files.length; i++) {
+                File f = new File(name, files[i]);
+                recursiveDelete(f);
+            }
+        }
+
+        if (!name.delete()) {
+            Log.e(TAG, "Can't delete: " + name);
+        } else {
+            Log.i(TAG, "Deleted: " + name);
+        }
+    }
+
+    /**
      * Internally, recovery treats each line of the command file as a separate
      * argv, so we only need to protect against newlines and nulls.
      */