【问题标题】:Writing to the /sys/ folder on Android tablet写入 Android 平板电脑上的 /sys/ 文件夹
【发布时间】:2018-12-13 20:45:43
【问题描述】:

我有一个具有系统权限的 Android 应用程序(它作为自定义 ROM 的一部分安装在 priv-apps 文件夹中)。

应用在清单中拥有所有可能的权限。

它在没有 root 且无法 root 的 Android 5.1 平板电脑上运行。

我需要在 /sys/ 目录下创建一个文件,但是我尝试过的各种事情都没有运气。

这些包括:

1.确保文件夹可写

    File dir = new File ("//sys/class/power_supply/battery");
    dir.setWritable(true);

不会出错,但 dir.canWrite() 返回 false。

2。以编程方式调用 chmod

    public int chmod(File path, int mode) throws Exception {

    Log.e("DisableCharging.chmod",  "Starting");

    try {

        Class fileUtils = Class.forName("android.os.FileUtils");
        Method setPermissions =
                fileUtils.getMethod("setPermissions", String.class, int.class, int.class, int.class);
        return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1);
    } catch (Exception e) {
        Log.e("DisableCharging.chmod",  "Error: " + e.toString());
        return  -1;
    }

调用 chmod(dir, 0777);结果:

W/FileUtils: Failed to chmod(/sys/class/power_supply/battery): android.system.ErrnoException: chmod failed: EACCES (Permission denied)

3.通过 shell 命令写入文件

    String[] cmd = { "/system/bin/sh", "-c", "echo 0 > /sys/class/power_supply/battery/charging_enabled"};
    Runtime.getRuntime().exec(cmd);

不起作用,但不会引发任何错误。 (我正在通过 Android Studio 监控 logcat)。

4.通过 OutputStream 写入文件

File dir = new File ("//sys/class/power_supply/battery");
File file = new File(dir, "charging_enabled");
FileOutputStream stream = new FileOutputStream(file);
stream.write("0".getBytes());
stream.close();

创建输出流时抛出以下错误(第 3 行)

java.io.FileNotFoundException: /sys/class/power_supply/battery/charging_enabled: open failed: ENOENT (No such file or directory)

5.使用 PrintWriter 写入文件

PrintWriter writer=null;
FileOutputStream os = new FileOutputStream (new File(f));  // 2nd line
writer=new PrintWriter(os);
writer.print(s);
writer.flush();
writer.close();

与 4 中的错误相同。(显然)因为它无法打开 OutputStream。

java.io.FileNotFoundException: /sys/class/power_supply/battery/charging_enabled: open failed: ENOENT (No such file or directory)

问题

  1. 有没有办法在/sys/文件夹下创建文件并写入?

  2. 如果是文件夹权限问题,我该如何授予这些权限?

重新迭代:这是一个 SYSTEM 应用,在无法 root 的 Android 5.1 设备上具有清单中的所有权限。

提前致谢。

【问题讨论】:

    标签: android file-handling


    【解决方案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 类。

    【讨论】:

    • 感谢您的回复,不过,这两种方法我都试过了(请参阅原帖中的代码示例)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多