我想看看Kernel log,但是当setenforce 1之后,再输入dmesg,就出现:
klogctl:Operation not permitted
问题应该是出在su之后shell所处的域的权限。我查了一下su.te,有下面这样的语句:
domain_auto_trans(shell, su_exec, su)
unconfined_domain(su)
也就是说,在adbd的shell中键入su命令后,应该在su这个域中,而su这个域是不受限制的。这就和实际观察到的现象不一样了。继续观察发现:
su(4063, init_shell) -> /system/xbin/su(4057, init) -> /init(1, init)
su进程的进程号是4063,它的selinux域是init_shell,它的父进程是/system/xbin/su……
另外又有:
su(4053, su) -> /system/bin/sh(3286, shell) ->/sbin/adbd(1945, adbd) ->/init(1, init)
不知道Android下的su程序怎么编写的,搞出了两条线。以后有时间再好好查查。为了对比,我又查看了一下Linux的su:
bash(15592) ->su(15585) ->bash(15442) ->login(4139) -> init(1)
Linux只有一条进程继承线。SEAndroid的su.te显然没有适应Android的实际。
简单解决要看kernel log的问题,我在shell.te中加了:
unconfined_domain(init_shell)
然后就可以正常运行dmesg了。但是kernel log中并没有我期望的selinux信息,我还是不知道为什么setenforce之后会“死机”。我只是在logcat中看到了:
D/OpenGLRenderer(2556): GL error from OpenGLRenderer: 0x505
E/OpenGLRenderer(2556): Out of memory
看起来时显示相关的库出了问题。