我的應用程序針對紮根的Android設備,它具有root權限並且需要訪問目錄/dev/input
,但它爲什麼會拋出opendir failed, Permission denied
甚至/dev/input
已經是chmod
到777
?爲什麼我的Android應用程序(具有root權限)無法訪問/ dev/input?
我用下面的代碼來獲得root權限:
Process root = Runtime.getRuntime().exec("su");
並使用下面的代碼來改變/dev/input
權限:
Shell.runCommand("chmod 777 /dev/input");
兩個以上兩個步驟是成功的,但爲什麼我的應用程序仍然無法訪問它?從搜索中,有人說應用程序的運行時權限與文件系統中文件的權限無關。 Android運行時的權限系統是什麼?我如何讓應用程序能夠訪問/dev/input
?
增加:
我的測試環境是安卓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