Hibernasi aplikasi

Jika aplikasi menargetkan Android 11 (level API 30) atau lebih tinggi, dan pengguna tidak berinteraksi dengan aplikasi selama beberapa bulan, sistem akan menempatkan aplikasi di status hibernasi. Sistem mengoptimalkan ruang penyimpanan, bukan performa, dan melindungi data pengguna. Perilaku sistem ini mirip dengan yang terjadi saat pengguna memaksa aplikasi berhenti secara manual dari setelan sistem.

Efek hibernasi

Seperti yang ditunjukkan dalam tabel 1, efek hibernasi bergantung pada versi SDK target aplikasi, serta perangkat tempat aplikasi berjalan:

Tabel 1. Efek hibernasi di aplikasi
Versi SDK target Karakteristik perangkat Efek hibernasi
Android 12 atau yang lebih baru Menjalankan Android 12 atau versi yang lebih baru

Izin runtime aplikasi Anda akan direset. Tindakan ini memiliki efek yang sama seperti jika pengguna melihat izin dalam setelan sistem dan mengubah tingkat akses aplikasi Anda menjadi Deny.

Aplikasi tidak dapat menjalankan tugas atau pemberitahuan dari latar belakang.

Aplikasi tidak dapat menerima notifikasi push, termasuk pesan berprioritas tinggi yang dikirim melalui Firebase Cloud Messaging.

Semua file di cache aplikasi akan dihapus.

Android 11 Menjalankan Android 11 Izin runtime aplikasi Anda direset.
Android 11 Menjalankan Android 6.0 (level API 23) hingga Android 10 (level API 29), inklusif, dan didukung oleh layanan Google Play

Izin runtime aplikasi Anda direset.

Perilaku ini berlaku pada Desember 2021. Pelajari lebih lanjut di postingan blog ini tentang membuat reset otomatis izin tersedia untuk miliaran perangkat lainnya.

Perilaku sistem saat aplikasi keluar dari hibernasi

Ketika pengguna selanjutnya berinteraksi dengan aplikasi, aplikasi akan keluar dari hibernasi dan dapat membuat tugas, pemberitahuan, serta notifikasi lagi.

Namun, sistem tidak melakukan hal berikut untuk aplikasi Anda:

  1. Memberikan kembali izin runtime aplikasi Anda.

    Pengguna harus memberikan kembali izin ini untuk aplikasi Anda.

  2. Menjadwalkan ulang tugas, pemberitahuan, dan notifikasi apa pun yang dijadwalkan sebelum aplikasi Anda mengalami hibernasi.

    Untuk mendukung alur kerja ini dengan lebih mudah, gunakan WorkManager. Anda juga dapat menambahkan logika penjadwalan ulang di penerima siaran ACTION_BOOT_COMPLETED yang dipanggil saat aplikasi keluar dari hibernasi dan setelah perangkat melakukan booting.

Penggunaan aplikasi

Bagian berikut memberikan contoh penggunaan aplikasi, serta contoh tindakan yang tidak dianggap sistem sebagai penggunaan aplikasi.

Contoh penggunaan aplikasi

Saat aktivitas di aplikasi Anda dilanjutkan, sistem menganggap peristiwa ini sebagai interaksi pengguna. Oleh karena itu, sistem memperpanjang jumlah waktu sebelum aplikasi Anda memasuki hibernasi.

Di Android 11 dan yang lebih tinggi, perilaku berikut juga dianggap sebagai interaksi pengguna:

  • Pengguna berinteraksi dengan widget.
  • Pengguna berinteraksi dengan notifikasi, kecuali untuk menutup notifikasi.

Perlu dicatat bahwa penggunaan aplikasi untuk hibernasi tidak secara eksplisit memerlukan interaksi pengguna. Selama komponen paket dipanggil, aktivitas tersebut akan tetap dianggap sebagai penggunaan aplikasi. Beberapa contohnya antara lain:

  • Aplikasi yang memiliki layanan atau penyedia konten yang dibatasi oleh aplikasi lain di perangkat atau OS. Misalnya, Editor Metode Input (IME) atau pengelola sandi.
  • Penerima siaran dalam paket yang menerima siaran eksplisit dari paket eksternal.

Non-contoh

Jika aplikasi Anda hanya menampilkan perilaku yang dijelaskan dalam daftar berikut, aplikasi Anda akan memasuki hibernasi setelah beberapa bulan:

Pengecualian sistem dari hibernasi

Android memberikan pengecualian tingkat sistem dari hibernasi aplikasi dalam kasus penggunaan tertentu. Jika termasuk dalam kategori berikut, aplikasi Anda akan dikecualikan dari standar penggunaan aplikasi dan tidak akan melakukan hibernasi.

Aplikasi yang tidak ditampilkan di peluncur
Aplikasi apa pun yang tidak memiliki kotak pintasan aktif pada peluncur.
Aplikasi profil kerja
Semua aplikasi yang diinstal pengguna di profil kerja. Perhatikan bahwa jika aplikasi yang sama juga berada di profil pribadi, hanya aplikasi profil kerja yang dikecualikan.
Pengontrol kebijakan perangkat
Aplikasi yang mengontrol kebijakan perangkat lokal dan aplikasi sistem di perangkat.
Aplikasi dengan hak istimewa operator
Aplikasi apa pun yang dimuat sebelumnya oleh operator ponsel di perangkat dan dianggap perlu untuk kewajiban layanan kontrak, misalnya, pesan suara atau aplikasi layanan pelanggan.
Aplikasi penginstal 3p
App store pihak ketiga yang memberikan update otomatis untuk aplikasi terinstal jika diperlukan.

