[Android][Recovery] Recovery下找不到sdcard路径
做升级的时候,把更新包拷贝到sd卡中,然后调用接口进行重启升级
wossoneri.github.io
File update_file = new File("/sdcard/update.zip");
try {
    Log.d("WOW", "install " + update_file.getAbsolutePath());
    RecoverySystem.installPackage(getBaseContext(), update_file);
} catch (IOException e) {
    e.printStackTrace();
}
之后进入Recovery模式后报错:
Supported API: 3
charge_status 3, charged 0, status 0, capacity 62
Finding update package...
Opening update package...
E:unknow volume for path [/storage/emulated/0/update.zip]
E:failed to map file
Installation aborted.
说是找不到/storage/emulated/0这个路径?
因为上层用Java写路径的时候,获取的是Android的路径,我们知道,adb shell里面是有/sdcard的路径的,这个路径实际上并不是插入的SD卡路径,而是一个内置路径。
内置路径通过 ls -l 可以看到 /sdcard 的映射
lrwxrwxrwx 1 root root 21 1970-01-01 08:00 sdcard -> /storage/self/primary
也就是说下面几个路径是一样的
/sdcard/
/storage/emulated/0
/storage/self/primary而外置sd卡路径是
/storage/0658-0900
所以,我们代码里写的是/sdcard但是传到Recovery的路径就变成/storage/emulated/0了。
我们的需求是把升级包放到sdcard里面去,所以就需要修改Recovery里的文件路径。
实际要做的就是把获得到的路径里面/storage/emulated/0替换成/sdcard即可:
Recovery里面的sd卡路径就是/sdcard/
    if (update_package) {
        // For backwards compatibility on the cache partition only, if
        // we're given an old 'root' path "CACHE:foo", change it to
        // "/cache/foo".
        if (strncmp(update_package, "CACHE:", 6) == 0) {
            int len = strlen(update_package) + 10;
            char* modified_path = (char*)malloc(len);
            if (modified_path) {
                strlcpy(modified_path, "/cache/", len);
                strlcat(modified_path, update_package+6, len);
                printf("(replacing path \"%s\" with \"%s\")\n",
                       update_package, modified_path);
                update_package = modified_path;
            }
            else
                printf("modified_path allocation failed\n");
        } else if(strncmp(update_package, "/storage/emulated/0/", 20) == 0) {
            int len = strlen(update_package) + 20;
            char* modified_path = (char*)malloc(len);
            if (modified_path) {
                strlcpy(modified_path, "/sdcard/", len);
                strlcat(modified_path, update_package+20, len);
                printf("(replacing path \"%s\" with \"%s\")\n",
                       update_package, modified_path);
                update_package = modified_path;
            }
            else
                printf("modified_path allocation failed\n");
        }
Ref https://blog.csdn.net/wed110/article/details/9943915?utm_source=blogxgwz1
[Android][Recovery] Recovery下找不到sdcard路径的更多相关文章
- Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确
		Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确 目录在/etc/ngnix/conf.d下找出nginx配置文件路径和测试配置文件是否正确# /usr/sbin ... 
- Android的Recovery中font_10x10.h字库文件制作
		任务是要汉化Android中的Recovery,就了解了bootable/recovery/minui/font_10x18.h这个英文字库的来历,最终汉化的时候并没有自己汉字字库,用的github上 ... 
- Android系统Recovery工作原理之使用update.zip升级过程分析(三)【转】
		本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464699 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经 ... 
- Android系统Recovery工作原理之使用update.zip升级过程分析(一)
		通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是Android系统的启动 ... 
- Android系统Recovery模式的工作原理【转】
		本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464987 在使用update.zip包升级时怎样从主系统(main system)重启进 ... 
- Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作【转】
		本文转载自:http://blog.csdn.net/mu0206mu/article/details/7399822 这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过 ... 
- Android 的Recovery机制【转】
		本文转载自:http://blog.csdn.net/fengying765/article/details/38301895 Android 的Recovery机制 目录 1. 系统的启动模式 1 ... 
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】
		本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465603 Android系统Recovery工作原理之使用update.zip ... 
- Android系统Recovery工作原理之使用update.zip升级过程分析(八)---解析并执行升级脚本updater-script【转】
		本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465551 Android系统Recovery工作原理之使用update.zip升级过程分 ... 
随机推荐
- FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据
			如何使用FFmpeg抽取音视频的音频数据,代码如下: void adts_header(char *szAdtsHeader, int dataLen); // 使用FFmpeg从视频中抽取音频 vo ... 
- [Swift]LeetCode167. 两数之和 II - 输入有序数组 | Two Sum II - Input array is sorted
			Given an array of integers that is already sorted in ascending order, find two numbers such that the ... 
- [Swift]LeetCode508. 出现次数最多的子树元素和 | Most Frequent Subtree Sum
			Given the root of a tree, you are asked to find the most frequent subtree sum. The subtree sum of a ... 
- [Swift]LeetCode891. 子序列宽度之和 | Sum of Subsequence Widths
			Given an array of integers A, consider all non-empty subsequences of A. For any sequence S, let the ... 
- openstack快速安装之packstack
			最简单的openstack安装方式之packstack 一.环境准备 我们安装的是all-in-one环境的openstack,测试机IP:192.168.1.10 [root@openstack ~ ... 
- log4cplus使用(二)-自定义日志等级
			log4cplus支持用户自定义日志等级,操作也比较简单,使用之前贴如下宏定义 #define LOG4CPLUS_MACRO_CREASH_LOG_LEVEL(pred) LOG4CPLUS_UNL ... 
- Jenkins时区设置为北京时间
			打开 [系统管理]->[脚本命令行]运行下面的命令 System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/ ... 
- 华为oj之字符串分割
			题目: 字符串分隔 热度指数:6139 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •连续输入字符串, ... 
- 行为驱动:Cucumber + Selenium + Java(二) - 第一个测试
			在上一篇中,我们搭建好了Selenium + Cucumber + Java的自动化测试环境,这一篇我们就赶紧开始编写我们的第一个BDD测试用例. 2.1 创建features 我们在新建的java项 ... 
- C#3.0导航
			C#3.0主要特性 智能的编译器 编译器,背后的默默付出者 Lamdba表达式与表达式树 匿名方法的革命 扩展方法 优雅的对类进扩展 (待完成) LINQ 还有这种操作? (待完成) 
