原理:

android recovery在进入回复出厂设置的时候,主界面点击恢复出厂设置,系统将重启,后加载u-boot,内核之后,运行recovery自己的ramdisk.img(不是正常启动的ramdisk),之后将挂载recovery分区,进入recover模式,这个时候清除data分区中的数据使用的是从物理上格式化data分区的,而不是使用rm -rf 删除数据的方式进行删除。而FAT分区在android系统上从物理层面讲不是独立的分区,而是从data分区中分离出来的,如果烧录软件时已经是物理的分区,那么recovery.cpp中直接去掉格式化FAT分区即可。但如果不是物理上的FAT分区,而是从data分区分离出来,那么就需要修改物理格式化data分区(即删除格式化data的实现方式)的实现方式,将其修改成删除data分区上的文件。

修改方法如下:

diff --git a/bootable/recovery/recovery.cpp b/bootable/recovery/recovery.cpp
index d803cadf17..8f743988cd 100644
--- a/bootable/recovery/recovery.cpp
+++ b/bootable/recovery/recovery.cpp
@@ -77,6 +77,11 @@ RecoveryUI* ui = NULL;char* locale = NULL;char recovery_version[PROPERTY_VALUE_MAX+1];+#define KEEP_MEDIA
+
+#define CIRCLE_DROP
+//#define EXEC_DROP
+/** The recovery tool communicates with the main system through /cache files.*   /cache/recovery/command - INPUT - command line for tool, one arg per line
@@ -358,6 +363,99 @@ erase_volume(const char *volume) {ui->SetBackground(RecoveryUI::ERASING);ui->SetProgressType(RecoveryUI::INDETERMINATE);+    //--------------------modify recovery not format but rm
+    int ret = 0;
+#ifdef KEEP_MEDIA
+         if(is_cache){
+            ensure_path_unmounted(volume);
+            ret = format_volume(volume);
+          }else{
+            if(strcmp(volume,"/data") == 0){
+                int  m_ret = ensure_path_mounted(volume);
+                LOGE("------------  erase_volume m_ret= %d,  %s\n", m_ret, volume);
+                m_ret = rename("/data/media/0/NaviOne", "/data/media/NaviOne");
+                LOGE("------------  erase_volume rename NaviOne m_ret= %d,  %s\n", m_ret, volume);
+                m_ret = rename("/data/media/0/T7Multimedia", "/data/media/T7Multimedia");
+                LOGE("------------  erase_volume rename T7Multimedia m_ret= %d,  %s\n", m_ret, volume);
+            }
+            /*
+            if(0==system("for file in /data/*;do  if [ \"$file\" != \"/data/media\" ]; then busybox rm -rf $file; fi  ; done")){
+                return 0;
+            }else{
+                LOGE("clean data partition error!!!\n");
+                return -1;
+            }
+            */
+            DIR* dir;
+            DIR* dir2;
+            pid_t pid;
+            dir = opendir(volume);
+            struct dirent* det;
+            char path1[PATH_MAX];
+            strcpy(path1, volume);
+            strcat(path1, "/");
+            int pathlen = strlen(path1);
+            //char path2[PATH_MAX];
+            //strcpy(path2, "rm -rf ");
+            //int pathlen2 = strlen(path2);
+            LOGE("------------  erase_volume path1= %s\n", path1);
+            //LOGE("------------  erase_volume path2= %s\n", path2);
+            LOGE("------------  erase_volume path1 len= %d\n", pathlen);
+            //LOGE("------------  erase_volume path2 len= %d\n", pathlen2);
+
+            while ((det = readdir(dir)) != NULL) {+                 LOGE("------------  erase_volume readdir name= %s\n", det->d_name);
+                 if(strcmp(det->d_name,".") == 0
+                       || strcmp(det->d_name,"..") == 0  /*||  strcmp(det->d_name,"media") == 0 || strcmp(det->d_name,"lost+found") == 0 */)
+                 {+                       LOGE("------------  erase_volume not del name= %s\n", det->d_name);
+                       continue;
+                 }
+
+                 //strcat(path1, det->d_name);
+                 strcpy(path1+pathlen, det->d_name);
+                 LOGE("------------  erase_volume  path1 = %s\n", path1);
+                 if(strcmp(det->d_name,"NaviOne") == 0 || strcmp(det->d_name,"T7Multimedia") == 0){+                       LOGE("------------  erase_volume ignore continue !!!  = %s\n", path1);
+                       continue;
+                 }
+            #ifdef CIRCLE_DROP
+                 dir2 = opendir(path1);
+                 if(dir2 != NULL){+                     LOGE("------------  erase_volume circle enter path1 = %s\n", path1);
+                     erase_volume(path1);
+                 }else{+                     int re = remove(path1);
+                     LOGE("------------  erase_volume circle remove file path1 = %s, ret=%d\n", path1, re);
+                 }
+                 closedir(dir2);
+                 dir2 = NULL;
+
+            #endif
+            #ifdef EXEC_DROP
+               if ((pid = fork()) < 0) {+                 LOGE("------------  erase_volume exec fork < 0 path1 = %s\n", path1);
+               } else if (pid == 0) {+                 LOGE("------------  erase_volume exec fork = 0 path1 = %s\n", path1);
+                 int ret_e = execl("/system/bin/busybox", "rm", "-rf", path1, (char *)0);
+                 LOGE("------------  erase_volume exec fork = 0  ret = %d\n", ret_e);
+                 exit(127);
+               }
+            #endif
+
+
+            }
+            if(strcmp(volume,"/data") != 0){+                int rex = remove(volume);
+                LOGE("------------  erase_volume circle remove dir = %s, ret=%d\n", volume, rex);
+            }
+            closedir(dir);
+
+          }
+          return ret;
+
+#endif
+saved_log_file* head = NULL;if (is_cache) {diff --git a/bootable/recovery/roots.cpp b/bootable/recovery/roots.cpp
index 8441508c3b..f68e8abf34 100644
--- a/bootable/recovery/roots.cpp
+++ b/bootable/recovery/roots.cpp
@@ -132,6 +132,7 @@ int ensure_path_mounted(const char* path) {find_mounted_volume_by_mount_point(v->mount_point);if (mv) {// volume is already mounted
+        LOGE("--------volume already  mounted volumes\n");return 0;}@@ -153,6 +154,7 @@ int ensure_path_mounted(const char* path) {strcmp(v->fs_type, "ubifs") == 0) {result = mount(v->blk_device, v->mount_point, v->fs_type,MS_NOATIME | MS_NODEV | MS_NODIRATIME, "");
+        LOGE("--------volume   mounted path=%s mount_point=%s ret=%d\n", path, v->mount_point, result);if (result == 0) return 0;LOGE("failed to mount %s (%s)\n", v->mount_point, strerror(errno));
............................................

i.mx6 android4.4.3 recovery时不删除内部SD卡上的导航地图和媒体文件等相关推荐

  1. Android4.4之后SD卡存储方案

    由于Android4.4之后,Android限制了第三方应用在SD卡中的公用目录的写权限,所以我们无法再公用目录创建文件夹,写入文件,但是读操作不受限制,(系统应用如文件管理器,或者root用户不除外 ...

  2. C++中反向遍历map时怎样删除元素

    文章目录 前言 map的正向遍历 map 遍历时删除元素 map 的反向遍历 map 反向遍历时删除元素 总结 前言 今天在解决一个问题 <5710. 积压订单中的订单总数> 时用到了ma ...

  3. IMX6DL 在Android4.4.2版本插入SD卡不能开机

    最近在调试SD的时候,在板子开机之后两个SD卡座都是能正常读取的,但后来忘了把SD卡取下来,之后再开机,发现居然跑到半路就死机了,而且只有TF1有这现象,TF2插卡开机正常. 在TF1插入SD卡启动时 ...

  4. Android4.4以后第三方应用无法删除短信的解决方案

    一.概述 最近测试提交了一个bug:用我们的应用删除Android5.0手机上的短信失败. 二.原因分析 在google查阅后得知:Android为了防止第三方软件拦截短信和偷发短信吸费,在andro ...

  5. 微软:外接 USB 设备或 SD 卡时将无法更新 Windows 1903

    近日,微软发布了一篇支持文档,提醒 Window 10 用户,如果使用外部 USB 存储设备或 SD 卡,即将发布的 2019 年 5 月更新(即 1903 版)可能无法正确安装. 该公告指出,受影响 ...

  6. pandas使用read_csv函数读取文件时指定数据列的数据类型、pandas使用read_csv函数读取文件时通过keep_default_na参数设置缺失值替换为空字符串

    pandas使用read_csv函数读取文件时指定数据列的数据类型.pandas使用read_csv函数读取文件时通过keep_default_na参数设置缺失值替换为空字符串 目录

  7. 在Win10删除Ubuntu时直接删除分区后,如何删除启动项(EFI)

    亲测可用 [[一开始我是按照网上教程先在第二个盘压缩个分区来装,此时我的第二个盘不是GPT格式,不知道后来进不去ubuntu是不是与这个有关,装完后发现第二个磁盘有ubuntu的引导项,可是进不去:我 ...

  8. wordpress添加html媒体文件,WordPress“添加媒体”文件时只显示上传到当前文章的附件图片...

    最近子凡把很大一部分精力都分散在了泪雪建站的改版和泪雪网的运营中去了,随着泪雪网的定位和内容的新增,网站也需要有很多细节的升级,而在今天就给大家分享一个 WordPress 如何在编辑文章时" ...

  9. 爱奇艺怎么开启从列表删除时同时删除本地文件

    1.先打开电脑,双击电脑桌面上的爱奇艺. 爱奇艺怎么开启从列表删除时同时删除本地文件 2.然后点击爱奇艺边上的下拉箭头. 爱奇艺怎么开启从列表删除时同时删除本地文件 3.之后点击设置. 爱奇艺怎么开启 ...

最新文章

  1. antd 能自适应吗_ACC自适应巡航能当自动驾驶用吗?答:不能
  2. 企鹅帝国的疯狂反扑!
  3. Android Studio项目转Eclipse项目
  4. 如何删除Windows 7的保留分区
  5. Angular的NgModule
  6. 模拟断电oracle数据不一致,Oracle数据库案例整理-Oracle系统运行时故障-断电导致数据文件状态变为RECOVER...
  7. Android音频系统扫盲
  8. IPFS python api 示例
  9. Linux的安装教程 | 菜鸟教程
  10. 华为外包公司一面二面三面回顾
  11. 张晓龙2018微信公开课
  12. 某finecms的csrf漏洞(CVE-2018-18191)
  13. 老博客里的另一篇文章《自由与爱情》,实际是一句名言的中英文对照~
  14. Android 按钮点击设置静音
  15. 赵小楼《天道》《遥远的救世主》深度解析(124)遇事别怕,出事别躲
  16. 援引Yaphets的话:我又不淡定了
  17. php银行卡号姓名,PHP实现根据银行卡号判断银行_PHP
  18. 计算机网络实验报告 静态路由的配置
  19. java 十六进制转十进制_「16进制转10进制」Java:十六进制转换成十进制 - seo实验室...
  20. 滴水逆向第二集-作业

热门文章

  1. 文献学习(part99)--Fast unfolding of communities in large networks
  2. Java微信企业(批量)转账到零钱(超详细)
  3. Android TV开发 开源项目收集
  4. 高效的稳定性测试工具Fastbot的使用
  5. IP地址转换、主机大小端、htonl、ntohl实现
  6. 二级管工作原理(PN结原理)学习
  7. linux gnu grub,GNU GRUB命令的使用方法与GNU GRUB详细介绍
  8. Classic AutoSAR架构基础入门(CP)
  9. 好用的视频播放sdk ijkplayer 二次封装的ijkplay
  10. Show me Why 软件破解教程目录 与 试看教程 更新工具和教程 (2015-04-22 更新试看链接)