有个三星的平台,发现
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/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