gpt4 book ai didi

android - 在android上完成终端控制

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:05 25 4
gpt4 key购买 nike

我一直在尝试使用

在我的 Android 手机上运行一些 Linux 命令
Process process = Runtime.getRuntime().exec(COMMAND);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));

并且注意到我只能运行特定的命令并获得正确的输出,即使该设备已使用 SuperSU Root (我还使用没有安装 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: Error running exec(). Command: [pwd] Working Directory: null Environment: null

我在网上做了一些研究,偶然发现了 Termux可以通过终端完全控制手机,这正是我想要制作的(出于我自己的学习和测试目的)。

虽然它只是一个模拟器,但它可以完全按照我的意愿行事,但唯一的问题是它需要我通过终端输入命令。

我在这里的目的是复制 Termux 为我自己做的事情,这样我就可以从应用程序的 Java 代码正确运行 Linux 命令,而不需要用户实际输入命令。

谁能帮助我了解从哪里开始以及在我的设备上正确运行这些命令的基础知识?

最佳答案

Termux 声明它不像传统的 Linux bash 那样工作,因为它在/data/data/com.termux/files/usr 中的数据目录中首次设置时设置了自己的虚拟环境,参见 herehere此外,根据 the official android docsexec(command) 方法,

Executes the specified string command in a separate process.

This is a convenience method. An invocation of the form exec(command) behaves in exactly the same way as the invocation exec(command, null, null).

因此,如果它是一个单独的进程,当执行命令时,它将在该进程的目录中运行它(Linux 中的每个进程都获取其目录并分配一个操作系统使用的 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 的 installer code(exec())也没什么坏处。它会让您很好地忽略设置环境以及使用基本命令。

此外,我认为您已经完成了,但请仔细检查以确保您正在为您的应用程序请求 WRITE_EXTERNAL_STORAGE 权限。

关于android - 在android上完成终端控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54260411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com