一般 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 起開放使用。由於舊版中沒有平台元件 (例如新系統服務),因此這項功能無法在舊版上運作。自動撤銷功能仍會按照先前作業系統版本的實作方式運作。
從 Android 12 開始,為確保向後相容性,我們在「設定」的「應用程式與通知」下方,新增了應用程式頁面中的休眠模式切換鈕,同時保留「權限」子選單中的原始自動撤銷切換鈕。這個切換鈕可控制應用程式休眠系統的整體豁免狀況。
自訂
部分實作項目屬於模組化系統元件,因此不建議合作夥伴修改這項功能。只要遵循 CDD 規定,合作夥伴就可以實作類似的功能。
對於指定 Android 11 以上版本做為目標版本的所有應用程式,應用程式休眠功能預設為開啟。這與權限自動撤銷相同。雖然設定本身可能已開啟,但針對 Android 11 和 Android 12 的應用程式,應用程式休眠功能的實作方式可能會有所不同。具體來說,應用程式休眠功能僅適用於指定 Android 11 為目標版本的應用程式,而對於指定 Android 12 為目標版本的應用程式,這項功能基本上只會自動撤銷。
此外,原始設備製造商 (OEM) 也可能會實作類似的功能。不過,這些功能的目標是縮短電池最佳化時間,這可能會依 OEM 而異。只要符合 CDD 中定義的現有條件,OEM 開發的任何類似應用程式限制功能,都可以與應用程式休眠系統共存。
測試
應用程式休眠模式有 CTS 和單元測試,可確保其正常運作。
AutoRevokeTest
AppHibernationIntegrationTest