Запись в папку / sys / на планшете Android - PullRequest
0 голосов
/ 05 июля 2018

У меня есть приложение Android с системными разрешениями (оно устанавливается в папке 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. Запись в файл командой оболочки

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

Не работает, но не выдает никаких ошибок. (Я наблюдаю за logcat через Android Studio).

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, которые нельзя рутировать.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 июля 2018

Метод 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.

...