【发布时间】:2015-06-13 03:02:00
【问题描述】:
我的面向 Android 5.0 的 Android 应用包含如下代码:
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("/system/bin/am switch-user 0");
proc.waitFor();
proc.destroy();
}
catch (Exception e)
{}
上面最简单的代码总是返回proc.exitValue中的1个,这意味着不允许操作。
但是,我通过adb shell查看了/system/bin/am switch-user 0的权限,显示如下:
shell@hammerhead:/system/bin $ ll am
ll am
-rwxr-xr-x root shell 210 2015-03-23 15:10 am
显然,权限表明任何用户都可以执行am。
更奇怪的是:我可以成功从adb shell调用am(在无根模式下)。
我还尝试在 root 模式下禁用 SELinux。测试表明setenforce 0对Android 5.0没有影响,也就是说,SELinux是在Android 5.0上强制执行的。我可以毫无错误地调用setenforce 0,但sestatus 仍然显示“SELinux 已启用”。
根本原因是什么?
【问题讨论】:
-
你知道调用
Runtime.exec()(或者最好使用ProcessBuilder)的正确方法吗? -
@Kayaman,ProcessBuilder 返回相同的错误结果。为了简单起见,我没有提供 ProcessBuilder 版本。
-
可能是 SELinux 问题,尝试“setenforce 0”,但您需要 root 权限
-
根本原因是什么?显然root是根本原因... user id 0 == root
标签: java android linux shell permissions