應用休眠

一個普通的 Android 用戶在他們的設備上安裝了 50 多個應用程序(隨著設備 RAM 層的增加,這個數字也會增加)。但是,這些應用程序中的很大一部分在很長一段時間內都未被用戶使用。

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

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

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

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

框架代碼位於:

策略邏輯存在於:

  • 回購:平台/包/模塊/權限
  • 目錄:PermissionController/src/com/android/permissioncontroller/hibernation

高層架構

應用休眠系統服務會優化用戶不常用的應用程序以進行存儲,並防止這些應用程序在後台運行。為了實現這些結果,當我們休眠一個應用程序時,我們專門:

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

我們的目標是將休眠實現為可逆操作,以便用戶仍可通過 Launcher 和其他界面使用應用程序,並且應用程序數據完好無損。啟動應用程序後,我們會將其從強制停止狀態恢復,並像往常一樣繼續創建 ODEX 和 VDEX 文件。

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

  • 確定包何時休眠
  • 優化休眠包

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

確定包何時應該休眠主要由UsageStatsService提供支持,並由PermissionController中的AppHibernationJobService管理。這個策略邏輯存在於PermissionController中,允許我們通過 Mainline 動態更新。此外,我們計劃在UsageStatsService中添加一個新信號組件使用情況,以捕獲包組件(例如,服務、內容提供者)的使用情況作為新指標。

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

用戶體驗

向用戶提供信息和控制哪些應用程序可以休眠。

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

我們繼續支持開發人員通過現有權限自動撤銷豁免意圖請求用戶免於休眠的意圖。

向後兼容性

從 Android 12 開始提供特定於休眠的功能。這些功能無法在早期版本上運行,因為不存在平台組件(例如新的系統服務)。 Auto-revoke 將繼續按照當前為早期操作系統版本實施的功能運行。

從 Android 12 開始,為了確保向後兼容性,在設置中的應用和通知下的應用頁面上添加了一個休眠切換,同時在權限子菜單中保留原始的自動撤銷切換。此切換控制應用程序的整體應用程序休眠系統豁免。

定制

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

對於面向 Android 11 或更高版本的所有應用,應用休眠應默認為開啟。這與權限自動撤銷相同。雖然設置本身可能已開啟,但針對 Android 11 和 Android 12 的應用之間的應用休眠實現可能會有所不同。更具體地說,應用休眠僅適用於針對 Android 11 的應用,而它本質上只是自動撤銷針對 Android 12 的應用。

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

測試

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