【问题标题】:Adding a compiler to run a java code and show the output添加编译器以运行 java 代码并显示输出
【发布时间】:2022-01-04 23:23:48
【问题描述】:

我正在制作一个可以运行 c、c++ 和 java 程序的 android 应用程序。该应用程序将各个文件存储在一个文件夹中,并使用以下代码执行。每当我单击编译按钮时,它都会显示一个 IO 异常,说“error=13 权限被拒绝”。

 try {
                p = Runtime.getRuntime().exec(path + "/PocketIDE/JavaPrograms/"+ filename);
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(p.getInputStream()));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    output2.append(line).append("\n");
                    p.waitFor();
                }
                String response = output2.toString();
                output.setText(response);
            } catch (IOException | InterruptedException e) {
                output.setText(e.toString());
                e.printStackTrace();
            }

上述方法是执行程序的正确方法吗?还是我需要更改代码?

【问题讨论】:

  • 为了从设备读取文件,您需要请求正确的权限。谷歌诸如“android请求文件权限”之类的更多细节。
  • @Code-Apprentice 我已经申请了在清单中修改、读取和写入外部存储的权限...我还需要包含任何其他权限吗?
  • 让我们退后一步。哪一行导致错误?我假设Runtime.getRuntime().exec() 方法,对吧?读写权限不允许您执行任何操作。即使这样做了,使用运行您的应用程序的相同运行时实例执行任意代码似乎很危险。您应该派生一个新进程来运行程序,以便它可以在自己的沙箱中运行,并且在运行时不会干扰您的应用程序。

标签: java android android-studio compiler-construction


【解决方案1】:
            p = Runtime.getRuntime().exec(path + "/PocketIDE/JavaPrograms/"+ filename);

您不应使用控制应用执行的运行时运行任意 Java 代码。这会带来一个巨大的安全漏洞,因此 Android 不允许这样做。相反,您应该找到一种在其自己的环境和运行时中执行 Java 代码的方法。

【讨论】:

  • 好的,谢谢,我会寻找另一种方法来执行代码。答案很有帮助,谢谢。
【解决方案2】:

你代码中的语句可以用来执行其他程序,但不一定是个好主意。

exec 方法在内部forks 应用程序的进程并创建一个新进程,该进程立即执行您给它的系统命令。

根据您代码中的路径,我假设您尝试执行二进制可执行文件,自 API 级别 28 以来 Android 不再允许这样做:

以 Android 10 为目标的不受信任的应用无法对应用主目录中的文件调用 exec()。从可写应用程序主目录执行文件是 W^X 违规。应用应仅加载嵌入在应用的 APK 文件中的二进制代码。

唯一可能的解决方案是将 API 级别降低到 28 或在打包时将二进制文件包含在 APK 文件中。

【讨论】:

  • 当您考虑它时,“可能的解决方案”正在损害安全性。根本不是解决方案。
  • 关于我的第一个解决方案,你是对的。我之所以包含它,是因为我认为 OP 使用了一些博客中的代码,并且想知道它为什么不起作用(仅适用于较旧的 API 级别)。使用“可能的解决方案”的应用程序不能再通过 Play 商店分发,也不应该以任何其他方式分发。尽管如此,我认为仅出于教育和个人目的,如果它消除了问题中的错误,它才是一个有效的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多