Тяжелый анализ ЦП во время работы службы переднего плана - PullRequest
1 голос
/ 18 февраля 2020

Итак, у меня есть Service, который важен для логики приложений c и, следовательно, должен быть живым все время. Первое, во-первых, я создал его как foreground service.

Когда пользователь начинает работать, Service начинает делать много тяжелых вещей. Он использует FusedLocationAPI датчики различного типа и выполняет много разных вычислений. В этот момент телефон начинает нагреваться (загрузка процессора высокая). Когда работа останавливается, нагрев останавливается и процессор падает ниже.

Это заставляет меня думать, что основная проблема заключается в том, что всякий раз, когда используются эти датчики и производятся вычисления, но есть много возможностей, которые могут вызвать это, и я хотел понять, как я могу глубоко проанализировать использование жидкого теста в этом дело? Я прочитал, что Battery Historian должно быть способом go, но информация там сложная и не дает мне много информации. Как я могу использовать эти данные, чтобы понять, какая часть класса / runnable / code отвечает за использование процессора? Может быть, есть лучшие способы решить эту проблему? Заранее спасибо.

Подробный анализ того, что происходит с использованием CPU Profiler (после предложения).


enter image description here

  1. Образ. Приложение открыто, и несколько разных экранов переключаются между ними. Ничего особенного. Телефон не нагревается и из анализа процессора все также выглядит довольно хорошо.

enter image description here

2. Пользователь начинает работать и вводить тяжелое состояние. Желтый (светло-зеленый) прямоугольник показывает ранее упомянутый «важный сервис», который вносит важную роль в приложение. Вызываемые функции не используют слишком много времени процессора, учитывая% от всего рабочего цикла - что заставляет меня задуматься, я должен искать в другом месте ..


enter image description here

  1. То, что я видел, это то, что процессор сильно увеличивается, когда я блокирую телефон (во время работы службы. Из анализа процессора Bottom Up я не могу понять, что является причиной проблемы (оранжевый прямоугольник) - выглядит как * * * * * * * * * *

    Из профилировщика процессора я понимаю, что у меня есть серьезная проблема, связанная с использованием процессора, но сейчас я не понимаю что его вызывает (какой кусок кода / класса / функции). Я знаю, что всякий раз, когда создается моя важная служба (при запуске приложения), я использую PARTIAL_WAKE_LOCK, чтобы не дать процессору go спать, а также сделать службу чтобы быть живым все время. Как я понимаю, мне нужно найти другое решение для этого, потому что процессор разряжает слишком много батареи.

    Как я мог найти это, используя только профилировщик ? Я теперь этот факт только для кода и стека профилировщика не говорит мне много об этом (может быть, я не смотрю в нужном месте?)

1 Ответ

0 голосов
/ 19 февраля 2020

Я выяснил причину root высокой загрузки ЦП. Я провел подробное исследование потоков и выяснил, что потоки DefaultDispatcher используют МНОГО ЦП.

Оказалось, что это была ошибка в библиотеке Kotlin -Coroutines, и последняя версия содержит исправления. Когда я проводил тесты, я использовал версию 1.3.1, но изменение номера версии на 1.3.3 дало мне значительные улучшения: от 40% до 10% использования процессора.

enter image description here

...