0

我正在研究 Brix android x86 系统。插入模块后(在模块中引入内存崩溃代码导致恐慌),它会恐慌。但是,系统不会自动重启。它挂起。你能告诉恐慌后自动重启android的步骤吗?

谢谢和问候, Pankaj

4

2 回答 2

1

根据您的要求,您可以将这些代码放在您需要的地方。

您可以使用这两种情况

  1. 您的应用程序必须使用系统应用程序签名

    // 必须是系统应用

    void reboot(Context context) {
    
    PowerManager pm = (PowerManager) context
            .getSystemService(Context.POWER_SERVICE);
    
    pm.reboot(null);
    }
    
  2. 您的设备必须植根

    if (ShellInterface.isSuAvailable()) {
                                ShellInterface.runCommand("-su");
                                ShellInterface.runCommand("reboot");
        }
    

ShellInterface.class

public class ShellInterface {
private static final String TAG = "ShellInterface";

private static String shell;

// uid=0(root) gid=0(root)
private static final Pattern UID_PATTERN = Pattern
        .compile("^uid=(\\d+).*?");

enum OUTPUT {
    STDOUT, STDERR, BOTH
}

private static final String EXIT = "exit\n";

private static final String[] SU_COMMANDS = new String[] { "su",
        "/system/xbin/su", "/system/bin/su" };

private static final String[] TEST_COMMANDS = new String[] { "id",
        "/system/xbin/id", "/system/bin/id" };

public static synchronized boolean isSuAvailable() {
    if (shell == null) {
        checkSu();
    }
    return shell != null;
}

public static synchronized void setShell(String shell) {
    ShellInterface.shell = shell;
}

private static boolean checkSu() {
    for (String command : SU_COMMANDS) {
        shell = command;
        if (isRootUid())
            return true;
    }
    shell = null;
    return false;
}

private static boolean isRootUid() {
    String out = null;
    for (String command : TEST_COMMANDS) {
        out = getProcessOutput(command);
        if (out != null && out.length() > 0)
            break;
    }
    if (out == null || out.length() == 0)
        return false;
    Matcher matcher = UID_PATTERN.matcher(out);
    if (matcher.matches()) {
        if ("0".equals(matcher.group(1))) {
            return true;
        }
    }
    return false;
}

public static String getProcessOutput(String command) {
    try {
        return _runCommand(command, OUTPUT.STDERR);
    } catch (IOException ignored) {
        return null;
    }
}

public static boolean runCommand(String command) {
    try {
        _runCommand(command, OUTPUT.BOTH);
        return true;
    } catch (IOException ignored) {
        return false;
    }
}

private static String _runCommand(String command, OUTPUT o)
        throws IOException {
    DataOutputStream os = null;
    Process process = null;
    try {
        process = Runtime.getRuntime().exec(shell);
        os = new DataOutputStream(process.getOutputStream());
        InputStreamHandler sh = sinkProcessOutput(process, o);
        os.writeBytes(command + '\n');
        os.flush();
        os.writeBytes(EXIT);
        os.flush();
        process.waitFor();
        if (sh != null) {
            String output = sh.getOutput();
            Log.d(TAG, command + " output: " + output);
            return output;
        } else {
            return null;
        }
    } catch (Exception e) {
        final String msg = e.getMessage();
        Log.e(TAG, "runCommand error: " + msg);
        throw new IOException(msg);
    } finally {
        try {
            if (os != null) {
                os.close();
            }
            if (process != null) {
                process.destroy();
            }
        } catch (Exception ignored) {
        }
    }
}

public static InputStreamHandler sinkProcessOutput(Process p, OUTPUT o) {
    InputStreamHandler output = null;
    switch (o) {
    case STDOUT:
        output = new InputStreamHandler(p.getErrorStream(), false);
        new InputStreamHandler(p.getInputStream(), true);
        break;
    case STDERR:
        output = new InputStreamHandler(p.getInputStream(), false);
        new InputStreamHandler(p.getErrorStream(), true);
        break;
    case BOTH:
        new InputStreamHandler(p.getInputStream(), true);
        new InputStreamHandler(p.getErrorStream(), true);
        break;
    }
    return output;
}

private static class InputStreamHandler extends Thread {
    private final InputStream stream;
    private final boolean sink;
    StringBuffer output;

    public String getOutput() {
        return output.toString();
    }

    InputStreamHandler(InputStream stream, boolean sink) {
        this.sink = sink;
        this.stream = stream;
        start();
    }

    @Override
    public void run() {
        try {
            if (sink) {
                while (stream.read() != -1) {
                }
            } else {
                output = new StringBuffer();
                BufferedReader b = new BufferedReader(
                        new InputStreamReader(stream));
                String s;
                while ((s = b.readLine()) != null) {
                    output.append(s);
                }
            }
        } catch (IOException ignored) {
        }
    }
}
}
于 2014-06-23T12:21:40.467 回答
0

您可以使用“echo c > /proc/sysrq-trigger”命令强制内核崩溃。更多调试日志可以通过内核恐慌日志查看。

于 2017-07-23T14:24:45.677 回答