做升级的时候,把更新包拷贝到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路径的更多相关文章

  1. Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确

    Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确 目录在/etc/ngnix/conf.d下找出nginx配置文件路径和测试配置文件是否正确# /usr/sbin ...

  2. Android的Recovery中font_10x10.h字库文件制作

    任务是要汉化Android中的Recovery,就了解了bootable/recovery/minui/font_10x18.h这个英文字库的来历,最终汉化的时候并没有自己汉字字库,用的github上 ...

  3. Android系统Recovery工作原理之使用update.zip升级过程分析(三)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464699 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经 ...

  4. Android系统Recovery工作原理之使用update.zip升级过程分析(一)

    通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是Android系统的启动 ...

  5. Android系统Recovery模式的工作原理【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464987  在使用update.zip包升级时怎样从主系统(main system)重启进 ...

  6. Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7399822 这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过 ...

  7. Android 的Recovery机制【转】

    本文转载自:http://blog.csdn.net/fengying765/article/details/38301895 Android 的Recovery机制 目录 1. 系统的启动模式 1 ...

  8. Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465603       Android系统Recovery工作原理之使用update.zip ...

  9. Android系统Recovery工作原理之使用update.zip升级过程分析(八)---解析并执行升级脚本updater-script【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465551  Android系统Recovery工作原理之使用update.zip升级过程分 ...

随机推荐

  1. [SQL]LeetCode178. 分数排名 | Rank Scores

    Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ra ...

  2. [Swift]LeetCode609. 在系统中查找重复文件 | Find Duplicate File in System

    Given a list of directory info including directory path, and all the files with contents in this dir ...

  3. [Swift]LeetCode924.尽量减少恶意软件的传播 | Minimize Malware Spread

    In a network of nodes, each node i is directly connected to another node j if and only if graph[i][j ...

  4. NumPy 学习笔记(三)

    NumPy 数组操作: 1.修改数组形状 a.numpy.reshape(arr, newshape, order='C') 在不改变数据的条件下修改形状 b.numpy.ndarray.flat 是 ...

  5. RabbitMQ 学习笔记

    环境: MacOS 10.14 Node.js 8.9.1 零.背景 目前有个上线应用会接受多个请求,且每个请求的处理时间可能很久,可能到数小时,所以就想采用异步机制,至于复杂的运算就用消息队列(MQ ...

  6. Kibana(一张图片胜过千万行日志)

    Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作. 你用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互. 你可以轻松地执行高级 ...

  7. mybatis中resultMap配置细则

    resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在mybatis映射器配置细则这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMa ...

  8. IntelliJ IDEA maven项目new里没有package

    idea maven项目new里没有package. 如图,idea maven项目new里没有package.: 这是因为java是普通的文件夹,要设置为Source Root 设置好以后可以了.

  9. leetcode — palindrome-partitioning

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  10. SQLServer特殊字符/生僻字与varchar

    对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时v ...