【发布时间】:2016-06-30 13:28:45
【问题描述】:
我的应用针对有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;
}
来自/prog/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 而不是 unix 风格的权限问题。
-
检查
dmesg(或cat /proc/kmsg)的输出是否有selinux错误信息。此外,运行“su”不会改变当前进程的权限,所以从你的问题中你是否真的以 root 身份运行并不完全清楚。 -
@ChrisStratton,感谢您的指出!但是我可以为我的应用修改 SELinux 策略吗?从搜索来看,我不能,因为 SELinux 策略被烧录到操作系统映像中。但是有一个奇怪的现象是,当我从 Google Play 安装并运行另一个访问 /dev/input 的应用程序后,我的应用程序就可以访问 /dev/input。我不知道那个应用做了什么。
-
@fadden,感谢您的回答。我已将主要代码和错误消息添加到帖子内容中。看起来是
SELinux阻止了我的访问,但我该如何修改呢?我知道Google Play中有另一个应用程序需要访问/dev/input,安装并运行后,我的应用程序可以访问它,可能是主要技术是什么?
标签: android linux android-ndk root selinux