Android: запись в каталог /sys/

Я разрабатываю приложение, которое не предназначено для выпуска в качестве стандартного приложения. Он будет работать на одном корневом устройстве.

Мне нужна возможность записи в файл в каталоге /sys/. Файл, о котором идет речь, принадлежит пользователю root и имеет права доступа -rw-rw-rw-.

Я знаю, что могут быть ограничения на виртуальную машину, в которой выполняется мой код, которые запрещают запись в эту область файловой системы, но я наблюдал, как это делает другое приложение.

Это возможно? Как это может быть достигнуто? Не имеет значения, нужно ли рутировать телефон (я использую dev).


Я рассмотрел простое использование FileWriter для записи в файл, что вызвало следующую ошибку на .flush():

java.io.IOException: Invalid argument
at org.apache.harmony.luni.platform.OSFileSystem.writeImpl(Native Method)

Я также пытался выполнить команду оболочки из Java как с «su», так и без нее. Который вернул «запрос отклонен» и «Отказано в доступе» соответственно.

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

Наконец, я попытался использовать NDK и JNI в случае, если C каким-то волшебным образом удалось записать в этот файл. При попытке fflush в этот файл я получаю EOF (что означает, что произошла ошибка).


Все предложения очень приветствуются!


person bdls    schedule 10.08.2010    source источник


Ответы (3)


Метод 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 доступен для записи для вашего приложения.

person zevoid    schedule 24.09.2010
comment
Этот ответ сэкономил мне массу времени, так как я столкнулся с аналогичной проблемой на плате атома варианта Debian с использованием JVM J9 от IBM, которая имеет общую родословную кода с Apache Harmony. Причина, по которой требуется PrintWriter, заключается в том, что echo добавляет новую строку в конце. Если бы вы выполнили команду cat › somesysfile, ввели допустимое значение и затем нажали Ctrl-D, вы бы увидели аналогичную ошибку (по крайней мере, я). Когда я делаю то же самое и нажимаю «Ввод» после действительного значения, затем Ctrl-D, файл sys правильно принимает значение. Примечание. Не все файлы sys, которые я пишу, требуют этой новой строки на плате, которую я использую, до сих пор не знаю, почему. - person James Branigan; 21.02.2011

я думаю, вам придется поделиться фактическим кодом и рассказать нам, что вы действительно пытаетесь сделать. «Недопустимый аргумент» соответствует сбою записи (2) с EINVAL, что происходит, когда вы пытаетесь записать что-то неподходящее. не вещь разрешений; тип. этот файл не обычный файл, не так ли?

person Elliott Hughes    schedule 24.08.2010
comment
Моя общая цель — записать в /sys/class/htc_accessory/fm/flag на устройстве HTC. Насколько я понимаю, это не обычный файл, как вы сказали. - person bdls; 26.08.2010
comment
правильно, поэтому вам нужно прочитать исходный код ядра, который реализует этот файл, чтобы узнать, как вы должны его использовать. - person Elliott Hughes; 28.08.2010

Вы должны изменить свой манифест, чтобы ваша программа запрашивала доступ пользователя root.

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

public static final String FACTORY_TEST Начиная с уровня API 1

Запустите тестовое приложение производителя, работающее от имени пользователя root. Доступно только тогда, когда устройство работает в тестовом режиме производителя. Постоянное значение: "android.permission.FACTORY_TEST"

person kurast    schedule 10.08.2010
comment
Доступно только тогда, когда устройство работает в тестовом режиме производителя. Вряд ли это ему поможет. - person Joshua; 10.08.2010