Recover后升级失败,unknown volume for path

来源:互联网 发布:海南软件 编辑:程序博客网 时间:2024/06/06 12:43

有个三星的平台,发现

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 init15    export PATH /sbin:/system/bin16    export ANDROID_ROOT /system17    export ANDROID_DATA /data18    export EXTERNAL_STORAGE /sdcard1920    symlink /system/etc /etc2122    mkdir /sdcard23    mkdir /system24    mkdir /data25    mkdir /cache26    mkdir /sideload27    mount tmpfs tmpfs /tmp2829    chown root shell /tmp30    chmod 0775 /tmp3132    write /proc/sys/kernel/panic_on_oops 133    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/legacy11    export EMULATED_STORAGE_SOURCE /mnt/shell/emulated12    export EMULATED_STORAGE_TARGET /storage/emulated1314    # Support legacy paths15    symlink /storage/emulated/legacy /sdcard16    symlink /storage/emulated/legacy /mnt/sdcard17    symlink /storage/emulated/legacy /storage/sdcard018    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/emulated102    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, if1080        // we're given an old 'root' path "CACHE:foo", change it to1081        // "/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




 


































0 0
原创粉丝点击