我正在开发一个不打算作为标准应用程序发布的应用程序。它将在单个root设备上运行。
我需要能够写入/ sys /目录中的文件。有问题的文件由root拥有,并具有-rw-rw-rw-permissions。
我知道我的代码运行的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");
最后我尝试在案例C中使用NDK和JNI,这有点神奇地管理到这个文件。尝试fflush
到此文件时,我收到一个EOF(意味着发生了错误)。
非常欢迎所有建议!
答案 0 :(得分: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文件可以为您的应用程序写入时才能工作。
答案 1 :(得分:1)
我认为你将不得不分享实际的代码并告诉我们你真正想做的事情。 “无效参数”对应于写入(2)EINVAL失败,当您尝试写入不适合的内容时会发生这种情况。不是权限的东西;一个类型的东西。这个文件不是常规文件,是吗?
答案 2 :(得分:0)
您必须修改清单,以便程序要求root用户访问。
http://developer.android.com/reference/android/Manifest.permission.html
public static final String FACTORY_TEST 自:API Level 1
作为制造商测试应用程序运行,以root用户身份运行。仅在设备以制造商测试模式运行时可用。 常量值:“android.permission.FACTORY_TEST”