应用启动时请求 root shell
Posted
技术标签:
【中文标题】应用启动时请求 root shell【英文标题】:Request a root shell when app starts 【发布时间】:2013-05-12 10:56:46 【问题描述】:我想为 root 手机编写一个 android 应用程序,其行为方式如下:
我想拥有一个可以向其发出命令的 root shell。所以我想要我的应用程序在启动时请求一个 root shell,然后: 1)如果它获得了外壳(用户授予超级用户权限)应用程序应该继续 2)如果它没有获得它(用户拒绝权限或超级用户请求弹出超时)应用程序应立即终止
现在,在这里阅读另一个问题,我发现您可以使用以下命令请求 root shell:
Process p = Runtime.getRuntime().exec("su");
但是,无论您是否获得许可,这都会立即返回。您可以发出:
p.waitFor();
但是如果用户确实授予了权限,这将永远不会返回,只有在权限被拒绝时才会返回。
我想要一种可靠的方法来获取 su shell 并保留它,并知道我是否真的获得了许可。有什么想法吗?
【问题讨论】:
你的进程 p 是你的 root shell,所以它实际上是一件好事,它不会立即结束。 是的,但这就是我的观点:我如何等待用户授予或拒绝 root 访问权限并可靠地检查我是否真的获得了 root 访问权限?当我上面发布的第一条指令执行时,无论我是否获得许可,程序都会立即继续执行,甚至不等待权限请求弹出消失。 【参考方案1】:您可以拨打exitValue()
。
如果进程仍在运行,它将抛出异常,如果权限被拒绝(因为命令将失败),可能会抛出 1(至少不是 0)。
int result = 0;
try
result = p.exitValue();
catch (IllegalThreadStateException e)
e.printStackTrace();
if (result == 0)
// Your process p is root and running
else
// su failed
您可能必须等待权限请求弹出窗口首先消失。在这种情况下,可能需要尝试输入/输出流的可用性。
【讨论】:
谢谢,但是我知道使用这个解决方案我必须“手动”等待足够的时间让请求弹出超时,以确保我真的获得了许可,即使已获得许可马上……对吗?有没有办法只等待正确的时间(即:直到任一权限被拒绝/授予或弹出超时)? 我不知道(因为我没有测试过授权部分)。我想你总是可以假设它有效,将你的命令发送到你的 root shell,然后让另一个线程等待 su 命令的结果。以上是关于应用启动时请求 root shell的主要内容,如果未能解决你的问题,请参考以下文章