Android M 的 Doze 模式下第三方推送服務還能用嗎?

官方對Doze模式的說法有一條是:

  • Network access is disabled, unless your app receives a high priority Google Cloud Messaging tickle.

但是在國內的話應該沒多少人用 Google Cloud Messaging 吧?那第三方 APP 的推送功能是不是就都不能用了?


我認為,在原生Android(AOSP)上,第三方推送確實將被廢掉。但鑒於國情,接下來在國內很難說,如果各個手機廠商借M的Doze Mode強推自己的push解決方案(比如MiPush),那就真的萬劫不復了……(見我在5.29發的推:http://weibo.com/1649495037/Ck5yJk9im)

Google看起來確實是借Doze Mode在強推GCM,如果不考慮中國國情,這是對用戶非常有利的一項措施。GCM經過這些年的打磨,已經足以勝任絕大部分的推送需求,包括IM。

回到Doze Mode,簡單看了一下源碼。它的工作條件比較苛刻,首先有一個小時的等待期 —— 屏幕關閉後半小時開始進行『大幅度運動監測』,接下來半小時內無大幅度運動才會進入Doze Mode。基本上如果手機放在兜里,就沒機會進入Doze Mode了…… 最佳的場景應該是夜裡,以及平時靜止放在桌上。但一小時的等待期實在太長,如果平時IM消息稍微多點的,只要拿起來看一下手機,哪怕就幾秒鐘,就要再等個一小時了才能回到Doze Mode了。

在Doze Mode下,網路訪問被屏蔽,維持喚醒(Wake Lock)被忽略,定時任務(Alarm)被推遲(以指數遞增的後延),但不會殺進程。也就是說後台進程就啥都別想幹了,乖乖躺著吧,push通道不可避免的會斷掉。這次Google動真格的一點是,對所有應用,無視『目標版本(Target SDK Version)』全部生效,除了用戶在設置中主動赦免的app以及Google自家的Play services和Play Store。(Google很賤的不讓你剝奪這倆的赦免)

更新:所謂道高一尺魔高一丈,已經看到有可以繞開Doze Mode限制的.so層解決方案了。所以,這件事兒最後搞不好就演化成Doze Mode被一眾國內的私有push給廢了……

更新(2015.10.6):今天Android 6.0源碼正式推送到了AOSP。從源碼中可以發現,Google在最後關頭(6.0代碼分支凍結前10天)為開發者提供了一個例外方案:應用可以聲明 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 許可權,並主動要求用戶將其加入至白名單中,從而不受 Doze Mode 和 App Standby 的影響。估計大部分集成了第三方推送機制的App都會採用這個官方支持的例外方案。不過千萬別天真的以為你不同意白名單請求就行了,某些應用也許會『執著』的堅持這一要求,不達目的誓不罷休……


進入Doze後的確收不到這些第三方推送了,但有點懷疑Google目前只是簡單的關閉了網路。。。
因為你看下面這張圖,這些推送服務還是一直在後台運行的。至於是否會降低他們的喚醒頻率還有待觀察。

昨晚有空,所以刷Android M嘗試了一下,編譯了幾個比較流行的推送Demo,經過測試發現,關閉屏幕待機20分鐘還是能接到推送的消息。因為不知道Google所說的檢測到設備在不使用狀態會進入Doze到底是怎樣的,所以我乾脆直接等到早上起床再嘗試給手機推送,發現另外一台4.4的機是能接收到的,而Android M這台接不到。猜測這應該就是進入了Doze模式。。。等我手動點亮屏幕那一刻,收到推送的聲音陸續響起。我再猜測應該是這些應用接收到Android亮屏的廣播後去請求推送伺服器,因為這時候已經退出Doze模式了,網路連接恢復正常所以就收取到我剛剛推送的消息。

因為沒看到更多關於Doze模式的資料,還不清楚具體的機制是怎樣的,只能靠瞎猜。目前看來Doze只是晚上待機時有點作用。


最近在研究nexus 6的 preview 3的 doze模式,然並卵,我安裝了常用的一些軟體,耗電量實際跟以前的版本沒什麼差別~ 活躍檢測期和一小時等待期的時間確實太長了,補充一下活躍圖


我並沒有真機實測,但是根據官方的說明,Doze 模式應該還是可以收到第三方推送的,只是時間有可能延後。

Doze 模式是指你的設備扔到桌上,一段時間閑置不用的狀態。此時後台任務的喚醒等待時間會延長,但是並不影響高優先順序的 GCM 推送和實時 Alert。當你拿起設備,點亮屏幕,或者充電時就會恢復。
而真正會導致切斷網路連接的是 App standby 功能。這個是針對你長時間(幾天)沒有打開過的特定 App 而言的。當你重新打開這個 App 或者充電時就會恢復。
參考 https://youtu.be/ndBdf1_oOGA?t=10m56s


2016年6月17日真機測試


系統:Nexus 6p 原生Android(未root)

實驗條件:

Doze模式太難進入,因此使用綠色守護,開啟了嗜睡模式進行測試。根據綠色守護的提示,開啟嗜睡模式後, 手機靜止不動五分鐘,可進入Doze模式。


結果:

1、進入Doze模式後,QQ、微信收不到推送(等了超過10分鐘,不清楚再等下去會不會收到)。

2、把微信加入Doze白名單,進入Doze模式後,微信仍然收不到消息

3、簡訊可以正常收到,使用第三方簡訊APP(搜狗號碼通,設置成默認簡訊APP,沒有拉Doze白名單)也不會影響

4、鬧鐘不知道,誰試過了?


在國內恐怕是:睡你**,起來嗨。


第三方推送在目前 Androd 手機廠商的策略下,已經很難繼續正常工作了。

下一步我希望能致力於推動 Android 手機廠商推出標準的原生推送服務,正在解決 Android 推送的問題。


下面這張圖片是我根據代碼分析的結果:
Doze打盹模式共有五種狀態,不同狀態間的切換如下圖所示,如果廠家沒有修改時間的話,因此從滅屏到Doze模式,至少需要61分鐘,官方是60分鐘,但需要1分鐘作為運動監測。

根據代碼跟蹤,如果應用不在白名單,系統滅屏經過大約一小時後,上層應用wake lock,alarm,還有網路鏈接都會失效,除非你是白名單應用.
影響:

  1. 廠家:天助我也!!!!可以隨意修改系統默認的白名單,因此對他們沒有任何影響.甚至,開機每次檢測白名單配置文件,你想刪除我,呵呵.
  2. 對普通應用,Doze的作者還是很有良心的.Doze模式啟動後,每隔30分鐘,將Doze關閉,給非白名單應用30秒的復活時間,然後又回到了Doze模式!呵呵,你們看著辦吧,只有30s,就只有30s!!!這個時候,大家可以嘗試使用Alarm clock喚醒(猜的,沒做個測試).

  1. 官方非白名單,一次只有一次機會~~~~~~~~~代碼上確實還周期的打開關閉Doze

其實最近升級了原生android7.1後發現有時滅屏很久後,微信都收不到消息了,處於斷網狀態,但是流量和wifi都接著在


親測。
影響網路連接狀態,會在一段時間統一下發上傳


我試過,可能要延遲


除了少數幾個奇葩國家,google規範android不可避免。


天草不屬於世界。
所以,任何神奇的發明在神奇的地方都不可能有神奇的效果


之前不還有消息說Google打算讓Play進入國內么


推薦閱讀:

用axure可以製作出符合Material Design的APP高保真原型嗎?
有沒有拍照濾鏡的第三方SDK?
如何評價《第一行代碼》一書?
知乎網頁登錄背景的動畫是怎麼做出來的?
知乎安卓客戶端關注和取消關注的這個按鈕點擊特效是怎麼實現的?

TAG:Android開發 | 推送Push | Android | AndroidM |