我一直试图在我的android手机上运行一些Linux命令
Process process = Runtime.getRuntime().exec(COMMAND);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));并且注意到,我只能运行特定的命令并获得正确的输出,即使设备是以SuperSU为根的(我还用没有SuperSU的设备对其进行了测试)。
例如,如果我运行ls并尝试将其放到屏幕上(通过TextView),如下所示:
public void onBtnClick(View view) {
try {
EditText commandLine = findViewById(R.id.commandText);
Process process = Runtime.getRuntime().exec(commandLine.getText().toString());
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
((TextView) findViewById(R.id.mainTextView)).setText(((TextView) findViewById(R.id.mainTextView)).getText() + "\n" + in.readLine());
commandLine.setText("");
} catch (IOException e) {
e.printStackTrace();
}
}输出是acct,这是有意义的。
但是另一方面,如果假设我运行了pwd,它会给出以下错误:
W/System.err: java.io.IOException:运行exec()错误。命令: pwd工作目录: null环境: null
我在网上做了一些研究,偶然发现Termux可以通过终端完全控制手机,这正是我想要做的(为了我自己的学习和测试目的)。
虽然它只是一个仿真器,它完全可以做我想做的事情,但是唯一的问题是它需要我通过终端输入命令。
我来这里的目的是复制Termux为自己做的事情,这样我就可以从应用程序的Java代码中正确地运行Linux命令,而不需要用户实际输入命令。
有人能帮助我在我的设备上正确地运行这些命令的起点和基础知识吗?
发布于 2019-01-19 03:01:03
Termux声明它不像传统的Linux bash那样工作,因为当它第一次在/ data /data/com.termux/files/usr中的数据目录中设置数据目录时,它设置了自己的虚拟ish环境-- 这里和这里,根据官方的android文档,exec(command)方法,
在单独的进程中执行指定的字符串命令。 这是一种方便的方法。对表单exec(命令)的调用与调用exec(命令,null,null)的行为完全相同。
因此,如果它是一个单独的进程,那么在执行命令时,它将在该进程的目录中运行它( Linux中的每个进程都得到它的目录,并被分配给os使用的PID )。因此,ls命令提供给您的只是进程目录中的任何内容。您应该像/proc/31415/一样,并且只有一个acct文件(普通Linux中的cgroup)。
您应该做的是在调用getRuntime().exec()时声明目录中的命令--参见上面的链接,以找到所需的正确链接。我建议使用处理所有参数的覆盖。你需要这样的东西:
String[] cmd = {"mkdir", "testDir"};
File env = new File(getFilesDir().getAbsolutePath());
Runtime.getRuntime().exec(cmd, null, env);此外,看看Termux的安装程序代码 (exec() )也没什么坏处。它会让您很好地忽略设置环境以及使用基本命令。
另外,我认为您已经这样做了,但是再次检查以确保您正在为您的应用程序请求WRITE_EXTERNAL_STORAGE许可。
https://stackoverflow.com/questions/54260411
复制相似问题