1

我正在开发一个不打算作为标准应用程序发布的应用程序。它将在单个根设备上运行。

我需要能够写入 /sys/ 目录中的文件。有问题的文件由 root 拥有并具有 -rw-rw-rw- 权限。

我知道我的代码在其中运行的 VM 可能存在限制,禁止写入文件系统的这个区域,但我观察到另一个应用程序显然这样做了。

这可能吗?如何实现?手机是否需要植根并不重要(我正在使用的开发者是)。


我研究过简单地使用 FileWriter 写入文件,导致以下错误.flush()

java.io.IOException: Invalid argument
at org.apache.harmony.luni.platform.OSFileSystem.writeImpl(Native Method)

我也尝试过从 Java 执行一个 shell 命令,无论有没有“su”。分别返回“请求被拒绝”和“权限被拒绝”。

Process process = Runtime.getRuntime().exec("echo 'hello' > /sys/file");

最后,我尝试使用 NDK 和 JNI,以防 C 神奇地设法写入该文件。尝试访问fflush此文件时,我收到 EOF(表示发生错误)。


非常欢迎所有建议!

4

3 回答 3

7

Runtime.getRuntime().exec(String) 方法只是将输入字符串视为可执行文件的文件名。它不会接受您的 echo 命令。您应该改用 Runtime.getRuntime().exec(String[]),例如:

String[] cmd = { "/system/bin/sh", "-c", "echo xxx > /sys/somefile", };
Runtime.getRuntime().exec(cmd);

或者,要将某些内容写入 sys 文件,您应该使用 java.io.PrintWriter 类。请参阅http://www.netmite.com/android/mydroid/frameworks/base/core/java/android/os/Debug.java并搜索“startNativeTracing()”作为示例。

当然,只有当 sys 文件对您的应用程序是可写的时,上述所有方法才能起作用。

于 2010-09-24T10:38:58.623 回答
1

我认为您将不得不分享实际代码并告诉我们您真正想要做什么。“无效参数”对应于 write(2) 由于 EINVAL 失败,当您尝试写入不合适的内容时会发生这种情况。不是权限的事情;一种类型的东西。这个文件不是普通文件,是吗?

于 2010-08-24T05:57:38.390 回答
0

您必须修改清单,以便您的程序要求 root 用户访问权限。

http://developer.android.com/reference/android/Manifest.permission.html

public static final String FACTORY_TEST 自:API 级别 1

作为制造商测试应用程序运行,以 root 用户身份运行。仅当设备在制造商测试模式下运行时可用。常量值:“android.permission.FACTORY_TEST”

于 2010-08-10T17:44:08.897 回答