Snapshot tugas

Task Snapshot adalah infrastruktur yang diperkenalkan di Android 8.0 yang menggabungkan screenshot untuk Thumbnail Terbaru serta Platform Tersimpan dari Window Manager. Thumbnail Terbaru mewakili status terakhir tugas di tampilan Terbaru.

Saat aktivitas beralih ke status dihentikan, Window Manager tidak menghancurkan permukaan aktivitas selama aktivitas itu berada di atas tugas. Jika aktivitas ini harus ditampilkan lagi, Window Manager dapat memulai animasi tanpa menunggu aktivitas selesai menggambar {i>frame<i} pertamanya, sebagai ia dapat menggunakan {i>Saved Surface<i} ini.

Arsitektur

Dua konsep {i>Recents Thumbnails<i} dan {i>Saved Surfaces<i} disatukan dengan Task Snapshot. Saat tugas berpindah ke latar belakang, Window Manager akan menempatkan screenshot tugas ini ke dalam GraphicBuffer. Selama aplikasi bagian atas aktivitas tugas tetap ada dalam memori, GraphicBuffer ini akan disimpan di memori. Sekarang, ketika aktivitas yang sama dibawa ke depan lagi, Window Manager akan membuat jendela awal (TaskSnapshotSurface), dan memasang GraphicBuffer tanpa menyalin memori apa pun ke antrean buffer permulaan jendela. Segera setelah aktivitas menggambar {i>frame<i} pertamanya, {i>Task Snapshot<i} jendela awal akan memudar dengan halus seperti layar pembuka biasa.

GraphicBuffer yang sama juga dikirim melalui Binder ke SystemUI untuk digunakan dalam menggambar status pratinjau tugas dalam tampilan Terbaru. Karena ini hanyalah referensi ke {i>buffer<i}, mengirimkannya melalui {i>binder<i} membelanjakan sedikit sumber daya. Jika GraphicBuffer tiba di SystemUI, itu dibungkus menjadi Bitmap perangkat keras dan kemudian dan digambar ke layar tanpa ada memori yang diupload ke memori grafis.

Manfaat

Ada tiga manfaat utama dari arsitektur baru ini:

  • Jika snapshot tugas digunakan sebagai jendela awal, ada crossfade yang bagus antara {i>snapshot<i} dan konten yang sebenarnya.
  • Saat snapshot tugas digambar di SystemUI, ini dapat dilakukan tanpa menyalin. Sebelumnya, bitmap harus disalin ke Ashmem, lalu menjadi grafik memori. Karena metode ini menyimpan {i>snapshot <i}secara langsung di memori grafis, tidak penyalinan diperlukan.
  • Status yang Anda lihat di Terbaru selalu cocok dengan status yang pertama kali Anda lihat saat membuka kembali aplikasi. Memiliki buffer yang sama di sini juga akan menghemat banyak memori. Itu sebabnya Terbaru sekarang dapat menampilkan gambar ini pada resolusi penuh. Sebelumnya, sampelnya diturunkan sebesar 64% untuk menghemat memori.

Implementasi

Fitur ini ada sepenuhnya di platform Android. Tidak ada integrasi yang diperlukan, dan penyesuaian tidak didukung. Namun, produsen perangkat dapat menonaktifkan fitur Task Snapshots sepenuhnya.

Untuk menonaktifkan fitur ini, ubah fungsi ini:

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

Perhatikan bahwa jika fitur ini dinonaktifkan, tampilan Terbaru tidak akan menampilkan thumbnail apa pun.

Snapshot resolusi tinggi dan resolusi rendah

Snapshot tugas ditulis ke disk dalam dua skala. Saat memulihkan tugas dari disk, snapshot resolusi rendah dibaca terlebih dahulu, kemudian diganti dengan dengan resolusi tinggi. Pengoptimalan ini mempercepat waktu pemuatan gambar. Jika tidak, mungkin akan ada sedikit keterlambatan saat membaca {i>file<i} {i>snapshot <i}dari pengguna akan melihat kartu tugas kosong hingga image tersedia. Anda dapat mengonfigurasi timbangan di file konfigurasi overlay perangkat overlay/frameworks/base/core/res/res/values/config.xml menurut setelan config_highResTaskSnapshotScale dan config_lowResTaskSnapshotScale. Secara default, ini ditetapkan ke 1.0 dan 0,5. Nonaktifkan snapshot resolusi rendah dengan menyetel config_lowResTaskSnapshotScale menjadi 0,0.

Contoh dan sumber

Temukan kode lainnya untuk fitur ini dalam file TaskSnapshot* di:

frameworks/base/+/main/services/core/java/com/android/server/wm/