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

原理:

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));
............................................

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值