i.mx6 android4.4.3 recovery时不删除内部SD卡上的导航地图和媒体文件等
程序员文章站
2022-06-24 19:41:47
原理:android recovery在进入回复出厂设置的时候,主界面点击恢复出厂设置,系统将重启,后加载u-boot,内核之后,运行recovery自己的ramdisk.img(不是正常启动的ramdisk),之后将挂载recovery分区,进入recover模式,这个时候清除data分区中的数据使用的是从物理上格式化data分区的,而不是使用rm -rf 删除数据的方式进行删除。而FAT分区在android系统上从物理层面讲不是独立的分区,而是从data分区中分离出来的,如果烧录软件时已经是物理的分区...
原理:
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));
............................................
本文地址:https://blog.csdn.net/jinron10/article/details/108727780