When there is a built-in SD card and the shared SDcard feature is not turned on, some customer resources need to be provisioned in the SD card.
These resources end user visible and can also be deleted. After the resource has been deleted by user, the factory reset function is performed and the provisioned resources need to be restored.
1. Pre-provision the same resources to user-invisible partitions, such as/system.
Create a directory under Alps\vendor\mediatek\project_name\artifacts\out\target\product\your_project_name\system\,
The prefab resources are placed in this directory, and the system image has prefabricated resources after the new build.
2. Recovery end, copy resources to SD card.
At the end of the recovery main function, which is to restore the factory settings, or after the SD card upgrade, through the custom function, the specific file copy to the SD card.
Int
Main (int argc, char **argv) {
...
Add this custom function to recover all files under a specific folder, including subdirectories, here is the case:/data/app/--->/sdcard/app/
Recovery_restore_special ("/sdcard/app", "/data/app");
Otherwise, get ready to boot the main system ...
Finish_recovery (send_intent);
Ui->print ("rebooting...\n");
Property_set (Android_rb_property, "reboot,");
return exit_success;
}
int recovery_restore_special (char *des_dir_path, char *src_dir_path)
{
int ret= 0;
printf ("\n\n++%s ++\n\n", __func__);
printf ("src dir:%s\n", src_dir_path);
printf ("Des dir:%s\n", des_dir_path);
Mount Path
ret = ensure_path_mounted (Src_dir_path);
if (Ret < 0) {
printf ("Mount Src dir error:%s\n", Src_dir_path);
return-1;
}
printf ("mount:%s ret=%d\n", Src_dir_path, ret);
ret = ensure_path_mounted (Des_dir_path);
if (Ret < 0) {
printf ("Mount des dir error:%s\n", Des_dir_path);
Ensure_path_unmounted (Src_dir_path);
return-1;
}
printf ("mount:%s ret=%d\n", Des_dir_path, ret);
Restore dir and file
ret = Restore_dir_file (Des_dir_path, Src_dir_path);
printf ("Restore ret=%d\n", ret);
Unmount
Ensure_path_unmounted (Src_dir_path);
Ensure_path_unmounted (Des_dir_path);
printf ("\n\n--%s--\n\n", __func__);
return 0;
}
static int Restore_dir_file (char *des_dir_path, char *src_dir_path)
{
int ret= 0;
dir* dir_des = NULL;
dir* dir_src = NULL;
struct dirent* de_des = NULL;
struct dirent* de_src = NULL;
FILE * fdes = NULL;
FILE * fsrc = NULL;
Char src_file_path[256] = {0};
Char des_file_path[256] = {0};
Char buf[256] = {0};
int name_len = 0;
int size = 0, File_len = 0;
printf ("\n\nenter,%s \ n \ nthe", __func__);
printf ("src dir:%s\n", src_dir_path);
printf ("Des dir:%s\n", des_dir_path);
Open dir
DIR_SRC = Opendir (Src_dir_path);
if (dir_src = = NULL) {
printf ("Open src dir error:%s\n", Src_dir_path);
return-1;
}
Dir_des = Opendir (Des_dir_path);
if (dir_des = = NULL) {
ret =-1;
if (errno = = ENOENT) {
printf ("Des dir not exist:%s\n", Des_dir_path);
ret = mkdir (Des_dir_path, (S_irwxu | S_irwxg | S_IRWXO));
}
if (Ret < 0) {
Closedir (DIR_SRC);
printf ("Open des dir error:%s\n", Des_dir_path);
return-1;
}
else {
printf ("MkDir des dir:%s\n", des_dir_path);
Dir_des = Opendir (Des_dir_path);
}
}
printf ("dir_src=%d, dir_des=%d\n", DIR_SRC, Dir_des);
while ((de_src = Readdir (dir_src)) = NULL) {
printf ("D_name:%s\n", de_src->d_name);
if (De_src->d_type = = Dt_dir) {
Name_len = strlen (de_src->d_name);
Skip "." and ":" Entries
if ((Name_len = = 1 && de_src->d_name[0] = = '. ') | |
(Name_len = = 2 && de_src->d_name[0] = = '. ' && de_src->d_name[1] = = '. ')) {
Continue
}
else {
src dir path Append the folder ' s D_name
sprintf (Src_file_path, "%s/%s", Src_dir_path, De_src->d_name);
printf ("src dir path:%s\n", Src_file_path);
Des dir path Append the folder ' s D_name
sprintf (Des_file_path, "%s/%s", Des_dir_path, De_src->d_name);
printf ("Des dir path:%s\n", Des_file_path);
printf ("---entry sub dir to restore\n");
ret = Restore_dir_file (Des_file_path, Src_file_path);
printf ("Sub dir restore ret=%d\n", ret);
}
}
else if (De_src->d_type = = Dt_reg) {
Open src File
sprintf (Src_file_path, "%s/%s", Src_dir_path, De_src->d_name);
printf ("Src_file_path:%s\n", Src_file_path);
FSRC = fopen (Src_file_path, "R");
printf ("fsrc=%d\n", FSRC);
Create des file
sprintf (Des_file_path, "%s/%s", Des_dir_path, De_src->d_name);
printf ("Des_file_path:%s\n", Des_file_path);
Fdes = Fopen_path (Des_file_path, "w");
printf ("fdes=%d\n", fdes);
Read from src file, write to des file
file_len= 0;
while (!feof (FSRC)) {
Size = fread (buf, sizeof (char), sizeof (BUF), FSRC);
Fwrite (buf, sizeof (char), size, fdes);
memset (buf, 0, sizeof (BUF));
File_len + = size;
}
Fflush (Fdes);
printf ("%s:file_len=%d\n", De_src->d_name, File_len);
Close File
Fclose (FSRC);
Fclose (Fdes);
}
}
Close Dir
Closedir (DIR_SRC);
Closedir (Dir_des);
printf ("\n\nexit,%s \ n \ nthe", __func__);
return 0;
}
Android does not open the shared SDcard feature, built-in SD card prefabricated resources, delete resources, restore factory settings restore