電源管理

Android 9 (API 級別 28) 推出了幾項新功能,可改善裝置電源管理成效。這些變更和舊版本中已有的功能,有助於確保將系統資源提供給最需要的應用程式。

電源管理功能分為兩類:

應用程式待命值區
系統會根據使用者的使用模式,限制應用程式對 CPU 或電池等裝置資源的存取權。這是 Android 9 的新功能。
改善省電模式
省電模式開啟時,系統會對所有應用程式設下限制。這是在 Android 9 中改進的現有功能。

應用程式待命值區

Android 9 推出了新的電池管理功能:「應用程式待命值區」。應用程式待命值區會根據應用程式的上次使用時間和使用頻率,協助應用程式優先處理資源要求。根據應用程式的使用模式,每個應用程式都會排入五個優先順序值區中的其中一個。並根據應用程式所在的值區,限制每個應用程式可用的裝置資源。

這五種值區會按照下列特性,將應用程式分組:

主動技能

如果使用者正在使用應用程式,應用程式就會位於使用中值區。例如:

  • 應用程式已經啟動一項活動
  • 應用程式正在執行前景服務
  • 應用程式的同步轉換介面與前景應用程式所用的內容供應器相關聯
  • 使用者點選應用程式通知

如果應用程式位在使用中值區,系統就不會對應用程式的工作、鬧鐘或 FCM 訊息設下任何限制。

工作組

若應用程式經常執行,但目前並未處於使用中狀態,就會位於工作組值區。舉例來說,使用者最常啟動的社群媒體應用程式可能就位於工作組中。如果使用者間接使用應用程式,應用程式也會升級至工作組值區。

當應用程式位於工作組值區,系統會對其執行工作及觸發鬧鐘的功能設下輕微限制。詳情請參閱「電源管理限制」。

常用

如果應用程式經常使用,但不一定是每天使用,則會位於常用值區。舉例來說,使用者在健身房執行的健身追蹤應用程式可能就位於常用值區。

當應用程式位於常用值區,系統會對其執行工作及觸發鬧鐘的功能設下更嚴格的限制,同時也限制高優先順序的 FCM 訊息上限。詳情請參閱「電源管理限制」。

很少使用

不常使用的應用程式會位於很少使用值區。舉例來說,使用者只有在入住飯店期間才會執行的飯店應用程式,可能就位於很少使用值區。

當應用程式位於很少使用值區,系統會對其執行工作、觸發鬧鐘和接收高優先順序 FCM 訊息的功能設下嚴格限制。此外,系統也會限制這類應用程式的網際網路連線功能。詳情請參閱「電源管理限制」。

從未

已安裝但從未執行的應用程式不會指派至永不值區。 系統對這類應用程式設有嚴格的限制。

系統會以動態方式指派每個應用程式至一個優先順序值區,並視需要重新指派應用程式。系統可能需要仰賴使用機器學習技術的預先載入應用程式,判斷每個應用程式的使用機率,然後將應用程式指派到適當的值區。如果裝置上沒有系統應用程式,系統會預設根據應用程式的上次使用時間排序應用程式。系統會將較活躍的應用程式指派給優先度較高的值區,讓應用程式可以使用更多系統資源。請特別注意,值區決定應用程式工作執行的頻率、應用程式觸發鬧鐘的頻率,以及應用程式可以接收高優先順序 Firebase 雲端通訊 (FCM) 訊息的頻率。這些限制只有在裝置使用電池電力時才適用;系統不會在裝置充電時對應用程式強制執行這些限制。

針對非使用中應用程式如何指派至值區,每個製造商都可以設定各自的條件。請勿嘗試改變應用程式獲派的值區,而應專注於確保無論所在值區為何,應用程式都能正常運作。應用程式可以呼叫新方法 UsageStatsManager.getAppStandbyBucket(),以找出目前所在的值區。

最佳做法

