本文章轉(zhuǎn)載于搜狗測試
對于移動app棍厂,性能優(yōu)化是永無止境的話題,而在性能指標(biāo)中扯俱,耗電量又是重中之重书蚪,android的大神們當(dāng)然也在為此努力,所以從android 6.0開始迅栅,谷歌引入了兩項新的省電技術(shù)延長電池使用時間殊校,分別是Doze(休眠)和App Standby(app待命模式),只要app是運行在6.0(api 23)及以上的系統(tǒng)读存,
無論app編譯時是否使用的target=23为流,都會受到這兩種技術(shù)的限制
。
一宪萄、理解什么是Doze模式
如果設(shè)備滿足
1艺谆、屏幕關(guān)閉;
2拜英、沒有連接電源静汤,
這樣持續(xù)一段時間后系統(tǒng)就會進入Doze模式,在Doze模式下居凶,系統(tǒng)通過限制app訪問網(wǎng)絡(luò)和其對CPU使用來達到省電的目的虫给,app的網(wǎng)絡(luò)訪問功能會被禁用,同時延時執(zhí)行作業(yè)侠碧,異步任務(wù)及標(biāo)準(zhǔn)鬧鐘事件抹估。
同時,為了保證app的工作弄兜,系統(tǒng)會周期地退出Doze模式药蜻,以保證app完成那些被延時的任務(wù),如下圖替饿,這個狀態(tài)被稱作maintenance window(維護窗口)语泽。且隨著系統(tǒng)處于Doze模式時間增長,進入maintenance window的頻率會降低视卢。
二踱卵、Doze 模式下的限制
網(wǎng)絡(luò)訪問功能被關(guān)閉
系統(tǒng)會忽略wake locks,即app無法持續(xù)占有電源
標(biāo)準(zhǔn)鬧鐘 AlarmManager(包括setExact())和setWindow()))都會被延時到下一個maintenancewindow才激活
1 . 如果app仍需要在Doze時使鬧鐘生效据过,可以使用setAndAllowWhileIdle())或setExactAndAllowWhileIdle())
2 . 使用函數(shù)setAlarmClock())設(shè)置的鬧鐘在Doze時仍會生效惋砂,系統(tǒng)會在鬧鐘生效前推出Doze。
系統(tǒng)不會進行Wi-Fi掃描
系統(tǒng)不允許異步Adapters運行
系統(tǒng)不允許JobScheduler運行
三绳锅、理解App Standby
android系統(tǒng)通過App Standby機制可以把用戶沒有使用的app置為空閑狀態(tài)西饵,當(dāng)然前提是app沒有命中以下條件:
用戶明確的啟動了該app
app有前臺進程(包括前臺的activity、前臺service榨呆,或者正在被其他activity及前臺service使用)
app當(dāng)前沒有在鎖屏界面或者通知欄有通知
當(dāng)設(shè)備連接到電源時庸队,系統(tǒng)會把所有處于standby的設(shè)備恢復(fù)到正常運行狀態(tài),如果設(shè)備長期處于空閑狀態(tài)彻消,系統(tǒng)會每天允許standby 的app聯(lián)網(wǎng)一次
四、當(dāng)設(shè)備處于Doze模式時宙拉,使用GCM與app進行交互。
Google Cloud Messaging (GCM)是谷歌提供的一套用于服務(wù)端實時推送消息的服務(wù)谢澈,通過high-priority GCM messages,GCM實現(xiàn)了在Doze和App Standby模式下的正常工作锥忿,GCMhigh-priority messages會喚醒app并允許其進行網(wǎng)絡(luò)訪問牛郑,即使當(dāng)前設(shè)備正處于Doze模式或app整除standby狀態(tài)。而當(dāng)app處理完推送消息后敬鬓,app又會進入Standby狀態(tài)淹朋。所以GCM high-priority messages并不會影響系統(tǒng)的Doze狀態(tài),也不會影響其他出于Standby狀態(tài)的app钉答,這樣有助于最小化電量的消耗础芍。
五、支持其他的用戶場景
如果使用GCM仍不能滿足app的需求数尿,android還提供了白名單機制使app能在Doze和Standby時仍能夠訪問網(wǎng)絡(luò)和使用partial wakelocks仑性,然而,其他的限制右蹦,如作業(yè)調(diào)度诊杆,異步操作,及鬧鐘仍不會執(zhí)行何陆。
開發(fā)者可以通過接口isIgnoringBatteryOptimizations())來判斷當(dāng)前app是否處于白名單中刽辙。對于白名單,有以下幾點值得關(guān)注:
用戶可以手動配置白名單甲献,其位置在設(shè)置->電池->電池優(yōu)化。
開發(fā)者可以通過發(fā)送action為REQUEST_IGNORE_BATTERY_OPTIMIZATIONS的Intent來調(diào)起電池優(yōu)化配置頁面颂翼。
開發(fā)者也可以通過添加權(quán)限REQUEST_IGNORE_BATTERY_OPTIMIZATIONS使其可以觸發(fā)系統(tǒng)對話框晃洒,詢問用戶是否將該app添加到白名單中。觸發(fā)添加白名單確認(rèn)對話框的action為ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
當(dāng)然朦乏,如果用戶需要球及,他們可以隨時在電池優(yōu)化配置里把app從白名單中移除。
六呻疹、測試Doze及App Standby下的應(yīng)用工作狀態(tài)
(一)在Doze時測試APP
1 . 需要一臺系統(tǒng)版本大于等于6.0(api23)的設(shè)備
2 . 連接USB吃引,運行被測app,保持app在活動狀態(tài)
3 . 關(guān)閉設(shè)備屏幕
4 . 通過下面的adb命令強制系統(tǒng)進入Doze模式
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
第二個命令需要執(zhí)行多次才能使系統(tǒng)進入idle狀態(tài)
5 . ?退出Doze狀態(tài),檢查app的工作狀態(tài)符合預(yù)期
(二)測試App Standby
1 . 需要一臺系統(tǒng)版本大于等于6.0(api23)的設(shè)備
2 . 連接USB镊尺,運行被測app朦佩,保持app在活動狀態(tài)
3 . 通過下面的adb命令使app進入standby
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive true
4 . 通過下面的adb命令模擬喚醒app
$ adb shell am set-inactive false
$ adb shell am get-inactive
5 . app喚醒后檢查其工作狀態(tài)符合預(yù)期,尤其是通知和后臺任務(wù)是否正常