在root设备上,我尝试运行一个读取内核日志的cat命令,如下所示:
Process p = Runtime.getRuntime().exec("su");
p = Runtime.getRuntime().exec("/system/bin/cat /proc/kmsg");
su命令已成功执行但不是cat。 我尝试使用getInputStream()读取命令的输出,但没有任何内容,如下所示:
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((read = err.read(buffer)) > 0)
{ //read error to buffer
catOutput.append(buffer, 0, read);
}
in.close();
我使用与ls命令相同的代码而不是显示内核日志,它工作正常并向我显示结果。
我想知道在执行cat命令时我得到了什么错误并希望在shell上看到错误消息。尝试了p.getErrorStream(),但它没有给我任何结果。 任何人都可以帮助我吗?谢谢。
答案 0 :(得分:0)
以下是关于如何执行此操作的全面示例 - 请注意,我从this回答了这个想法:
public void catKmsg() {
Runtime runtime = Runtime.getRuntime();
Process proc = null;
OutputStreamWriter osw = null;
StringBuilder sbstdOut = new StringBuilder();
StringBuilder sbstdErr = new StringBuilder();
String command="/system/bin/cat /proc/kmsg";
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) {
}
}
答案 1 :(得分:0)
我终于通过使用RootTools库找到了解决问题的方法。 最近发布(问我的问题几个月后),RootTools提供了一个易于使用的工具集,可帮助运行需要root权限的命令。在创建shell命令之前,我创建了一个包装器来检查root访问是否可用:
void testRootToolsCommand(String command){
if (RootTools.isRootAvailable())
toastMessage("Root is available !!!");
else {
toastMessage("NO ROOT !!! ");
return;
}
int timeOut = 1000;
try {
List<String> output = RootTools.sendShell(command,timeOut);
toastMessage("OUTPUT of the command \n" + output.toString());
} catch (RootToolsException re) {
toastMessage("Funny thing happened with RootTools!!! ");
} catch (TimeoutException te)
{
toastMessage("Timeout exception - Increase timeout !!! !!! ");
}
catch (Exception e) {
toastMessage(e.getMessage().toString());
}
}
函数调用的一个例子是:
testRootToolsCommand("cat /proc/kmsg > /sdcard/jun11_4h51.txt");
注意:该工具还支持一次运行多个命令。