工作快照

工作快照是 Android 8.0 中導入的基礎架構,可合併最近使用的縮圖和 Window Manager 中的已儲存介面的螢幕截圖。「最近存取」縮圖代表「最近存取」檢視畫面中工作的最後狀態。

當活動進入停止狀態時,只要活動位於工作頂端,視窗管理員就不會銷毀活動的介面。如果必須再次顯示這項活動,視窗管理員就能啟動動畫,不必等待活動繪製第一個影格,因為視窗管理員可以使用這個已儲存的 Surface。

建築

「近期存取的縮圖」和「已儲存的介面」這兩個概念會與「工作快照」整合。工作進入背景時,視窗管理員會將這項工作的螢幕截圖放入 GraphicBuffer。只要工作頂端活動的應用程式保留在記憶體中,這個 GraphicBuffer 就會保留在記憶體中。現在,當相同活動再次移至前景時,Window Manager 會建立啟動視窗 (TaskSnapshotSurface),並附加 GraphicBuffer,不會將任何記憶體複製到啟動視窗的緩衝區佇列。活動繪製第一個影格後,工作快照啟動視窗就會像一般啟動畫面一樣,平順地淡出。

相同的 GraphicBuffer 也會透過 Binder 傳送至 SystemUI,用於在「最近」檢視畫面中繪製工作預覽狀態。由於這只是緩衝區的參照,透過繫結器傳送緩衝區時,耗用的資源很少。當 GraphicBuffer 抵達 SystemUI 時,系統會將其包裝成硬體點陣圖,然後繪製到畫面上,不會將任何記憶體上傳至圖形記憶體。

優點

這項新架構有三大優點:

  • 如果工作快照用做起始視窗,快照和實際內容之間會出現漂亮的交叉淡化效果。
  • 在 SystemUI 中繪製工作快照時,不需要進行任何複製作業。先前必須將點陣圖複製到 Ashmem,然後再複製到圖形記憶體。由於這個方法會將快照直接儲存在圖形記憶體中,因此不需要複製。
  • 「最近」畫面中顯示的狀態,一律與重新開啟應用程式時看到的狀態相同。這裡使用相同的緩衝區也能節省大量記憶體。因此「最近」現在可以顯示完整解析度的圖片。 先前為了節省記憶體,系統會將圖片縮減 64%。

實作

這項功能完全存在於 Android 平台。不需要整合,也不支援自訂。不過,裝置製造商可以完全停用工作快照功能。

如要停用這項功能,請修改下列函式:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

請注意,如果停用這項功能,「最近」檢視畫面就不會顯示任何縮圖。

高解析度和低解析度快照

工作快照會以兩種比例寫入磁碟。從磁碟還原工作快照時,系統會先讀取低解析度快照,然後以高解析度快照取代。這項最佳化功能可縮短圖片載入時間。否則,從磁碟讀取快照檔案時可能會稍微延遲,使用者會看到空白的工作卡,直到圖片可用為止。您可以在裝置疊加層設定檔 overlay/frameworks/base/core/res/res/values/config.xml 中設定 config_highResTaskSnapshotScaleconfig_lowResTaskSnapshotScale,藉此設定比例。預設值分別為 1.0 和 0.5。將 config_lowResTaskSnapshotScale 設為 0.0,即可停用低解析度快照。

範例和來源

如要瞭解這項功能的其餘程式碼,請前往下列位置的 TaskSnapshot* 檔案:

frameworks/base/+/android16-release/services/core/java/com/android/server/wm/