Runtime.exec():在Android重新启动?
我正在寻找一个解决scheme,可以用来重新启动一个有根的设备。 我知道重新启动设备对于用户来说是非常糟糕的devise, 正如这里所说的那样 ,而不是真正的应用程序。 主要目的是在testing期间重新启动手机(我工作在一个video聊天应用程序,有时我需要重新启动时,一切都南下)
我观察到,重新启动电话比使用ACTION_REBOOT重新启动时通常在terminal(例如adb shell
或ConnectBot)中重新启动要快得多 ,我无法继续使用。
目前,我能够获得超级用户权限
Process root = Runtime.getRuntime().exec("su");
但我不能做实际的重新启动。 我尝试G1(HTC)和Galaxy S(三星),没有任何成功。 我在/system/bin/reboot
find了可执行文件
以下是我的一些尝试:
Process reboot = Runtime.getRuntime().exec("/system/bin/reboot"); Process reboot = Runtime.getRuntime().exec("reboot"); Process reboot = Runtime.getRuntime().exec("su reboot");
我阅读这篇关于Runtime.exec()的缺陷的文章 ,但我想我不是这种情况。
由于使用ConnectBot使我可以做这样的行动,我敢肯定这是可能的。 请不要告诉我去看看ConnectBot代码 ,这是一个大而复杂的项目:)
你能帮我解决这个问题吗?
谢谢。
重启在Android中正常工作。 你可能没有正确地执行runtime.exec()。 你需要处理
public static void rebootSU() { 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) { } }
最后经过几周的search:
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
我发现我不能以编程方式重新启动。
另外,我可以使用terminal模拟器应用程序在我的android手机上打开一个terminal窗口,键入su获得root访问的#提示,然后键入“#reboot”,我得到“不允许!
有什么build议么?
好吧,我不明白,我知道了。 在HTC手机上,即使使用SU root访问权限,重新启动命令也不起作用。 需要调用BUSYBOX来执行重启命令。
此代码适用于三星Galaxy S2,S4,索尼Xperia S(LTi 26)
public static void rebootDevice() { try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes("reboot \n"); } catch (Throwable t) {t.printStackTrace;} }
经过漫长的斗争,我find了工作的解
如果您的系统使用串口,那么执行下面的命令,
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
如果使用正常的端口然后在命令下面取消
Runtime.getRuntime().exec(new String[]{"/system/xbin/su","-c","reboot now"});
区别只在/bin
和/xbin
所以可以像第一个命令抛出exception然后执行第二个代码。