自己放某个文件到/cache分区,重启后发现文件消失了,那么是怎么消失的呢?
Step 1.
packages\providers\DownloadProvider\src\com\android\providers\downloads\StorageManager.java:
/*** 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 dirList<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 databasefor (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();}}
/** 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:
/*** 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_FILEString 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_PREFIXString[] 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;}
private static String LAST_PREFIX = "last_";
/cache/recovery目录中,除last_开头的文件都删掉
------------------------------------------------
开机走完这两步后幸存的文件只有 /cache/lost+found目录中的文件,及/cache/recovery/last_ 开头的文件了