为什么getRuntime()。exec(“/ system / bin / am”)总是返回“不允许操作”?

时间:2015-04-08 08:39:27

标签: java android linux shell permissions

我的针对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,这意味着 不允许操作

但是,我通过/system/bin/am switch-user 0检查了adb shell的权限,它显示如下:

shell@hammerhead:/system/bin $ ll am
ll am
-rwxr-xr-x root shell 210 2015-03-23 15:10 am

显然,权限表明任何用户都可以执行am

更奇怪的是:我可以从am成功拨打adb shell(在无根模式下)。

我还尝试在rooted模式下禁用SELinux。测试显示setenforce 0对Android 5.0没有影响,即在Android 5.0上强制执行SELinux。我可以毫无错误地致电setenforce 0,但sestatus仍会显示“SELinux已启用”。

根本原因是什么?

2 个答案:

答案 0 :(得分:1)

我在Android L模拟器上做了一些测试,如果你执行/system/bin/am,它会返回0;如果执行/system/bin/am switch-user 0,则返回1.

这意味着您执行具有执行am的权限,但无权在应用中执行命令am switch-user 0

答案 1 :(得分:1)

可能是SELinux问题,请尝试“setenforce 0”,但您需要root权限。 同时检查stderr可能有助于http://pastebin.com/BeRYG1Hi

但是,应用程序不能拥有root权限。它只能是一个系统应用程序,但与root不同。