Snapshot tugas

Snapshot Tugas adalah infrastruktur yang diperkenalkan di Android 8.0 yang menggabungkan screenshot untuk Thumbnail Terbaru serta Permukaan Tersimpan dari Pengelola Jendela. Thumbnail Terbaru menampilkan status terakhir tugas di tampilan Terbaru.

Saat aktivitas memasuki status berhenti, Pengelola Jendela tidak menghancurkan permukaan aktivitas selama aktivitas tersebut berada di bagian atas tugas. Jika aktivitas ini harus ditampilkan lagi, Pengelola Jendela dapat memulai animasi tanpa menunggu aktivitas selesai menggambar frame pertamanya, karena dapat menggunakan Permukaan Tersimpan ini.

Arsitektur

Dua konsep Thumbnail Terbaru dan Permukaan Tersimpan disatukan dengan Snapshot Tugas. Saat tugas dipindah ke latar belakang, Pengelola Jendela akan menempatkan screenshot tugas ini ke dalam GraphicBuffer. Selama aplikasi aktivitas teratas tugas tetap ada di memori, GraphicBuffer ini akan dipertahankan di memori. Sekarang, saat aktivitas yang sama ditampilkan lagi di latar depan, Window Manager akan membuat jendela awal (TaskSnapshotSurface), dan melampirkan GraphicBuffer tanpa menyalin memori apa pun ke antrean buffer jendela awal. Segera setelah aktivitas menggambar frame pertamanya, jendela mulai Snapshot Tugas akan memudar dengan lancar seperti layar pembuka biasa.

GraphicBuffer yang sama juga dikirim melalui Binder ke SystemUI untuk digunakan dalam menggambar status pratinjau tugas di tampilan Terbaru. Karena ini hanya referensi ke buffer, pengirimannya melalui binder hanya menggunakan sedikit resource. Saat GraphicBuffer tiba di SystemUI, GraphicBuffer tersebut akan di-wrap menjadi Bitmap hardware, lalu digambar ke layar tanpa ada upload memori ke memori grafis.

Manfaat

Ada tiga manfaat utama dari arsitektur baru ini:

  • Jika snapshot tugas digunakan sebagai jendela awal, akan ada crossfade yang bagus antara snapshot dan konten sebenarnya.
  • Saat snapshot tugas digambar di SystemUI, hal ini dapat dilakukan tanpa penyalinan apa pun. Sebelumnya, bitmap harus disalin ke Ashmem, lalu ke memori grafis. Karena metode ini menyimpan snapshot langsung di memori grafis, tidak ada penyalinan yang 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 menghemat banyak memori. Itulah sebabnya tab Terbaru kini dapat menampilkan gambar ini dalam resolusi penuh. Sebelumnya, sampelnya diturunkan sebesar 64% untuk menghemat memori.

Implementasi

Fitur ini sepenuhnya ada di platform Android. Tidak diperlukan integrasi, dan penyesuaian tidak didukung. Namun, produsen perangkat dapat menonaktifkan fitur Snapshot Tugas 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 rendah

Snapshot tugas ditulis ke disk dalam dua skala. Saat memulihkan snapshot tugas dari disk, snapshot beresolusi rendah dibaca terlebih dahulu, lalu diganti dengan snapshot beresolusi tinggi. Pengoptimalan ini meningkatkan waktu pemuatan gambar. Jika tidak, mungkin ada sedikit penundaan saat membaca file snapshot dari disk, dan pengguna akan melihat kartu tugas kosong hingga gambar tersedia. Anda dapat mengonfigurasi skala dalam file konfigurasi overlay perangkat overlay/frameworks/base/core/res/res/values/config.xml dengan menyetel config_highResTaskSnapshotScale dan config_lowResTaskSnapshotScale. Secara default, nilai ini masing-masing ditetapkan ke 1,0 dan 0,5. Nonaktifkan snapshot beresolusi rendah dengan menyetel config_lowResTaskSnapshotScale ke 0.0.

Contoh dan sumber

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

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