android内置t卡中预制资源,不打开Shared sdcard功能,内置SD卡中预制资源,删除资源,恢复出厂设置......

不打开Shared sdcard功能,内置SD卡中预制资源,删除资源,恢复出厂设置...

时间:10-02

整理:3721RD

点击:

[Recovery]不打开Shared sdcard功能,内置SD卡中预制资源,删除资源,恢复出厂设置恢复

[DESCRIPTION]

当有内置SD卡,且不打开shared sdcard功能的情况下,需要在SD卡中预置一些客户资源。

这些资源end user可见,也可删除。在资源被user删除之后,执行恢复出厂设置功能,需要恢复这些预置资源。

[SOLUTION]

1. 预置资源到SD卡上

在DCC上搜索 Make_And_DL_FAT_Image.pdf 文件,按照文件将资源预置到SD卡上。

2. 预置同样的资源到user不可见的分区,如/system下。

alps\vendor\mediatek\project_name\artifacts\out\target\product\your_projec

t_name\system\ 下创建目录,

将预制资源放于此目录下,重新build new之后,system image中就带有预制资源。

3. recovery结束,拷贝资源到SD卡上。

在recovery main函数的结尾,也就是恢复出厂设置,或者SD卡升级之后,通过客制

化函数,将特定的文件copy到SD卡下。

int

main(int argc, char **argv) {

...

//添加这个客制化函数用来恢复特定文件夹下的所有文件,包括子目录,这里是案例

:/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\n", __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\n", __func__);

return 0;

}

好啊1111111111

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值