【发布时间】:2015-09-26 13:58:35
【问题描述】:
如何在 android 上运行交互式 shell? (根设备)
我需要接下来的步骤:
1 - 执行 shell 进程(onCreate)
Process p = Runtime.getRuntime().exec(String[]{"su","-c","sh"});
2 - 获取输出 (onCreate)
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream));
//dos is a field (a class attribute)
dos = new DataOutputStream(p.getOutputStream());
new Thread(new Runnable() {
@Override
public void run() {
String l;
//wait the console output and write it
while((l = br.readLine()) != null) {
Log.v("info", l);
}
}
}).start();
3 - 执行命令 (Button -> onClick())
cmd("wpa_cli");
cmd方法是:
public void cmd(String cmd) {
dos.writeBytes(cmd + "\n");
dos.flush();
}
日志从不显示控制台输出。
下一步:
4 - 获取 wpa_cli 子命令的输出(另一个 Button -> onClick())
cmd("help");
应该显示 wpa_cli 帮助,但它不起作用。
如果我多次按下按钮出现不完整的输出(帮助)
在创建 Activity 并使其保持活动状态以进行交互时,初始化进程的正确方法是什么?
谢谢。
邮政数据
我换了行Log.v("info", l);
fos.write(l);
Message msg = handlerTest.obtainMessage();
msg.obj = l;
handlerTest.sendMessage(msg);
fos -> FileOutputStream 对象
Handler handlerTest = new Handler() {
@Override
handleMessage(Message msg) {
if (msg != null) {
//alert... (String)msg.obj;
}
}
};
并且只显示来自直接命令的警报,例如help。命令status 仅在流关闭时有效。 (执行cmd("quit");和cmd("exit");后)
我不明白。标准输出不止一个?我可以在不关闭流的情况下与输出交互吗?
使用adb shell,我读取了输出文件(在关闭流后创建),它就完成了。
PostData2:
问题是缓冲区。在二进制文件(已执行)输出和 java 进程之间,我可以在不使用本机 I/O 的情况下禁用缓冲区吗? Android Terminal Emulator 工作正常,是用 NIO 吗?
【问题讨论】:
-
看看这篇文章 - 特别是它谈论刷新和重定向任何它与操作系统的不同之处:javaworld.com/article/2071275/core-java/…
-
非常感谢@Mick 的帮助。
-
@Mick 在所有示例中都预期进程结束。就我而言,它是不确定的;我需要在流程结束之前从流程中接收数据。 (与之交互)我认为它一定是一些带有 Channel 的 PipedInputStream 和 PipedOutputStream。我一直在寻找更多信息。
标签: android shell process bufferedreader interactive