zoukankan      html  css  js  c++  java
  • [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")
    ",
                           update_package, modified_path);
                    update_package = modified_path;
                }
                else
                    printf("modified_path allocation failed
    ");
            } 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")
    ",
                           update_package, modified_path);
                    update_package = modified_path;
                }
                else
                    printf("modified_path allocation failed
    ");
            }
    

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

  • 相关阅读:
    深入Vue.js从源码开始(二)
    Vue.js的动态组件模板
    Vue中的methods、watch、computed
    Understand .sync in Vue
    vue程序中组件间的传值方式
    xUtils框架的介绍(一)
    xUtils框架的介绍(二)
    Java如何计算hashcode值
    Java网络编程总结
    深入Java线程管理(五):线程池
  • 原文地址:https://www.cnblogs.com/rossoneri/p/9894936.html
Copyright © 2011-2022 走看看