我正在编写一个应用程序,其中涉及获取所有正在运行的进程的信息(以名称/程序包名称开头)。我通过在代码中调用“ ps”来做到这一点。在调用“ ps”命令之前,我从应用程序内部请求了超级用户访问权限。但是,当我尝试读取输入流时,应用程序冻结,并且Logcat中没有任何输出。下面是我正在使用的代码:
Process process = Runtime.getRuntime().exec("su");
DataOutputStream outputStream = new DataOutputStream(process.getOutputStream());
outputStream.writeBytes("ps -t -x -P -p -c");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String topInfo = bufferedReader.readLine(); //Where it freezes
while(topInfo != null)
{
Log.i(appInfo, topInfo);
topInfo = bufferedReader.readLine();
}
outputStream.flush();
outputStream.close();
代码在没有超级用户请求的情况下按预期工作,但是结果仅由我的应用程序和“ ps”进程组成。
在尝试解决此问题之前,有什么我想念的东西还是需要研究的吗?我曾尝试在Internet上搜索此问题,然后再问这里,但没有成功。任何帮助表示赞赏。
谢谢。
P.S该应用程序正在运行Android 7.1.1的有根设备上运行
答案 0 :(得分:0)
我已找到问题的原因。事实证明,BufferedReader尚未准备好读取,因此它没有从输入流中获取任何输入。我通过以下代码确认了这一点:
while(bufferedReader.ready())
{
String topInfo;
while ((topInfo = bufferedReader.readLine()) != null)
{
Log.i(appInfo, topInfo);
}
}
解决此问题的方法是等待BufferedReader准备读取进程输入流。这可以通过暂停线程一段时间来完成,也可以包括一个循环,直到BufferedReader准备读取为止。我选择了后者,如下所示:
do
{
//Wait
} while(!bufferedReader.ready());
这给了我想要的结果,这是设备上正在运行的进程的列表。