我的应用程序在超级用户请求后冻结
My application freezes after a superuser request
我正在编写一个应用程序,它涉及获取所有 运行ning 进程的信息(name/package 名称开头)。我通过在我的代码中调用 "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 应用程序正在 运行 root 设备 运行ning Android 7.1.1
我找到问题的原因了。事实证明,BufferedReader 还没有准备好读取,因此它没有从输入流中获取任何输入。我用以下代码确认了这一点:
while(bufferedReader.ready())
{
String topInfo;
while ((topInfo = bufferedReader.readLine()) != null)
{
Log.i(appInfo, topInfo);
}
}
此问题的解决方法是等待 BufferedReader 准备好读取进程输入流。这可以通过暂停线程一段时间来完成,或者包括一个循环,直到 BufferedReader 准备好读取为止。我选择了后者,如下图:
do
{
//Wait
} while(!bufferedReader.ready());
这给了我想要的结果,这是我设备上的进程列表 运行。
我正在编写一个应用程序,它涉及获取所有 运行ning 进程的信息(name/package 名称开头)。我通过在我的代码中调用 "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 应用程序正在 运行 root 设备 运行ning Android 7.1.1
我找到问题的原因了。事实证明,BufferedReader 还没有准备好读取,因此它没有从输入流中获取任何输入。我用以下代码确认了这一点:
while(bufferedReader.ready())
{
String topInfo;
while ((topInfo = bufferedReader.readLine()) != null)
{
Log.i(appInfo, topInfo);
}
}
此问题的解决方法是等待 BufferedReader 准备好读取进程输入流。这可以通过暂停线程一段时间来完成,或者包括一个循环,直到 BufferedReader 准备好读取为止。我选择了后者,如下图:
do
{
//Wait
} while(!bufferedReader.ready());
这给了我想要的结果,这是我设备上的进程列表 运行。