2010-08-10 111 views
1

我正在开发一个不打算作为标准应用程序发布的应用程序。它将运行在一个单一的根设备上。Android:写入/ sys /目录

我需要能够写入/ 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(意思是发生了一个错误)。


所有建议非常欢迎!

回答

7

Runtime.getRuntime()。exec(String)方法将输入字符串简单地视为可执行文件的文件名。它不会接受你的回声命令。 您应该使用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

这个答案为我节省了大量的时间,因为我在使用IBM的J9 JVM(它与Apache Harmony共享一个通用的代码谱系)的Debian变体原子板上遇到类似的问题。要求PrintWriter的原因是因为echo在最后添加了换行符。如果你要cat> somesysfile,输入一个有效的值,然后点击Ctrl-D,你会看到一个类似的错误(至少我做过)。当我做同样的事情并在有效值后按回车,然后Ctrl-D,sys文件接受正确的值。注意:并非我写的所有sys文件都需要在我正在使用的主板上使用此换行符,但仍不确定原因。 – 2011-02-21 14:53:37

0

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

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

公共静态最终字符串FACTORY_TEST 自:API级别1

运行作为一个工厂测试程序,运行根用户。仅当设备在制造商测试模式下运行时才可用。 常数值:“android.permission.FACTORY_TEST”

+1

“仅当设备在制造商测试模式下运行时才可用。”这可能不会帮助他。 – Joshua 2010-08-10 17:47:09

1

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

+0

我的总体目标是在HTC设备上写入/ sys/class/htc_accessory/fm/flag。所以我的理解是,这不是一个普通的文件,正如你所说的。 – bdls 2010-08-26 15:22:09

+0

没错,所以你需要阅读实现该文件的内核源代码,以了解你应该如何使用它。 – 2010-08-28 18:01:12