2016-01-25 72 views
2

我正在使用OkHttp(首先原始版本,然後我升級到OkHttp3),當應用程序未運行時,我的應用程序的某些用戶報告顯着的電池壽命損失。CPU使用率異常 - Okio看門狗

我跑了探查,這是結果:

profiler of App

正如你所看到的,奧基奧看門狗正在運行的全部時間。大致在中途點,我的應用程序完全在後臺。目前沒有HTTP任務發生。我在最後的HTTP任務結束後開始分析。

看門狗是否正常運行?如果是這樣,我是否認爲這個線程造成了很多電池浪費?如果這種情況不正常,像是泄露的上下文會讓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) { 
      } 
     } 
    } 
} 

回答

4

看起來像奧基奧嚴重&意想不到的錯誤。我會嘗試重現&修復程序。如果你能夠持續產生這個,請評論這個錯誤!

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

+0

您是否設法重現了這一切? – Knossos

+0

我還沒有調查,說實話。今天,希望。 –

2

對我來說,它是由proguard相關的優化造成的。 (?如果沒有最終修復)經過一番調查 - - 見上面鏈接的奧基奧問題的解決方法是禁用優化或添加到您的proguard-rules.pro:

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

我發現這個manual

一注

注:配置指定中沒有一個類的方法「...」有什麼副作用

您的配置包含一個選項-assumenosideeffects指示指定的方法沒有任何邊e ffects。但是,配置嘗試通過使用通配符(如「*;」)來匹配所有方法。這包括來自java.lang.Object的方法,比如wait()和notify()。刪除這些方法的調用很可能會破壞您的應用程序。你應該更保守地列出沒有副作用的方法。您可以通過指定-dontnote選項來關閉這些筆記。

您應該在-assumenosideeffects塊中指定方法名稱。

我在https://github.com/square/okio/issues/185#issuecomment-220520926上添加此評論