我正在开发一个不打算作为标准应用程序发布的应用程序。它将在单根设备上运行。
我需要能够写入/sys/目录中的文件。有问题的文件归 root 所有,并具有 -rw-rw-rw- 权限。
我知道我的代码在其中运行的 VM 可能存在限制,禁止写入文件系统的这个区域,但我观察到另一个应用程序显然这样做。
这可能吗?如何实现?手机是否需要 root 并不重要(我正在使用的开发者是)。
我研究过简单地使用 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(意味着发生了错误)。
非常欢迎所有建议!
最佳答案
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 文件对您的应用程序来说是可写的时,以上所有方法才有效。
关于Android:写入/sys/目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451502/