我正在使用OkHttp(首先是原版verison,然后我升级到OkHttp3),我的应用程序的一些用户在应用程序未运行时报告显着的电池寿命损失。
我运行了一个分析器,这就是结果:
如您所见,Okio Watchdog一直在运行。在大约中途,我的应用程序完全在后台。此时没有HTTP任务发生。我在最后一个HTTP任务结束后开始进行分析。
看门狗是否正常运行?如果是这样,我是否正确地假设这个线程导致大量电池浪费?如果它不正常,那么泄露的Context会不会让看门狗继续运行?
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) {
}
}
}
}
答案 0 :(得分:4)
看起来像一个严重的& Okio意外的错误。我会尝试复制&固定。如果您能够始终如一地制作此产品,请对此错误发表评论!
答案 1 :(得分:2)
对我而言,这是由proguard的优化引起的。经过一些调查 - 看到上面链接的okio问题 - 解决方法(如果不是最终修复?)是禁用优化或将其添加到proguard-rules.pro:
-optimizations !method/marking/static,!method/removal/parameter,!code/removal/advanced
答案 2 :(得分:1)
我在这个manual
中找到了一个注释注意:配置指定类'...'的所有方法都没有任何副作用
您的配置包含一个选项-assumenosideeffects,表示指定的方法没有任何副作用。但是,配置尝试使用类似“*;”的通配符匹配所有方法。这包括来自java.lang.Object的方法,例如wait()和notify()。删除这些方法的调用很可能会破坏您的应用程序。您应该更保守地列出没有副作用的方法。您可以通过指定-dontnote选项来关闭这些注释。
您应该在-assumenosideeffects块中指定方法名称。
我在https://github.com/square/okio/issues/185#issuecomment-220520926
添加此评论