Мое приложение предназначено для корневых устройств Android, оно имеет корневую привилегию и нуждается в доступе к каталогу /dev/input
, но почему он кидает opendir failed, Permission denied
даже /dev/input
уже был chmod
- 777
?Почему мой Android-приложение (имеет привилегии root) не имеет доступа/dev/input?
Я использую следующий код, чтобы получить корневую привилегию:
Process root = Runtime.getRuntime().exec("su");
И использовать этот код, чтобы изменить разрешения /dev/input
:
Shell.runCommand("chmod 777 /dev/input");
Оба эти два шага выше успешен, но почему он не может быть доступен моему приложению? Из поиска кто-то говорит, что разрешения времени выполнения приложения не имеют никакого отношения к разрешениям файла в файловой системе. Какая система разрешений для Android работает? Как я могу заставить приложение иметь доступ к /dev/input
?
Дополнение
Моя тестовая среда Android 5.1.1, основная часть кода:
jint Java_com_foo_funnyapp_Native_scanInputDevicesJNI(JNIEnv* env, jclass clazz)
{
const char *dirname = "/dev/input";
DIR *dir;
dir = opendir(dirname); // opendir failed, Permission denied
if(dir == NULL)
return -1;
......
return 0;
}
SELinux ошибка из /prog/kmsg
<36>[19700411_05:32:43.957165]@0 type=1400 audit(8631163.939:1105): avc: denied { write } for pid=15706 comm="app_process64_o" name="[email protected]@boot.art" dev="mmcblk0p43" ino=442379 scontext=u:r:shell:s0 tcontext=u:object_r:dalvikcache_data_file:s0 tclass=file permissive=0
<11>[19700411_05:32:44.118202]@0 init: untracked pid 15674 exited with status 0
<11>[19700411_05:32:44.202288]@0 init: untracked pid 15704 exited with status 224
<36>[19700411_05:32:44.225334]@0 type=1400 audit(8631164.209:1106): avc: denied { read } for pid=15734 comm="Thread-111" name="input" dev="tmpfs" ino=12525 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:input_device:s0 tclass=dir permissive=0
<36>[19700411_05:32:44.332135]@0 type=1400 audit(8631164.319:1107): avc: denied { write } for pid=15742 comm="app_process64_o" name="[email protected]@boot.art" dev="mmcblk0p43" ino=442379 scontext=u:r:shell:s0 tcontext=u:object_r:dalvikcache_data_file:s0 tclass=file permissive=0
Что бы вы ни пытались сделать, это, вероятно, плохая идея. Вы можете столкнуться с проблемами selinux, а не с разрешениями в стиле unix. –
Проверьте выходные данные 'dmesg' (или' cat/proc/kmsg') для сообщений об ошибках selinux. Кроме того, запуск «su» не изменяет разрешения текущего процесса, поэтому из вашего вопроса не совсем ясно, действительно ли вы выполняете роль root. – fadden
@ChrisStratton, Спасибо за указание! Но могу ли я изменить политику SELinux для своего приложения? Из поиска, похоже, я не могу, потому что политика SELinux записывается в образ ОС. Но есть странное явление: после того, как я установил и запустил другое приложение из Google Play, которое обращается к/dev/input, как я знал, мое приложение стало доступным/dev/input. Я не знаю, что сделало это приложение. – Suge