Task Snapshots 是 Android 8.0 中推出的基礎架構,可結合「Recents Thumbnails」的螢幕截圖,以及 Window Manager 中的「Saved Surfaces」。「近期」縮圖代表「近期」檢視畫面中工作項目的最後狀態。
當活動進入停止狀態時,只要該活動位於工作頂端,Window Manager 就不會銷毀活動的途徑。如果必須再次顯示此活動,Window Manager 就能使用此已儲存的表面,因此無須等待活動完成繪製第一個影格,即可啟動動畫。
建築
近期縮圖和已儲存的途徑這兩個概念會與工作快照整合。當工作進入背景時,Window Manager 會將該工作的螢幕截圖放入 GraphicBuffer。只要工作頂層活動的應用程式仍在記憶體中,這個 GraphicBuffer 就會保留在記憶體中。此時,當同一個活動再次移至前端時,Window Manager 會建立起始視窗 (TaskSnapshotSurface),並附加 GraphicBuffer,而不會將任何記憶體複製到起始視窗的緩衝區佇列。活動繪製第一個影格後,工作快照啟動視窗會像一般啟動畫面一樣,平滑淡出。
同樣的 GraphicBuffer 也會透過 Binder 傳送至 SystemUI,用於在「Recents」檢視畫面中繪製工作預覽狀態。由於這只是緩衝區的參照,因此透過繫結器傳送時,資源的耗用量很少。當 GraphicBuffer 到達 SystemUI 時,會包裝成硬體點陣圖,然後繪製到螢幕上,而不會將任何記憶體上傳至圖形記憶體。
優點
這個新架構有三個主要優點:
- 如果使用工作快照做為起始視窗,快照和實際內容之間就會出現漂亮的漸層轉場效果。
- 當工作快照在 SystemUI 中繪製時,可以不必複製。先前,您必須將位元遮罩複製到 Ashmem,然後再複製到圖形記憶體。由於此方法會直接將快照儲存在圖形記憶體中,因此不需要複製。
- 在「最近」中看到的狀態,一律會與重新開啟應用程式時看到的狀態相符。在此處使用相同的緩衝區,也可以節省大量記憶體。因此 Recents 現可以完整解析度顯示這些圖片。先前為了節省記憶體,會將其採樣率降低 64%。
實作
這項功能完全存在於 Android 平台。不需要整合,也不支援自訂。不過,裝置製造商可以完全停用「工作快照」功能。
如要停用這項功能,請修改以下函式:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
請注意,如果停用這項功能,近期瀏覽畫面就不會顯示任何縮圖。
高解析度和低解析度快照
工作快照會以兩種比例寫入磁碟。從磁碟還原工作快照時,系統會先讀取低解析度快照,然後再取代為高解析度快照。這項最佳化功能可縮短圖片載入時間。否則,從磁碟讀取快照檔案時可能會稍微延遲,使用者會看到空白的工作方塊,直到圖片可用為止。您可以設定config_highResTaskSnapshotScale
和 config_lowResTaskSnapshotScale
,在裝置疊加設定檔 overlay/frameworks/base/core/res/res/values/config.xml
中設定比例。根據預設,這些值分別設為 1.0 和 0.5。將 config_lowResTaskSnapshotScale
設為 0.0,即可停用低解析度快照。範例和來源
如要查看此功能的其餘程式碼,請在以下位置查看 TaskSnapshot* 檔案:
frameworks/base/+/main/services/core/java/com/android/server/wm/