Android客制化------恢复出厂设置但保留文件
很久没有记录了,持之以恒做一件事,需要一定的毅力呐!
最近遇到了一个需求,要求恢复出厂设置保留内置sd卡下某个目录的文件。思来想去,从驱动那边备份校准信号文件得到了一些思路。因为带通话设置的装置需要进行校准,我们会将校准的文件保存在/data
下。具体做法呢,在执行恢复出厂设置时,将此文件copy到tmp分区,然后在恢复完成时,再次copy回/data
分区。因为我们是备份文件夹,所以我们需要对copy函数进行修改。下面贴出部分代码。
diff --git a/bootable/recovery/recovery.cpp b/bootable/recovery/recovery.cpp
index 598840c..3693cf1 100644
--- a/bootable/recovery/recovery.cpp
+++ b/bootable/recovery/recovery.cpp
@@ -111,6 +111,8 @@ static const char *OTA_FLAG_FILE = "/cache/recovery/last_ota_flag";#ifdef STK_BACKUP_OFFSET//要备份的文件夹
+static const char *BACKUP_APK_PATH = "/system/third";//临时存储路径
+static const char *TEMP_APK_BACKUP_PATH = "/tmp/third_app";#endif// Number of lines per page when displaying a file on screen
@@ -286,6 +288,116 @@ static int stk_copy_file(const char *src,const char *dstFilePath)printf("stk_copy_file end src=%s,dst=%s\n",src,dstFilePath);return 0;}
//拷贝文件夹的主体函数
+void error_quit(const char *msg)
+{
+ perror(msg);
+ //printf("something is error %s \n",msg);
+}
+
+void change_path(const char *path)
+{
+ printf("Leave %s Successed . . .\n",getcwd(NULL,0));
+
+ if(chdir(path)==-1){
+ error_quit(path);
+ printf("chdir(path)==-1 %s \n",path);
+ return;
+ }
+
+ printf("Entry %s Successed . . .\n",getcwd(NULL,0));
+}
+
+
+void _copy_file(const char *old_path,const char *new_path)
+{
+ FILE *in,*out;
+ size_t len;
+ char buf[64];
+ char *p=getcwd(NULL,0);
+
+ if((in=fopen(old_path,"rb"))==NULL){
+ error_quit(old_path);
+ printf("(in=fopen(old_path %s \n",old_path);
+ return;}
+ change_path(new_path);
+
+ if((out=fopen(old_path,"wb"))==NULL){
+ error_quit(old_path);
+ printf("out=fopen(old_path %s \n",old_path);
+ return;}
+
+ while(!feof(in))
+ {
+ bzero(buf,sizeof(buf));
+
+ len=fread(&buf,1,sizeof(buf)-1,in);
+ fwrite(&buf,len,1,out);
+ }
+
+ fclose(in);
+ fclose(out);
+
+ change_path(p);
+}
+
+char *get_rel_path(const char *dir,const char *path)
+{
+ char *rel_path;
+ unsigned long d_len,p_len;
+
+ d_len=strlen(dir);
+ p_len=strlen(path);
+ bzero(rel_path,d_len+p_len+2);
+
+ strncpy(rel_path,path,p_len);
+ strncat(rel_path,"/",sizeof(char));
+ strncat(rel_path,dir,d_len);
+
+ return rel_path;
+}
+
+void copy_dir(const char *old_path,const char *new_path)
+{
+ DIR *dir;
+ struct stat buf;
+ struct dirent *dirp;
+ char *p=getcwd(NULL,0);
+
+ if((dir=opendir(old_path))==NULL){
+ error_quit(old_path);
+ printf("dir=opendir(old_path) %s \n",old_path);
+ return;
+ }
+ if(mkdir(new_path,0777)==-1){
+ error_quit(new_path);
+ printf("mkdir(new_path %s \n",new_path);
+ return;
+ }
+
+ change_path(old_path);
+
+ while((dirp=readdir(dir)))
+ {
+ if(strcmp(dirp->d_name,".")==0 || strcmp(dirp->d_name,"..")==0)
+ continue;
+ if(stat(dirp->d_name,&buf)==-1){
+ error_quit("stat");
+ printf("stat(dirp->d_name %s \n",stat);
+ return;
+ }
+ if(S_ISDIR(buf.st_mode))
+ {
+ copy_dir(dirp->d_name,get_rel_path(dirp->d_name,new_path));
+ continue;
+ }
+
+ _copy_file(dirp->d_name,new_path);
+ }
+
+ closedir(dir);
+ change_path(p);
+}#endif// command line args come from, in decreasing precedence:// - the actual command line
@@ -1326,6 +1438,7 @@ main(int argc, char **argv) {}#ifdef STK_BACKUP_OFFSET//在开始进入恢复出厂时,进行一次拷贝
+ copy_dir(BACKUP_APK_PATH,TEMP_APK_BACKUP_PATH);#endifdevice->StartRecovery();property_get("UserVolumeLabel", gVolume_label, "");
@@ -1567,8 +1680,11 @@ main(int argc, char **argv) {finish_recovery(send_intent);#ifdef STK_BACKUP_OFFSET//在恢复出厂完成时,我们再次将其拷贝回来
+ copy_dir(TEMP_APK_BACKUP_PATH,BACKUP_APK_PATH);
+ //赋予权限操作
+ chmod(BACKUP_APK_PATH, 0666);
+ chown(BACKUP_APK_PATH, 1000, 1000); // system system#endif#ifdef FOTA_UPDATE_SUPPORTif (perform_fota == 1) {
我们只要重点关注在finish_recovery(send_intent);
与device->StartRecovery();
这两个函数身上即可。我测试过直接从/mnt/sdcard
下拷贝,这样是不行的。因为在执行恢复出厂设置时,这个分区此时还未挂载,我通过代码让其先挂载,但是无效。当然也可能在恢复出厂设置时,我们所要备份的文件夹并不存在,所以贴出代码片中的一些判空都进行了return
。否则会无法开机,串口log一直重复打印log。
如果各位有其他办法,欢迎留言。有不对之处,欢迎指出。
Android客制化------恢复出厂设置但保留文件相关推荐
- Android客制化-恢复出厂设置但保留文件
很久没有记录了,持之以恒做一件事,需要一定的毅力呐! 最近遇到了一个需求,要求恢复出厂设置保留内置sd卡下某个目录的文件.思来想去,从驱动那边备份校准信号文件得到了一些思路.因为带通话设置的装置需要 ...
- Android7.x 通过Recovery保留特定文件实现恢复出厂设置后保留系统语言设置
Android7.x 通过Recovery保留特定文件实现恢复出厂设置后保留系统语言设置 最近有一个需求,要求在恢复出厂设置之后不还原语言设置,由于我们知道语言设置可以在Properties Syst ...
- 恢复出厂设置,保留数据的方法
创建appName/assets/keep_list 在keep_list下添加要保留的文件路径就ok了 eg:/data/fprint/fprint.db 恢复出厂设置,此文件的数据将不会删除
- android 9.0 添加自定义恢复出厂设置标识
说明 android 恢复出厂设置的处理逻辑是RecoverySystem.java中的rebootWipeUserData,源码在recovery.cpp中的main中,前面有想过在recovery ...
- Android源码笔记--恢复出厂设置
最近在学习Android系统源码,这一节主要是了解恢复出厂设置.实现恢复出厂一般是通过发广播操作,如下: //恢复出厂设置 Intent recovery = new Intent("and ...
- Android最新版,恢复出厂设置
文章目录 前言 1.原生设置源码路径: 2.源码解释 3.APP的调用 前言 Android12下,如何恢复出厂设置 1.原生设置源码路径: 系统源码/package/apps/Settings/sr ...
- Android 10.0创建恢复出厂设置不被清除的文件夹节点
在系统开发中,希望保存一些数据 在恢复出厂设置以后也不会被清理掉,这样就希望创建的节点不在被清理的范围内 而recovery主要会清理 /data/ 和 /cache 分区的数据 卸载安装的app A ...
- 恢复出厂设置android手机号码,手机怎么恢复出厂设置 安卓手机恢复出厂设置方法汇总...
最近接连有不少身边的朋友遇到一些比较奇怪的智能手机问题,比如最开始有朋友无意间设置了图案锁屏保护密码,但之后却不记得自设置的图案密码,导致连续五次解锁失败,手机直接成为了锁定状态,需要注册的谷歌账号密 ...
- 恢复出厂设置android手机号码,安卓手机恢复出厂设置会怎么样?
安卓手机恢复出厂设置会怎么样?事实上,用户若是主动将安卓手机恢复出厂设置,未备份的手机号码(在手机里面的,SIM卡中的电话号码不影响).短信.应用.设置等数据就会被直接删除. 安卓手机恢复出厂设置会怎 ...
最新文章
- 2000亿次开放学习后,DeepMind的智能体成精了
- ios推送服务,php服务端
- oracle 未绑定变量,查看Oracle数据库中未绑定变量的SQL
- c++中介者模式mediator
- 直角三角形的边角关系_华师大版九年级第四章解直角三角形,知识点讲解加经典例题分析...
- 课时39.细线表格(理解)
- 前端学习(2738):重读vue电商网站48之通过 chainWebpack 自定义打包入口
- MinGW下编译ffmpeg静态库给Visual C++使用
- 苹果也“翻车”,服务器大面积宕机三小时
- 团队管理(二)-敏捷开发最佳团队协作管理平台(TAPD)
- python自动化办公---工资说明excel生成word再转换成pdf
- android 模拟器装apk,如何在Android模拟器中安装apk文件
- cesium之三维漫游飞行效果实现篇(转)
- 鸿蒙不是Linux也不是安卓
- mysql的my.cnf常用配置
- 创业者两大特征:喜欢折腾与坚持不懈
- ACM比赛一些需要注意的极端情况
- 掌中题库刷题神奇微信小程序介绍
- FreeXploiT HTML(Hacker Technology Mad Lead)
- 被繁杂的数据搞到头大?让 Google Cloud 大数据平台帮你实现快准狠!
热门文章
- sql 逻辑运算符不等于_SQL不等于运算符介绍和示例
- strtol()函数与strtoul()函数的用法
- 智慧地下采矿,“像素游戏”智能呈现
- 矩阵笔记2:矩阵分析(第三版)-史荣昌-第二章:λ-矩阵与矩阵的Jordan标准型
- WebTrust是什么?WebTrust认证的CA有哪些?
- PHPExcel 怎样在单元格里画出斜线边框
- Java Executor源码解析(7)—Executors线程池工厂以及四大内置线程池
- 大数据---大数据分析的道与术(笔记)
- D435i vins搜集资料
- Kinect相机标定(camera_calibration)