自己放某個檔案到/cache分區,重啟後發現檔案消失了,那麼是怎麼消失的呢?
Step 1.
packages\providers\DownloadProvider\src\com\android\providers\downloads\StorageManager.java:
[html]
view plaincopyprint?
- /**
- * Removes files in the systemcache and downloads data dir without corresponding entries in
- * the downloads database.
- * This can occur if a delete is done on the database but the file is not removed from the
- * filesystem (due to sudden death of the process, for example).
- * This is not a very common occurrence. So, do this only once in a while.
- */
- private void removeSpuriousFiles() {
- if (true || Constants.LOGV) {
- Log.i(Constants.TAG, "in removeSpuriousFiles");
- }
- // get a list of all files in system cache dir and downloads data dir
- List<File> files = new ArrayList<File>();
- File[] listOfFiles = mSystemCacheDir.listFiles();
- if (listOfFiles != null) {
- files.addAll(Arrays.asList(listOfFiles));
- }
- listOfFiles = mDownloadDataDir.listFiles();
- if (listOfFiles != null) {
- files.addAll(Arrays.asList(listOfFiles));
- }
- if (files.size() == 0) {
- return;
- }
- Cursor cursor = mContext.getContentResolver().query(
- Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI,
- new String[] { Downloads.Impl._DATA }, null, null, null);
- try {
- if (cursor != null) {
- while (cursor.moveToNext()) {
- String filename = cursor.getString(0);
- if (!TextUtils.isEmpty(filename)) {
- if (true || Constants.LOGV) {
- Log.i(Constants.TAG, "in removeSpuriousFiles, preserving file " +
- filename);
- }
- files.remove(new File(filename));
- }
- }
- }
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- // delete the files not found in the database
- for (File file : files) {
- if (file.getName().equals(Constants.KNOWN_SPURIOUS_FILENAME) ||
- file.getName().equalsIgnoreCase(Constants.RECOVERY_DIRECTORY)) {
- continue;
- }
- if (true || Constants.LOGV) {
- Log.i(Constants.TAG, "deleting spurious file " + file.getAbsolutePath());
- }
- file.delete();
- }
- }
/** * Removes files in the systemcache and downloads data dir without corresponding entries in * the downloads database. * This can occur if a delete is done on the database but the file is not removed from the * filesystem (due to sudden death of the process, for example). * This is not a very common occurrence. So, do this only once in a while. */ private void removeSpuriousFiles() { if (true || Constants.LOGV) { Log.i(Constants.TAG, "in removeSpuriousFiles"); } // get a list of all files in system cache dir and downloads data dir List<File> files = new ArrayList<File>(); File[] listOfFiles = mSystemCacheDir.listFiles(); if (listOfFiles != null) { files.addAll(Arrays.asList(listOfFiles)); } listOfFiles = mDownloadDataDir.listFiles(); if (listOfFiles != null) { files.addAll(Arrays.asList(listOfFiles)); } if (files.size() == 0) { return; } Cursor cursor = mContext.getContentResolver().query( Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, new String[] { Downloads.Impl._DATA }, null, null, null); try { if (cursor != null) { while (cursor.moveToNext()) { String filename = cursor.getString(0); if (!TextUtils.isEmpty(filename)) { if (true || Constants.LOGV) { Log.i(Constants.TAG, "in removeSpuriousFiles, preserving file " + filename); } files.remove(new File(filename)); } } } } finally { if (cursor != null) { cursor.close(); } } // delete the files not found in the database for (File file : files) { if (file.getName().equals(Constants.KNOWN_SPURIOUS_FILENAME) || file.getName().equalsIgnoreCase(Constants.RECOVERY_DIRECTORY)) { continue; } if (true || Constants.LOGV) { Log.i(Constants.TAG, "deleting spurious file " + file.getAbsolutePath()); } file.delete(); } }
[html]
view plaincopyprint?
- /** A magic filename that is allowed to exist within the system cache */
- public static final String KNOWN_SPURIOUS_FILENAME = "lost+found";
-
- /** A magic filename that is allowed to exist within the system cache */
- public static final String RECOVERY_DIRECTORY = "recovery";
/** A magic filename that is allowed to exist within the system cache */ public static final String KNOWN_SPURIOUS_FILENAME = "lost+found"; /** A magic filename that is allowed to exist within the system cache */ public static final String RECOVERY_DIRECTORY = "recovery";
除 lost+found, recovery這兩個目錄外的檔案都刪掉
Setp 2.
frameworks\base\core\java\android\os\RecoverySystem.java:
[html]
view plaincopyprint?
- /**
- * Called after booting to process and remove recovery-related files.
- * @return the log file from recovery, or null if none was found.
- *
- * @hide
- */
- public static String handleAftermath() {
- // Record the tail of the LOG_FILE
- String log = null;
- try {
- log = FileUtils.readTextFile(LOG_FILE, -LOG_FILE_MAX_LENGTH, "...\n");
- } catch (FileNotFoundException e) {
- Log.i(TAG, "No recovery log file");
- } catch (IOException e) {
- Log.e(TAG, "Error reading recovery log", e);
- }
-
- // Delete everything in RECOVERY_DIR except those beginning
- // with LAST_PREFIX
- 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);
- }
- }
-
- return log;
- }
/** * Called after booting to process and remove recovery-related files. * @return the log file from recovery, or null if none was found. * * @hide */ public static String handleAftermath() { // Record the tail of the LOG_FILE String log = null; try { log = FileUtils.readTextFile(LOG_FILE, -LOG_FILE_MAX_LENGTH, "...\n"); } catch (FileNotFoundException e) { Log.i(TAG, "No recovery log file"); } catch (IOException e) { Log.e(TAG, "Error reading recovery log", e); } // Delete everything in RECOVERY_DIR except those beginning // with LAST_PREFIX 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); } } return log; }
[html]
view plaincopyprint?
- private static String LAST_PREFIX = "last_";
private static String LAST_PREFIX = "last_";
/cache/recovery目錄中,除last_開頭的檔案都刪掉
------------------------------------------------
開機走完這兩步後倖存的檔案只有 /cache/lost+found目錄中的檔案,及/cache/recovery/last_ 開頭的檔案了
來自:http://blog.csdn.net/zmyde2010/article/details/7408207