Android 使用者平均會在裝置上安裝 50 個以上的應用程式 (裝置的 RAM 層級越高,安裝的應用程式數量就越多)。不過,使用者長期未使用的應用程式數量相當可觀。
應用程式休眠功能會讓使用者幾個月未使用的應用程式進入休眠狀態,與自動撤銷權限功能類似。這會強制停止應用程式,並將其設為以儲存空間最佳化為目標,而非效能。權限自動撤銷功能也與此狀態一併提供,並在「設定」中共用相同的豁免設定。強制停止的應用程式不會在背景執行工作或發送快訊,也無法傳送推播通知。使用者再次使用應用程式時,應用程式會結束休眠,並照常執行工作/發送快訊/通知。應用程式休眠前排定的工作/快訊/通知都必須重新安排。
如果原始設備製造商 (OEM) 修改平台,可能會與應用程式休眠實作項目發生衝突。例如
- 修改應用程式用量定義,或導入 AOSP 中沒有的應用程式喚醒方式,可能會影響應用程式休眠的準確度
- OEM 專屬的限制機制 (類似於應用程式休眠) 可能會達到類似目的。兩者可以同時存在,但可能會有部分重疊。
CDD 列出根據應用程式使用情形進行變更的一系列新規定,與現有的3.5.1 規定類似。應用程式休眠功能遵循下列規定。
架構程式碼位於:
- repo: platform/frameworks/base
- 目錄:services/core/java/com/android/server/apphibernation
政策邏輯位於:
- repo: platform/packages/modules/Permission
- 目錄:PermissionController/src/com/android/permissioncontroller/hibernation
高階架構
應用程式休眠系統服務會針對使用者不常使用的應用程式進行儲存空間最佳化,並防止這些應用程式在背景執行。為達到上述結果,我們會在休眠應用程式時採取下列措施:
- 自動撤銷權限
- 強制停止應用程式
- 刪除 ODEX 和 VDEX 檔案
- 刪除應用程式快取
我們的目標是將休眠功能實作為可逆的動作,讓使用者仍可透過啟動器和其他介面存取應用程式,且應用程式資料不會遺失。啟動應用程式後,系統會從強制停止狀態還原應用程式,並照常繼續建立 ODEX 和 VDEX 檔案。
預計設計將以兩大主體為中心:
- 判斷套件應進入休眠狀態的時間
- 最佳化休眠套件
新的系統服務 AppHibernationService
和工作服務 AppHibernationJobService,
位於 PermissionController
中,可控制整體決策和邏輯。
判斷套件何時應進入休眠狀態,主要由 UsageStatsService
驅動,並由 PermissionController
中的 AppHibernationJobService
管理。這項政策邏輯位於 PermissionController
,可讓我們透過 Mainline 動態更新。此外,我們也計畫在 UsageStatsService
中新增「元件使用量」信號,做為新的指標,用來擷取套件元件 (例如服務、內容供應商) 的使用量。
最佳化套件是實際節省空間和最佳化作業的發生地。AppHibernationService
會與系統各個部分通訊,停止套件、刪除快取資料、刪除 ART 構件等。權限撤銷作業會直接從 AppHibernationJobService
啟動,以便在 Android 11 以下版本的裝置上保留自動撤銷功能。
使用者體驗
系統會向使用者提供資訊,並讓他們控管哪些應用程式可以進入休眠狀態。
與自動撤銷類似,使用者會收到通知,瞭解哪些應用程式進入休眠狀態,並可直接從通知前往「設定」,開啟應用程式並解除休眠,或視需要刪除未使用的應用程式。
我們仍會支援開發人員要求使用者豁免休眠的意圖,並提供現有的權限自動撤銷豁免意圖。
回溯相容性
Android 12 以上版本提供休眠專用功能。由於舊版不含平台元件 (例如新的系統服務),因此無法使用這項功能。自動撤銷功能會繼續運作,與先前 OS 版本的實作方式相同。
從 Android 12 開始,為確保回溯相容性,系統會在「設定」的「應用程式和通知」下方,應用程式頁面中新增休眠切換按鈕,同時保留「權限」子選單中的原始自動撤銷切換按鈕。這個切換鈕可控制應用程式的整體應用程式休眠系統豁免。
自訂
部分實作項目屬於模組化系統元件,因此不建議合作夥伴修改這項功能。只要符合 CDD 規定,合作夥伴可以改為實作類似的功能。
如果應用程式指定 Android 11 以上版本,應用程式休眠功能應預設為開啟。這與自動撤銷權限相同。即使設定本身可能已開啟,但以 Android 11 和 Android 12 為目標的應用程式,實作應用程式休眠功能的方式可能有所不同。具體來說,應用程式休眠功能僅適用於以 Android 11 為目標的應用程式,而對於以 Android 12 為目標的應用程式,這項功能基本上只是自動撤銷權限。
此外,原始設備製造商 (OEM) 可能會實作類似功能。 不過,這些功能是以更短的時間尺度為目標,進行電池最佳化,這可能因 OEM 而異。只要符合 CDD 中定義的現有條件,OEM 開發的任何類似應用程式限制功能,都可以與應用程式休眠系統並存。
測試
應用程式休眠功能有 CTS 和單元測試,可確保功能正常運作。
AutoRevokeTest
AppHibernationIntegrationTest