自己放某个文件到/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();        }    }
    /** 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;    }
private static String LAST_PREFIX = "last_";
/cache/recovery目录中,除last_开头的文件都删掉


------------------------------------------------

开机走完这两步后幸存的文件只有 /cache/lost+found目录中的文件,及/cache/recovery/last_ 开头的文件了







更多相关文章

  1. Unity3D与安卓原生的交互(二)
  2. Android(安卓)APK文件结构 完整打包编译的流程 APK安装过程 详解
  3. android apk编译打包过程
  4. android常用adb命令
  5. Android(安卓)拍照 录音 拍视频 旋转 裁剪 压缩图片
  6. Android(安卓)3.1 r1 中文API文档 (121) —— ResourceCursorTre
  7. Android面试总结(持续更新)
  8. ArcGis for Android(安卓)shp
  9. NPM 和webpack 的基础使用

随机推荐

  1. android framework 层服务 分析
  2. Android(安卓)Studio中设置ButterKnife、
  3. android panellistview 圆角实现代码
  4. Android如何在java代码中设置margin
  5. suse linux android sdk 下载.安装.配置
  6. 安卓巴士Android开发神贴整理
  7. android 状态栏 时间 错误 adb连接
  8. Android(安卓)Studio 初体验
  9. android 自定义attr 详解
  10. Android内存管理、监测剖析