Recover后升级失败,unknown volume for path

有个三星的平台,发现

Finding update package...

I:Update location: /sdcard/update.zip

Opening update package...

E:unknown volume for path [/sdcard/update.zip]

sysutil: Unable to open '/sdcard/update.zip': No such file or directory

E:failed to map file


三星经常碰到一些弱智的问题,看问题说是找不到 /sdcard/update.zip  ,明明自己放上去了呀,是不是权限有问题。


后来发现问题还是有,


首先找到 recovery_ramdisk 的 fstab看看

xxxxxx是你们设备的路径,lunch 的时候回lunch 到相应设备的vendorsetup.sh

vi device/xxxxxx/xxxxxx/recovery.fstab

/dev/block/platform/dw_mmc.2 /by-num/p1    /boot               ext4      defaults   defaults

/dev/block/platform/dw_mmc.2 /by-num/p2    /system               ext4      defaults   defaults

/dev/block/platform/dw_mmc.2 /by-num/p3    /cache               ext4      defaults   defaults

/dev/block/platform/dw_mmc.2 /by-num/p5    /misc               emmc      defaults   defaults

/dev/block/platform/dw_mmc.2 /by-num/p6    /recovery               emmc      defaults   defaults

/dev/block/platform/dw_mmc.2 /by-num/p7    /data               ext4      defaults   defaults


并没有找到 sdcard的挂载部分,那 /sdcard就是空的咯,这个fstab看上去我就不是很顺眼


然后看看recovery_ramdisk 的 init.rc

vi  bootable/recovery/etc/init.rc

14on init
15    export PATH /sbin:/system/bin
16    export ANDROID_ROOT /system
17    export ANDROID_DATA /data
18    export EXTERNAL_STORAGE /sdcard
19
20    symlink /system/etc /etc
21
22    mkdir /sdcard
23    mkdir /system
24    mkdir /data
25    mkdir /cache
26    mkdir /sideload
27    mount tmpfs tmpfs /tmp
28
29    chown root shell /tmp
30    chmod 0775 /tmp
31
32    write /proc/sys/kernel/panic_on_oops 1
33    write /proc/sys/vm/max_map_count 1000000


发现就做了这两个事情,傻逼葛,新建一个就可以了?什么都没有,空的

export EXTERNAL_STORAGE /sdcard
mkdir /sdcard


那就是/sdcard没有挂载咯, 那就去看看android_ramdisk

xxx是你自己设备名

看一下init.xxx.rc

vi  device/xxxx/xxxx/init.xxx.rc

 
  
10    export EXTERNAL_STORAGE /storage/emulated/legacy
11    export EMULATED_STORAGE_SOURCE /mnt/shell/emulated
12    export EMULATED_STORAGE_TARGET /storage/emulated
13
14    # Support legacy paths
15    symlink /storage/emulated/legacy /sdcard
16    symlink /storage/emulated/legacy /mnt/sdcard
17    symlink /storage/emulated/legacy /storage/sdcard0
18    symlink /mnt/shell/emulated/0 /storage/emulated/legacy

 
  
发现人家是link到/mnt/shell/emulated/0 去的,这个/mnt/shell/emulated/0 什么鬼,往下面看


100# virtual sdcard daemon running as media_rw (1023)
101service sdcard /system/bin/sdcard -u 1023 -g 1023 -l /data/media /mnt/shell/emulated
102    class late_start


哦哦,原来是/data/media ,google把人家的data分区使劲虚拟,变成内部的sdcard,おかしい ,用来处理多用户数据虚拟出 0 1 2 3 .... 各种虚拟分区

那就是/data/media/0 咯,我记得是把update.zip放到 /sdcard上去, 其实就是放在/data/media/0,然后触发升级。


额,那,就是说东西在/data/media/0上面,recovery_ramdisk的init.rc新建的/sdcard又没有去虚拟挂载到/data/media/0 ,所以就是空的。



怎么解决呢?

有好几种方法

1、在Init.rc 中添加 代码将/sdcard  挂载到 /data/media/0  同时需要将 /system/bin/sdcard  拿过来

2、sdcard就算挂载了在 recovery_ramdisk出了升级都没有什么毛用 ,直接将路径改到/data/media/0 

3、不在/data/media/0 内置存储升级了,自己同时修改 android_ramdisk 和 recovery_ramdisk 的外置存储 /sdcard1 上面去 同时挂载到外部的 sd卡进行升级  


我选了第二种:

 
  
1078    if (update_package) {
1079        // For backwards compatibility on the cache partition only, if
1080        // we're given an old 'root' path "CACHE:foo", change it to
1081        // "/cache/foo".
1082        if (strncmp(update_package, "CACHE:", 6) == 0) {
1083            int len = strlen(update_package) + 10;
1084            char* modified_path = (char*)malloc(len);
1085            strlcpy(modified_path, "/cache/", len);
1086            strlcat(modified_path, update_package+6, len);
1087            printf("(replacing path \"%s\" with \"%s\")\n",
1088                   update_package, modified_path);
1089            update_package = modified_path;
1090        }
   +        else if(strncmp(update_package, "/sdcard/", 8) == 0){
   +            int len = strlen(update_package) + 14;
   +            char* modified_path = (char*)malloc(len);
   +            strlcpy(modified_path, "/data/media/0/", len);
   +            strlcat(modified_path, update_package+8, len);
   +             printf("(replacing path \"%s\" with \"%s\")\n",
   +                update_package, modified_path);
   +             update_package = modified_path;
   +                }

1091    }

这样就OK了,如果其它不是data分区的话,比如添加的其它分区,recovery也会帮你mount上,不过记得
 
  


install_package(update_package, &wipe_cache,TEMPORARY_INSTALL_FILE, true);        第四个参数设置成为true




 


































你可能感兴趣的:(Recover后升级失败,unknown volume for path)