前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Android][Recovery] Recovery下找不到sdcard路径

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

作者头像
wOw
发布2020-01-20 16:48:42
2.3K0
发布2020-01-20 16:48:42
举报
文章被收录于专栏:wOw的Android小站wOw的Android小站

做升级的时候,把更新包拷贝到sd卡中,然后调用接口进行重启升级

代码语言:javascript
复制
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模式后报错:

代码语言:javascript
复制
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/

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档