写入Android平板电脑上的/ sys /文件夹

时间:2018-07-05 11:22:23

标签: android file-handling

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

该应用具有清单中的所有可能权限。

它正在未植根且无法植根的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应用程序,具有在Android 5.1设备上无法root的清单中的所有权限。

谢谢。

1 个答案:

答案 0 :(得分:0)

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类。