我的应用程序旨在针对已root的Android设备,它具有root权限并需要访问目录/dev/input
,但为什么会抛出opendir failed, Permission denied
的异常,即使/dev/input
已经被chmod
改为777
?
我使用下面的代码获取root权限:
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;
}
来自 /proc/kmsg
的 SELinux 错误
<36>[19700411_05:32:43.957165]@0 type=1400 audit(8631163.939:1105): avc: denied { write } for pid=15706 comm="app_process64_o" name="system@framework@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="system@framework@boot.art" dev="mmcblk0p43" ino=442379 scontext=u:r:shell:s0 tcontext=u:object_r:dalvikcache_data_file:s0 tclass=file permissive=0
SELinux
阻止了我的访问,但我该如何修改呢?我知道Google Play中还有另一个应用程序需要访问/dev/input
,在我安装并运行它之后,我的应用程序就能够访问它了,这可能是什么主要技术? - Suge