如果應用程式已經採用打盹和應用程式待命的最佳做法,處理新的電源管理功能應該不會太困難。不過,某些先前運作良好的應用程式行為現在可能會造成問題。

  • 請勿試圖操控系統,將應用程式指派至某個值區或改變所在值區。系統的值區分類方法可能會改變,每個裝置製造商也可能選擇以自家演算法編寫用來建立值區的應用程式。建議您改為確保無論所在值區為何,應用程式都能正確運作。
  • 如果應用程式沒有啟動器活動,就可能完全無法升級至使用中值區。建議您重新設計應用程式,使應用程式具有此類活動。
  • 如果應用程式的通知無法採取行動,使用者就無法透過與通知互動,觸發應用程式升級至使用中值區。在這種情況下,建議您重新設計一些適當的通知,使其允許使用者回應。如需相關準則,請參閱質感設計的「通知設計模式」。
  • 同樣地,如果應用程式在收到高優先順序 FCM 訊息時未顯示通知,就不會讓使用者有機會與應用程式互動,從而將應用程式升級至使用中值區。事實上,高優先順序 FCM 訊息的唯一用途,就是推送通知給使用者,因此這種情況最好絕對不要發生。如果您在 FCM 訊息沒有觸發使用者互動的情況下,誤將 FCM 訊息標示為高優先順序,可能會導致其他負面後果;例如,可能會導致應用程式耗盡其配額,導致真的緊急的 FCM 訊息視為一般優先順序。

    注意:如果使用者重複關閉通知,系統會向使用者提供在日後封鎖該通知的選項。請不要為了將應用程式保持在使用中值區,而傳送過多通知給使用者!

  • 如果應用程式分割成多個套件,這些套件可能會位於不同的值區,因此會有不同的存取層級。若應用程式的套件會指派至不同值區,建議您一定要測試這類應用程式,確保相關運作方式正確無誤。

改善省電模式

Android 9 改善了省電模式。您設下的限制是由裝置製造商決定。舉例來說,在 Android 開放原始碼計畫版本中,系統會套用下列限制:

  • 系統會積極讓應用程式進入應用程式待命模式,而不是等待應用程式處於閒置狀態。
  • 背景執行限制會套用至所有應用程式,無論應用程式的目標 API 級別為何。
  • 定位服務可能在螢幕關閉時停用。
  • 背景應用程式沒有網路存取權。

此外,還有其他裝置專用的電源最佳化設定。詳情請參閱電源管理限制說明頁面

一如以往,建議您在省電模式啟用的狀態下測試應用程式。您可以在裝置的「設定」>「省電模式」畫面中,手動開啟省電模式。

測試及疑難排解

無論應用程式是否指定 Android 9,新的電源管理功能都會影響所有在 Android 9 裝置上執行的應用程式。請務必確認應用程式能在這類裝置上正常運作。

請務必在多種情況下測試應用程式的主要用途,瞭解各項電源管理功能之間的互動方式。如要開啟或關閉部分電源管理功能,您可以使用 Android Debug Bridge 指令。

Android Debug Bridge 指令

您可以使用 Android Debug Bridge 殼層指令測試多個電源管理功能。

如要進一步瞭解如何使用 ADB 讓裝置進入「打盹」模式,請參閱「使用打盹和應用程式待命功能進行測試」。

應用程式待命值區

您可以使用 ADB,將應用程式手動指派至應用程式待命值區。如要變更應用程式的值區,請使用下列指令:

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

您也可以使用該指令,一次設定多個檔案包:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

如要查看應用程式所在的值區,請執行以下程式碼:

$ adb shell am get-standby-bucket [packagename]

如未傳遞 packagename 參數,指令會列出所有應用程式的值區。應用程式也可以呼叫新方法 UsageStatsManager.getAppStandbyBucket(),在執行階段期間找出值區。

省電模式

您可以使用多個指令,測試應用程式在低電量情況下的行為。

如要模擬沒有插上插頭的裝置,請使用下列指令

$ adb shell dumpsys battery unplug

如要測試裝置在低電量情況下的行為,請使用下列指令:

$ adb shell settings put global low_power 1

測試完成後,您就可以使用下列指令,復原手動調整的裝置設定:

$ adb shell dumpsys battery reset