如何从android中的应用程序以编程方式刷新zip

时间:2014-09-26 15:11:41

标签: java android shell root recovery

我正在尝试构建一个应用程序,它会自动重启恢复并从我的SD卡中刷一个拉链。 这个应用程序可以使用系统应用程序权限,因为我将它用作系统应用程序, 我怎么能这样做?

我试过这段代码

   File zip = new File("/sdcard/test.zip");
    if(zip.exists()) {
        Toast.makeText(context,"ZIP EXIST!",Toast.LENGTH_LONG).show();

        Process p = Runtime.getRuntime().exec("sh");
        OutputStream os = p.getOutputStream();
        os.write("mkdir -p /cache/recovery/\n".getBytes());
        os.write("echo 'boot-recovery' >/cache/recovery/command\n".getBytes());
        String cmd = "echo '--update_package=/sdcard/test.zip' >> /cache/recovery/command\n";
        os.write(cmd.getBytes());
        os.flush();

        // Trigger the reboot
        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        powerManager.reboot("recovery");
    }
    else{
        Toast.makeText(context,"ZIP NOT EXIST!",Toast.LENGTH_LONG).show();
    }

我也试过这段代码:

 Process p = Runtime.getRuntime().exec("/system/bin/sh");
    OutputStream os = p.getOutputStream();
    os.write("echo 'boot-recovery ' > /cache/recovery/command".getBytes());
    os.write("echo '--update_package=/sdcard/test.zip' >> /cache/recovery/command".getBytes());
    os.write("echo '--wipe_cache' >> /cache/recovery/command".getBytes());
    os.write("echo 'reboot' >> /cache/recovery/command".getBytes());
    os.write("reboot recovery".getBytes());

    os.flush();

       PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                    powerManager.reboot("recovery");

但它所做的只是重启恢复,它不会闪现我的拉链。 请帮忙。

P.S

我在使用TWRP恢复的nexus 5上使用android L

1 个答案:

答案 0 :(得分:1)

我相信你的问题是因为不同的Android版本,在 JellyBean(4.1)以及更高版本的 sdcard数据被放置在目录/storage/emulated/0中您正在使用的目录/sdcard是指/storage/emulated,因此,为了使其工作,您必须将目录更改为/sdcard/0,这将使命令如下:

  • 第一方式:

    String cmd = "echo '--update_package=/sdcard/0/test.zip' >> /cache/recovery/command\n";
    
  • 第二方式:

    os.write("echo '--update_package=/sdcard/0/test.zip' >> /cache/recovery/command".getBytes());