Мое приложение зависает после запроса суперпользователя - PullRequest
0 голосов
/ 24 сентября 2018

Я пишу приложение, которое включает в себя получение информации обо всех запущенных процессах (имя / имя пакета для начала).Я делаю это, вызывая «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".

Есть личто-то, что я пропустил, или что-то, что мне нужно исследовать, прежде чем я попытаюсь это исправить?Любая помощь приветствуется.

Заранее спасибо.

PS Приложение запускается на корневом устройстве под управлением Android 7.1.1

1 Ответ

0 голосов
/ 25 сентября 2018

Я нашел причину проблемы.Как оказалось, BufferedReader не был готов к чтению, поэтому он не получал никаких входных данных из входного потока.Я подтвердил это с помощью следующего кода:

        while(bufferedReader.ready())
        {
            String topInfo;
            while ((topInfo = bufferedReader.readLine()) != null)
            {
                Log.i(appInfo, topInfo);
            }
        }

Исправление этой проблемы заключается в ожидании готовности BufferedReader к чтению входного потока процесса.Это можно сделать, приостановив поток на некоторое время, или включив цикл, который будет проходить до тех пор, пока BufferedReader не будет готов к чтению.Я выбрал последнее, как показано ниже:

        do
        {
            //Wait
        } while(!bufferedReader.ready());

Это дало мне желаемые результаты - список процессов, запущенных на моем устройстве.

...