【问题标题】:Android: Write to /sys/ directoryAndroid:写入 /sys/ 目录
【发布时间】:2010-08-10 17:06:02
【问题描述】:

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

我需要能够写入 /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”。分别返回“request denied”和“Permission Denied”。

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

最后,我尝试使用 NDK 和 JNI,以防 C 神奇地设法写入该文件。当尝试 fflush 到这个文件时,我收到一个 EOF(意味着发生了错误)。


非常欢迎所有建议!

【问题讨论】:

    标签: android permissions filesystems android-ndk sys


    【解决方案1】:

    方法 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 文件对您的应用程序是可写的时,以上所有方法才能起作用。

    【讨论】:

    • 这个答案为我节省了大量时间,因为我在使用 IBM 的 J9 JVM 的 Debian 变体 atom 板上遇到了类似的问题,它与 Apache Harmony 共享共同的代码沿袭。需要 PrintWriter 的原因是因为 echo 在末尾添加了换行符。如果你要 cat > somesysfile,输入一个有效值,然后按 Ctrl-D,你会看到类似的错误(至少我看到过)。当我做同样的事情并在有效值之后按回车键,然后按 Ctrl-D,sys 文件会正确接受该值。注意:并非我编写的所有 sys 文件都需要在我正在使用的板上使用这个换行符,仍然不知道为什么。
    【解决方案2】:

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

    【讨论】:

    • 我的总体目标是写入 HTC 设备上的 /sys/class/htc_accessory/fm/flag。所以我的理解是它不是一个常规文件,正如你所说的。
    • 正确,因此您需要阅读实现该文件的内核源代码以了解您应该如何使用它。
    【解决方案3】:

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

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

    public static final String FACTORY_TEST 自:API 级别 1

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

    【讨论】:

    • “仅当设备在制造商测试模式下运行时可用。”这可能对他没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2013-03-19
    • 2011-03-12
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多