Ненормальная загрузка ЦП - Okio Watchdog

Я использую OkHttp (сначала исходную версию, затем я обновил ее до OkHttp3), некоторые пользователи моего приложения сообщают о значительном снижении времени автономной работы, когда приложение не работает.

Запустил профайлер и вот результат:

профилировщик приложения

Как видите, Okio Watchdog работает все время. Примерно на полпути мое приложение полностью находится в фоновом режиме. В данный момент нет задач HTTP. Я начал профилировать после завершения последней HTTP-задачи.

Это нормально, что Сторожевой Пёс так бегает по всему миру? Если да, то прав ли я, предполагая, что эта тема приводит к большому расходу батареи? Если это не нормально, может ли что-то вроде утечки контекста поддерживать работу Watchdog?

сторожевой код выполняется здесь кажется, что он работает без условия завершения:

private static final class Watchdog extends Thread {
    public Watchdog() {
        super("Okio Watchdog");
        setDaemon(true);
    }

    public void run() {
        while (true) {
            try {
                AsyncTimeout timedOut = awaitTimeout();

                // Didn't find a node to interrupt. Try again.
                if (timedOut == null) continue;

                // Close the timed out node.
                timedOut.timedOut();
            } catch (InterruptedException ignored) {
            }
        }
    }
}

person Knossos    schedule 25.01.2016    source источник


Ответы (3)


Похоже на серьезную и неожиданную ошибку в Okio. Попробую воспроизвести и исправить. Если вы можете производить это последовательно, пожалуйста, прокомментируйте эту ошибку!

https://github.com/square/okio/issues/185

person Jesse Wilson    schedule 26.01.2016
comment
Я еще не исследовал, если честно. Сегодня, надеюсь. - person Jesse Wilson; 30.01.2016

Для меня это было вызвано оптимизацией proguard. После некоторого расследования — см. проблему okio, указанную выше — обходной путь (если не окончательное исправление?) — отключить оптимизацию или добавить это в свой proguard-rules.pro:

-optimizations !method/marking/static,!method/removal/parameter,!code/removal/advanced
person NeilS    schedule 01.04.2016

Я нашел ПРИМЕЧАНИЕ в этом руководстве.

Примечание: в конфигурации указано, что ни один из методов класса '...' не имеет побочных эффектов

Ваша конфигурация содержит параметр -assumenosideeffects, указывающий, что указанные методы не имеют побочных эффектов. Однако конфигурация пытается сопоставить все методы, используя подстановочный знак, например *;. Сюда входят методы из java.lang.Object, такие как wait() и notify(). Удаление вызовов этих методов, скорее всего, сломает ваше приложение. Перечислять методы без побочных эффектов следует более консервативно. Вы можете отключить эти заметки, указав опцию -dontnote.

Вы должны указать имя метода в блоке -assumenosideeffects.

Я добавляю этот комментарий на https://github.com/square/okio/issues/185#issuecomment-220520926

person Bill Lv    schedule 20.05.2016