资讯专栏INFORMATION COLUMN

[Android][Recovery] Recovery下找不到sdcard路径

hufeng / 2534人阅读

摘要:我们的需求是把升级包放到里面去,所以就需要修改里的文件路径。实际要做的就是把获得到的路径里面替换成即可里面的卡路径就是

做升级的时候,把更新包拷贝到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 failedn");
        } 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 failedn");
        }

Ref https://blog.csdn.net/wed110/article/details/9943915?utm_source=blogxgwz1

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2642.html

相关文章

  • nexus5 刷 Android6.0+Xposed

    摘要:不得不说现在的刷机工具都做的方便快捷,只需要简单的几天命令就解决了。以前用刷的时候还需要装一堆驱动软件啥的。此办法的好处是无需很多技巧,但是坏处是包更新不及时,比如到了安卓使用该包就会刷入老的内核版本。工具包刷的前记得开启调试模式。 不得不说现在的刷机工具都做的方便快捷,只需要简单的几天命令就解决了。以前用windows刷的时候还需要装一堆驱动软件啥的。 原文链接: nexus5 刷 ...

    YancyYe 评论0 收藏0
  • android常用名词收集

    摘要:以后你就能再次用这个备份来将手机恢复到这个状态。这个词语来自的用户,享有最高权限。通常不要去手机,如果操作不当,对手机系统造成损坏,可能会开不了机等。而一般是用来初始安装的首选途径。此外模式下还能解锁。 持续学习,持续更新...... AOSP AOSP stands for Android Open Source Project. Stock Stock Android is wh...

    bingchen 评论0 收藏0
  • adb 常用命令

    摘要:常用命令的全称为,就是起到调试桥的作用。它的主要功能有运行设备的命令行管理模拟器或设备的端口映射计算机和设备之间上传下载文件将本地软件安装至模拟器或设备。 adb 常用命令 ADB的全称为Android Debug Bridge,就是起到调试桥的作用。ADB是android sdk(Android专属的软件开发工具包)里的一个工具, 用这个工具可以直接操作管理android模拟器或者真...

    yanwei 评论0 收藏0
  • Android分区

    摘要:分区实际上是一个简单的系统,当内核启动完毕后,开始执行第一个程序。实质上就是格式化分区,这样我们安装的所有和程序数据就都丢失了。分区大小修改一般在和固件中的中1. Android 分区: 2. Android各个分区的作用: 2.1 modem分区 实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区,在所有适配的ROM中这部分是不动,否则会造成通话不稳定 2.2 boo...

    testHs 评论0 收藏0
  • 由零开始学习小程序架构

    摘要:背景,大公司占据入口流量,小程序百花齐放的,你如何由零开始学习小程序架构。大纲查看亿级小程序学习源码学习小程序常用构建常用的小程序基础库构建自己的小程序框架查看亿级小程序学习源码安装模拟器,或者已经的旧手机。 背景,大公司占据入口流量,小程序百花齐放的2019,你如何由零开始学习小程序架构。 大纲: 1、查看亿级小程序学习源码2、学习小程序常用API3、构建常用的小程序基础库4、构建自...

    Shonim 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<