【问题标题】:Abnormal CPU usage - Okio WatchdogCPU 使用率异常 - Okio 看门狗
【发布时间】:2016-05-02 01:22:27
【问题描述】:

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

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

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

看门狗这样跑是正常的吗?如果是这样,我是否正确地假设这个线程导致了大量的电池浪费?如果不正常,泄露的 Context 之类的东西能否让 Watchdog 继续运行?

Watchdog code 在这里运行,好像没有终止条件运行:

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

【问题讨论】:

    标签: android okhttp okhttp3 okio


    【解决方案1】:

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

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

    【讨论】:

    • 老实说,我还没有调查过。今天,希望。
    【解决方案2】:

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

    -optimizations !method/marking/static,!method/removal/parameter,!code/removal/advanced
    

    【讨论】:

      【解决方案3】:

      我在这个manual 中找到了一个注释

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多