Pengecualian pengguna dari hibernasi

Jika Anda mengantisipasi bahwa kasus penggunaan inti di aplikasi terpengaruh oleh hibernasi, Anda dapat meminta pengecualian dari hibernasi aplikasi dari pengguna. Pengecualian ini berguna untuk situasi saat pengguna mengharapkan aplikasi Anda berfungsi terutama di latar belakang, bahkan tanpa pengguna berinteraksi dengan aplikasi Anda, seperti saat aplikasi Anda melakukan salah satu hal berikut:

  • Memberikan keamanan bagi keluarga dengan melaporkan lokasi anggota keluarga secara berkala.
  • Menyinkronkan data antara perangkat dan server aplikasi Anda.
  • Berkomunikasi dengan perangkat smart, seperti TV.
  • Menyambungkan ke perangkat pendamping, seperti smartwatch.

Untuk meminta pengecualian, selesaikan langkah-langkah di bagian berikut ini.

Memeriksa apakah pengguna sudah menonaktifkan hibernasi untuk aplikasi Anda

Untuk memeriksa apakah pengguna sudah menonaktifkan hibernasi untuk aplikasi Anda, gunakan getUnusedAppRestrictionsStatus() API.

Untuk mengetahui detail tambahan tentang cara menggunakan API ini di aplikasi Anda, lihat contoh kode API di halaman ini.

Meminta pengguna untuk menonaktifkan hibernasi untuk aplikasi

Jika pengguna belum menonaktifkan hibernasi untuk aplikasi, Anda dapat mengirim permintaan ke pengguna. Untuk melakukannya, selesaikan langkah-langkah berikut:

  1. Tampilkan UI yang menjelaskan kepada pengguna mengapa mereka perlu menonaktifkan hibernasi untuk aplikasi Anda.
  2. Panggil createManageUnusedAppRestrictionsIntent() API, seperti yang ditunjukkan dalam contoh kode API. API ini membuat intent yang memuat layar Info aplikasi di Setelan. Dari sini, pengguna dapat menonaktifkan hibernasi untuk aplikasi Anda.

    Anda harus memanggil startActivityForResult(), bukan startActivity() saat mengirim intent ini.

    Seperti yang ditunjukkan dalam tabel 2, lokasi dan nama opsi bergantung pada karakteristik perangkat tempat aplikasi Anda diinstal:

    Tabel 2. Opsi yang menonaktifkan hibernasi untuk aplikasi Anda
    Karakteristik perangkat Halaman tempat opsi muncul Nama opsi yang akan dinonaktifkan
    Menjalankan Android 13 atau versi yang lebih baru Info aplikasi Jeda aktivitas aplikasi jika tak dipakai
    Menjalankan Android 12 Info aplikasi Hapus izin & kosongkan ruang penyimpanan
    Menjalankan Android 11 Info aplikasi > Izin Hapus izin jika aplikasi tidak digunakan
    Menjalankan Android 6.0 hingga Android 10, inklusif, dan didukung oleh layanan Google Play Aplikasi Play > Menu > Play Protect > Izin untuk Aplikasi yang Tidak Digunakan Hapus izin jika aplikasi tidak digunakan

Contoh kode API

Contoh kode ini menunjukkan cara memeriksa apakah hibernasi diaktifkan untuk aplikasi Anda dan cara yang benar untuk meminta pengguna menonaktifkan hibernasi untuk aplikasi Anda.

Kotlin

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

API platform lama

Sistem operasi juga menyertakan API untuk berinteraksi dengan fitur hibernasi. Namun, API tersebut hanya berfungsi pada perangkat yang menjalankan Android 11 atau yang lebih tinggi, dan tidak menangani fitur hibernasi yang di-backport ke versi Android sebelumnya. Oleh karena itu, kami tidak merekomendasikan penggunaan API tersebut.

Jika Anda perlu terus menggunakan API tersebut untuk sementara demi kompatibilitas, daftar berikut menunjukkan cara menggunakannya:

Memanggil perilaku hibernasi secara manual

Untuk menguji perilaku aplikasi setelah sistem menempatkan aplikasi dalam status hibernasi, selesaikan langkah-langkah berikut:

  1. (Khusus Android 12 dan yang lebih baru) Aktifkan perilaku hibernasi di perangkat Anda:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Tetapkan jumlah waktu tunggu default yang dibutuhkan sistem untuk memasuki hibernasi. Dengan demikian, Anda dapat memulihkannya setelah pengujian:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Kurangi jumlah waktu tunggu yang dibutuhkan sistem. Pada contoh berikut, sistem dimodifikasi sehingga aplikasi Anda hanya memasuki hibernasi satu detik setelah Anda berhenti berinteraksi dengan aplikasi:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Tunggu siaran boot-time selesai di perangkat uji dengan menjalankan perintah berikut:

    adb shell am wait-for-broadcast-idle
    

    Setelah siaran selesai, perintah ini akan menampilkan pesan: All broadcast queues are idle!

  5. Panggil proses hibernasi aplikasi secara manual:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Khusus Android 12 dan yang lebih baru) Pastikan aplikasi memiliki status hibernasi menggunakan salah satu metode berikut:

    • Perhatikan bahwa perangkat pengujian sekarang menampilkan notifikasi, yang menunjukkan bahwa aplikasi yang tidak digunakan mengalami hibernasi.
    • Jalankan perintah berikut:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Pulihkan jumlah waktu tunggu default yang dibutuhkan sistem sebelum menempatkan aplikasi Anda ke dalam hibernasi:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold