【问题标题】:Reboot in Recovery Android在恢复 Android 中重新启动
【发布时间】:2011-08-18 17:26:19
【问题描述】:

我终于设法让重启代码工作了。我使用了以下代码:

        Runtime runtime = Runtime.getRuntime();
        Process proc = null;
        OutputStreamWriter osw = null;
        StringBuilder sbstdOut = new StringBuilder();
        StringBuilder sbstdErr = new StringBuilder();

        String command="/system/bin/reboot";

        try { // Run Script

            proc = runtime.exec("su");
            osw = new OutputStreamWriter(proc.getOutputStream());
                                osw.write(command);
                    osw.flush();
            osw.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (osw != null) {
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();                    
                }
            }
        }
        try {
            if (proc != null)
                proc.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        sbstdOut.append(ReadBufferedReader(new InputStreamReader(proc
                .getInputStream())));
        sbstdErr.append(ReadBufferedReader(new InputStreamReader(proc
                .getErrorStream())));
        if (proc.exitValue() != 0) {
                    }

现在我想要一个将设备重新启动到恢复模式的代码。该应用程序仅适用于三星 Galaxy S。我没有找到任何用于在恢复中重新启动的代码,有没有办法通过代码在恢复中重新启动?

【问题讨论】:

    标签: android recovery reboot


    【解决方案1】:

    如果重启命令的版本和它在该设备上调用的后端支持它,这可能会起作用:

    String command="/system/bin/reboot recovery";
    

    当然要意识到,在您使用 su 程序的那一刻,您正在使用不受支持的 android 修改。

    【讨论】:

    • 就像 Chris 上面所说的,但我会将其写为 su -c reboot recovery,因为 su 已在 Android 系统路径中定义,因此您无需提供应用程序的完整路径。
    • @Chuong - 否。此代码执行“su”进程并将命令输入通过管道传输到其中,因为“su”黑客并不都接受从命令行执行的命令。由于在输入命令字符串时“su”已经在运行,因此您不想在命令中再次包含“su”。此外,当以 root 身份执行操作时,您不希望信任可能已被攻击者更改的路径设置,而是明确指定目标可执行文件。
    • 我忘了提到,OP 可以一步运行我上面提供的命令,而不是激活su 然后运行像/system/bin/reboot recovery 这样的工作进程。无论哪种方式都适用于 OP。 :)
    • @Chuong - 不,一般情况下他们不能。正如您所看到的,如果您花一些时间阅读类似的问题,只有 一些 'su' hack 允许您指定要在命令行上运行的命令及其参数,而其他人则要求您启动后将命令和参数通过管道传输到进程中。请记住,应用程序用户可访问的“su”不是 Android 的一部分,而是非标准售后黑客。
    【解决方案2】:

    你为什么不使用:

    ((PowerManager) getSystemService(Context.POWER_SERVICE)).reboot("recovery");

    http://developer.android.com/reference/android/os/PowerManager.html#reboot%28java.lang.String%29

    【讨论】:

    • 此 api 需要 REBOOT (android.permission.REBOOT) 权限。根据此权限的声明(在 frameworks/base/core/res/AndroidManifest.xml 中),它的 protectionLevel 是“签名”。也就是说,使用这个api的app的apk应该使用和app声明权限的证书相同的证书进行签名,即'framework-res'。如果签名的证书不可用,则不使用“/system/bin/reboot”就更难实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多