應用程式休眠

平均每個 Android 用戶在其裝置上安裝 50 多個應用程式(數量隨著裝置 RAM 層的增加而增加)。然而,這些應用程式中的大量用戶在很長一段時間內沒有使用。

應用程式休眠將使用者幾個月不使用的應用程式休眠,類似於權限自動撤銷。這會強制停止應用程序,並將其置於我們針對儲存而不是效能進行最佳化的狀態。權限自動撤銷也與此狀態捆綁在一起,並且它們在Settings中共享相同的豁免設定。強制停止的應用程式不會在背景執行作業或警報,也無法發送推播通知。當使用者再次使用應用程式時,該應用程式將退出休眠狀態,並且作業/警報/通知將再次照常運行。在應用程式進入休眠狀態之前安排的任何作業/警報/通知都需要重新排程。

修改平台的 OEM 可能會與應用程式休眠實作發生衝突。例如

  • 修改應用程式使用定義或引入喚醒不在 AOSP 中的應用程式的方法可能會中斷應用程式休眠的準確性
  • OEM 的專有限制機制(類似於應用程式休眠)可以實現類似的目的。雖然兩者都可以存在,但可能會有一些重疊。

CDD 概述了一組基於應用程式使用情況進行更改的新要求,類似於現有的3.5.1要求。應用程式休眠遵循這些要求。

框架程式碼位於:

政策邏輯在於:

  • 倉庫:平台/套件/模組/權限
  • 目錄: PermissionController/src/com/android/permissioncontroller/hibernation

高層架構

應用休眠系統服務可以優化用戶不常用的應用程式的存儲,並防止這些應用程式在背景運行。為了實現這些結果,當我們休眠應用程式時,我們特別:

  • 自動撤銷權限
  • 強制停止應用程式
  • 刪除 ODEX 和 VDEX 文件
  • 刪除應用程式緩存

我們的目標是將休眠實現為可逆操作,以便用戶仍然可以透過啟動器和其他介面使用該應用程序,並且應用程式資料完好無損。啟動應用程式後,我們會將其從強制停止狀態恢復,並繼續照常建立 ODEX 和 VDEX 檔案。

計劃的設計圍繞著兩個主要部分:

  • 確定包何時應該休眠
  • 最佳化休眠包

PermissionController中的新系統服務AppHibernationService和作業服務AppHibernationJobService,是控制整體決策和邏輯的黏合劑。

確定套件何時應該休眠主要由UsageStatsService提供支持,並由PermissionController中的AppHibernationJobService管理。這個策略邏輯位於PermissionController中,讓我們可以透過主線動態更新。此外,我們計劃新增一個新的訊號,即元件使用情況,以擷取套件元件(例如服務、內容提供者)的使用情況,作為UsageStatsService中的新指標。

優化包是所有實際節省/優化發生的地方。 AppHibernationService與系統的各個部分進行通信,以停止套件、刪除快取資料、刪除 ART 工件等。權限撤銷直接從AppHibernationJobService發起,以在 Android 11 及更低版本的裝置上保留自動撤銷功能。

使用者體驗

提供使用者可以休眠哪些應用程式的資訊和控制。

與自動撤銷類似,用戶會收到有關哪些應用程式處於休眠狀態的通知,並且可以選擇直接從通知轉到“設定”,以打開應用程式並將其退出休眠狀態,或根據需要刪除未使用的應用程式程式.

我們繼續支持開發者透過現有權限自動撤銷豁免意圖要求使用者豁免休眠的意圖。

向後相容性

從 Android 12 開始,可使用休眠特定功能。由於不存在平台元件(例如新系統服務),這些功能無法在早期版本上運作。自動撤銷功能繼續按照目前針對早期操作系統版本實現的方式運作。

從 Android 12 開始,為了確保向後相容性,在應用程式頁面上的「設定」中的「應用程式和通知」下新增了休眠切換開關,同時在「權限」子選單中保留了原始的自動撤銷切換開關。此切換控制應用程式的整體應用程式休眠系統豁免。

客製化

由於某些實作是模組化系統元件的一部分,因此不鼓勵合作夥伴修改該功能。只要遵循 CDD 要求,合作夥伴就可以實施類似的特性/功能。

對於所有面向 Android 11 或更高版本的應用程序,應用程式休眠應預設為「開」。這與權限自動撤銷相同。雖然設定本身可能處於開啟狀態,但針對Android 11 和Android 12 的應用程式之間的應用程式休眠實作可能有所不同。更具體地說,應用程式休眠僅適用於針對Android 11 的應用程序,而對於針對Android 12 的應用程式來說,它本質上只是自動撤銷。

此外,OEM 可能正在實施類似的功能。然而,這些功能的目標是更短的電池優化時間尺度,這可能是 OEM 特定的。 OEM 開發的任何類似的應用程式限制功能都可以與應用程式休眠系統共存,只要它們符合CDD中定義的現有標準即可。

測試

應用程式休眠具有 CTS 和單元測試,以確保其正常工作。