【问题标题】:How to execute linux command in android programmatically?如何以编程方式在android中执行linux命令?
【发布时间】:2012-09-06 12:40:18
【问题描述】:

就像在 android 中(通过 android sdk/tools 文件夹)一样,我们可以从命令行执行 linux shell 命令来访问 mnt 文件夹/data 文件夹。 (例如 cd data ls)现在我想在 android 中以编程方式执行该命令,那怎么可能呢?


我正在使用以下代码执行 shell 命令
Process p = Runtime.getRuntime().exec("cd data");

但它给了我例外

java.io.IOException: Error running exec(). Command: [cd, data] Working 
Directory:  null Environment: null


那么我应该如何进行呢。在此先感谢。

【问题讨论】:

标签: android shell android-ndk linux-kernel


【解决方案1】:

cd 不是 Linux 命令,它是内置于 shell 中的命令;它会在该 shell 进程的上下文中更改当前工作目录。在你的情况下,如果命令成功,它只会对子进程成功(很快就会终止),并且对你自己的进程没有影响。

【讨论】:

  • 我没有你想表达的意思
  • 我的意思是执行“cd”命令不会对您产生任何影响。原因是 Runtime()...exec() 会创建一个子进程;即使你可以让“cd”在其中工作,它也不会影响你的 Android 进程,因此它对你的 Android 应用程序毫无用处。
  • 好的,我现在知道了,但您能帮我解决我的问题吗?
  • 我做了一点谷歌搜索,看看是否有 Java chdir() 类型的函数,但我没有发现太多用处。一种可能性(丑陋的一种,比它的价值要困难得多)是创建一个调用 C chdir() 函数的本机函数。虽然只是将完整路径附加到您引用的文件名中,但您可能会好得多——那么您当前的目录是什么就无关紧要了。
  • 好的,这是我的完整路径(data/data/androidCode) 那么我应该如何插入我的代码以从该文件夹中检索文件?
【解决方案2】:

试试这个:

Process p = Runtime.getRuntime().exec("cd /data");

【讨论】:

  • 如果命令几乎是除了“cd”之外的任何东西,那么你的答案会很好。然而,特别是对于 cd,它根本无法按预期工作(即使有外部 cd 二进制文件——尽管没有)。
  • Aditya,您告诉他唯一要做的就是更改他更改的目录——但这并没有解决从子进程中更改目录对父母;因此,在这种情况下,您的回答实际上并不能帮助他。
【解决方案3】:

要检索应用程序私有数据文件夹的路径,请使用 Java 中的以下命令:

File MyData = Ctxt.getDir("Foo");

其中 Ctxt 是一个 Context 对象,如 Activity。它会返回一个类似/data/data/com.activity.networkRequestDetector/app_Foo 的路径。请注意,在 Android 中不鼓励读/写 /data/data/com.activity.networkRequestDetector/ - 它是您应用程序的沙箱的根,不能用来玩。

要从数据文件夹中打开文件,请使用以下内容:

FileInputStream Stm = new FileInputStream(new File(MyData, "Filename.txt"));

通常,您的应用程序也可以执行任何 shell 命令。 Shell 命令只是像其他人一样使用 API 的程序。

【讨论】:

  • 是的,我知道,但是当我想从我的应用程序中获取另一个应用程序数据时,它将无法工作
  • 在非根设备上它无论如何都不会工作。其他应用程序的数据受到操作系统级权限的保护。在有根设备上,只需围绕绝对路径构造一个 File 对象。说真的,你不需要 shell 命令。
【解决方案4】:

在 Android 上,您的进程无权读取其他应用的 /data/data/_other-package-name_ 中的文件,或列出其在目录 /data/data/_other-package-name_/files 中的私有文件。但它确实有权列出和读取 lib 目录 /data/data/_other-package-name_/lib 中的文件,如果 other-package 将此文件作为公共文件打开,您可以查看 /data/data/_other-package-name_/files 中的特定文件。

即如果 other-package 符合以下条件:

FileOutputStream fos = openFileOutput("public_file", Context.MODE_WORLD_READABLE);
fos.write("hello world".getBytes());
fos.close();

那么你的包可以像这样读取这个文件:

byte[] bytes = new byte[100];
FileInputStream fis = new FileInputStream(new File("/data/data/*other-package*/files/public_file"));
int cnt = fis.read(bytes);
fis.close();
Log.d("Two_Libs", new String(bytes, 0, cnt));

但您无法列出该目录中的公共文件以发现它们。

【讨论】:

    【解决方案5】:

    如下使用:-

     Process process = Runtime.getRuntime().exec("command to be executed");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    

    【讨论】:

      猜你喜欢
      • 2013-08-14
      • 2013-01-26
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2016-10-28
      • 2020-10-21
      • 2021-05-08
      • 1970-01-01
      相关资源
      最近更新 更多