自己放某個文件到/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 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();
}
}
- /** 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:
- /**
- * 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;
}
- private static String LAST_PREFIX = "last_";
private static String LAST_PREFIX = "last_";
/cache/recovery目錄中,除last_開頭的文件都刪掉
------------------------------------------------
開機走完這兩步後倖存的文件只有 /cache/lost+found目錄中的文件,及/cache/recovery/last_ 開頭的文件了