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