2

我正在使用 OkHttp(首先是原始版本,然后我升级到 OkHttp3),我的应用程序的一些用户在应用程序未运行时报告了显着的电池寿命损失。

我运行了一个分析器,结果如下:

应用分析器

如您所见,Okio Watchdog 一直在运行。在大约一半的时候,我的应用程序完全在后台。此时没有发生 HTTP 任务。我在最后一个 HTTP 任务结束后开始分析。

看门狗这样跑是正常的吗?如果是这样,我是否正确地假设这个线程导致了大量的电池浪费?如果它不正常,像泄露的上下文这样的东西可以让看门狗继续运行吗?

看门狗代码在这里运行,似乎在没有终止条件的情况下运行:

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) {
            }
        }
    }
}
4

3 回答 3

4

看起来像是 Okio 中一个严重且意外的错误。我会尝试重现和修复。如果您能够始终如一地产生这个,请评论这个错误!

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

于 2016-01-26T14:05:36.770 回答
2

对我来说,这是由 proguard 的优化引起的。经过一番调查 - 请参阅上面链接的 okio 问题 - 一种解决方法(如果不是最终修复?)是禁用优化或将其添加到您的 proguard-rules.pro:

-optimizations !method/marking/static,!method/removal/parameter,!code/removal/advanced
于 2016-04-01T14:33:36.937 回答
1

我在本手册中找到了一个注释

注意:配置指定类 '...' 的所有方法都没有任何副作用

您的配置包含一个选项 -assumenosideeffects 以指示指定的方法没有任何副作用。但是,配置尝试通过使用通配符“*;”来匹配所有方法。这包括来自 java.lang.Object 的方法,例如 wait() 和 notify()。删除这些方法的调用很可能会破坏您的应用程序。您应该更保守地列出没有副作用的方法。您可以通过指定 -dontnote 选项来关闭这些注释。

您应该在 -assumenosideeffects 块中指定方法名称。

我在https://github.com/square/okio/issues/185#issuecomment-220520926添加此评论

于 2016-05-20T05:50:22.027 回答