Pengguna Android rata-rata menginstal lebih dari 50 aplikasi di perangkat mereka (jumlahnya bertambah seiring peningkatan tingkat RAM perangkat). Namun, sejumlah besar aplikasi ini tidak digunakan oleh pengguna selama jangka waktu yang lama.
Hibernasi aplikasi akan mengaktifkan hibernasi aplikasi yang tidak digunakan pengguna selama beberapa bulan, serupa dengan pencabutan izin otomatis. Hal ini akan memaksa aplikasi berhenti dan menempatkannya dalam status di mana kita mengoptimalkan penyimpanan, bukan performa. Pencabutan izin otomatis juga dipaketkan dengan status ini dan memiliki setelan pengecualian yang sama di Setelan. Aplikasi yang dihentikan paksa tidak menjalankan tugas atau pemberitahuan di latar belakang dan tidak dapat mengirim notifikasi push. Saat pengguna menggunakan aplikasi lagi, aplikasi akan keluar dari hibernasi dan tugas/notifikasi/notifikasi akan berjalan lagi seperti biasa. Setiap tugas/pemberitahuan/notifikasi yang dijadwalkan sebelum aplikasi beralih ke hibernasi harus dijadwalkan ulang.
OEM yang mengubah platform dapat bertentangan dengan penerapan hibernasi aplikasi. Misalnya
- Mengubah definisi penggunaan aplikasi atau memperkenalkan cara mengaktifkan aplikasi yang tidak ada di AOSP dapat mengganggu akurasi hibernasi aplikasi
- Mekanisme pembatasan eksklusif OEM yang mirip dengan hibernasi aplikasi dapat melakukan tujuan yang serupa. Meskipun keduanya dapat ada, mungkin ada beberapa tumpang-tindih.
CDD menguraikan serangkaian persyaratan baru untuk perubahan yang didasarkan pada penggunaan aplikasi, mirip dengan persyaratan 3.5.1 yang ada. Hibernasi aplikasi mengikuti persyaratan ini.
Kode framework berada di:
- repo: platform/frameworks/base
- direktori: services/core/java/com/android/server/apphibernasi
Logika kebijakan berada di:
- repo: platform/paket/modul/Izin
- direktori: PermissionController/src/com/android/permissioncontroller/hibernasi
Arsitektur tingkat tinggi
Layanan sistem hibernasi aplikasi mengoptimalkan aplikasi yang jarang digunakan pengguna untuk penyimpanan dan mencegah aplikasi tersebut berjalan di latar belakang. Untuk mencapai hasil ini, saat melakukan hibernasi aplikasi, kita khususnya:
- Cabut izin otomatis
- Hentikan Paksa aplikasi
- Hapus file ODEX dan VDEX
- Menghapus cache aplikasi
Tujuan kami adalah menerapkan hibernasi sebagai tindakan yang dapat dikembalikan sehingga aplikasi masih tersedia bagi pengguna melalui Peluncur dan platform lainnya dengan data aplikasi yang utuh. Setelah meluncurkan aplikasi, kita akan memulihkannya kembali dari status paksa berhenti dan melanjutkan pembuatan file ODEX dan VDEX seperti biasa.
Desain yang direncanakan berpusat pada dua bagian utama:
- Menentukan kapan paket harus hibernasi
- Mengoptimalkan paket hibernasi
Layanan sistem baru,
AppHibernationService
, dan layanan tugas, AppHibernationJobService,
di PermissionController
adalah perekat yang mengontrol logika dan pengambilan
keputusan secara keseluruhan.
Penentuan kapan paket harus melakukan hibernasi terutama didukung oleh
UsageStatsService
dan dikelola oleh AppHibernationJobService
di
PermissionController
. Logika kebijakan ini berada di PermissionController
sehingga dapat melakukan update secara dinamis melalui Mainline. Selain itu, kami berencana menambahkan
sinyal baru, penggunaan komponen, untuk merekam penggunaan komponen paket
(misalnya, layanan, penyedia konten) sebagai metrik
baru di UsageStatsService
.
Pengoptimalan paket adalah tempat semua penghematan dan pengoptimalan
yang sebenarnya terjadi. AppHibernationService
berkomunikasi dengan berbagai bagian sistem
untuk menghentikan paket, menghapus data cache, menghapus artefak ART, dan sebagainya.
Pencabutan izin dimulai langsung dari AppHibernationJobService
untuk mempertahankan fungsi pencabutan otomatis di perangkat Android 11 dan yang lebih lama.
Pengalaman pengguna
Pengguna diberi informasi dan kontrol atas aplikasi yang dapat di-hibernasi.
Serupa dengan pencabutan otomatis, pengguna akan mendapatkan notifikasi tentang aplikasi mana yang dihibernasi dan memiliki opsi untuk membuka Setelan langsung dari notifikasi untuk membuka aplikasi dan mengeluarkannya dari hibernasi atau menghapus aplikasi yang tidak digunakan jika diperlukan.
Kami terus mendukung intent developer untuk meminta pengecualian dari hibernasi kepada pengguna dengan intent pengecualian pencabutan izin otomatis yang ada.
Kompatibilitas mundur
Fitur khusus hibernasi tersedia mulai Android 12. Fitur ini tidak dapat berfungsi pada versi sebelumnya karena komponen platform (seperti layanan sistem baru) tidak ada. Pencabutan otomatis terus berfungsi seperti yang diterapkan untuk versi OS sebelumnya.
Mulai Android 12, untuk memastikan kompatibilitas mundur, tombol hibernasi ditambahkan di halaman aplikasi pada bagian Aplikasi & notifikasi di Setelan sekaligus mempertahankan tombol pencabutan otomatis asli dalam submenu Izin. Tombol ini mengontrol pengecualian sistem hibernasi aplikasi secara keseluruhan untuk aplikasi.
Penyesuaian
Beberapa implementasi adalah bagian dari komponen sistem modular, sehingga partner tidak disarankan untuk mengubah fitur. Sebagai gantinya, partner dapat menerapkan fitur atau fungsi serupa selama mereka mengikuti persyaratan CDD.
Hibernasi aplikasi akan diaktifkan secara default untuk semua aplikasi yang menargetkan Android 11 atau yang lebih baru. Hal ini sama dengan pencabutan izin otomatis. Meskipun setelan itu sendiri mungkin AKTIF, penerapan hibernasi aplikasi mungkin berbeda antara aplikasi yang menargetkan Android 11 versus Android 12. Lebih khusus lagi, hibernasi aplikasi hanya berfungsi untuk aplikasi yang menargetkan Android 11 sedangkan pada dasarnya hanya pencabutan otomatis untuk aplikasi yang menargetkan Android 12.
Selain itu, OEM mungkin menerapkan fitur serupa. Namun, fitur tersebut ditargetkan pada jangka waktu yang jauh lebih singkat untuk pengoptimalan baterai yang dapat bersifat khusus OEM. Setiap fitur pembatasan aplikasi serupa yang dikembangkan oleh OEM dapat berdampingan dengan sistem hibernasi aplikasi selama memenuhi kriteria yang ada yang ditentukan dalam CDD.
Pengujian
Hibernasi aplikasi memiliki CTS dan pengujian unit untuk memastikan aplikasi berfungsi dengan benar.
AutoRevokeTest
AppHibernationIntegrationTest