Beberapa library dan API sistem dapat memperoleh kunci tetap aktif yang dapat diatribusikan ke aplikasi Anda. Hal ini dapat mempersulit identifikasi kunci tetap aktif di aplikasi Anda yang mungkin menyebabkan masalah. Jika Anda salah menggunakan API, hal itu dapat menyebabkan aplikasi Anda mempertahankan kunci tetap aktif terlalu lama, meskipun Anda tidak memanggil API kunci tetap aktif secara langsung.
Dalam skenario saat kunci tetap aktif diperoleh oleh API lain, Anda harus menghindari perolehan kunci tetap aktif secara manual.
Dokumen ini mencantumkan beberapa nama kunci tetap aktif umum yang mungkin Anda lihat saat menggunakan alat proses debug kunci tetap aktif. Anda juga dapat melihat nama ini dalam laporan dari vitals. Dalam beberapa kasus, kunci tetap aktif mungkin telah dibuat oleh library atau API sistem. Dalam kasus lain, ada alasan mengapa alat meng-obfuscate nama penguncian layar saat aktif yang Anda gunakan di aplikasi. Anda dapat menggunakan alat debug untuk mengidentifikasi penguncian layar saat aktif yang berperilaku tidak semestinya, lalu menelusuri nama penguncian layar saat aktif dalam dokumen ini untuk mengidentifikasi API mana yang mungkin menyebabkan masalah dan cara menyelesaikannya.
Dokumen ini membahas skenario saat kunci aktif mungkin dibuat. Dalam setiap kasus, meskipun kunci tetap aktif mungkin dibuat oleh library atau API lain, kunci tersebut diatribusikan ke aplikasi yang memanggil API tersebut.
- AlarmManager
- Audio dan media
- Bluetooth
- Sensor Perangkat
- Firebase Cloud Message (FCM)
- JobScheduler
- Lokasi
- WorkManager
_UNKNOWN
: Ditampilkan oleh alat proses debug jika nama kunci tetap aktif tampaknya menggunakan informasi identitas pribadi (PII).
AlarmManager
AlarmManager
mendapatkan penguncian layar saat aktif dan mengatribusikannya ke aplikasi
penelepon. AlarmManager
mendapatkan penguncian layar saat aktif saat alarm berbunyi, dan melepaskan
penguncian saat metode onReceive()
siaran alarm selesai dieksekusi.
Nama penguncian layar saat aktif
AlarmManager
membuat kunci aktif dengan nama *alarm*
. (Tanda bintang adalah bagian dari nama kunci tetap aktif, bukan karakter pengganti.)
Rekomendasi
Sebaiknya lakukan praktik berikut untuk mengoptimalkan perilaku alarm:
- Gunakan
AlarmManager
untuk mengoptimalkan frekuensi penjadwalan alarm. - Gunakan alarm jenis
RTC_WAKEUP
(yang mengaktifkan perangkat) hanya jika diperlukan. - Minimalkan penggunaan alarm, dan hindari melakukan pekerjaan yang panjang dalam metode
onReceive()
.
Audio dan media
API Media dapat memperoleh kunci aktif saat merekam atau memutar audio. Wake lock dikaitkan dengan aplikasi pemanggil.
Nama penguncian layar saat aktif
API Media mendapatkan penguncian layar saat aktif dengan berbagai nama yang diawali dengan Audio
:
AudioBitPerfect
: Digunakan untuk pemutaran audio USB lossless.AudioDirectOut
: Digunakan untuk pemutaran audio lossless di TV atau perangkat khusus.AudioDup
: Digunakan untuk pemutaran notifikasi saat terhubung menggunakan Bluetooth atau USB.AudioIn
: Digunakan untuk merekam audio saat dalam mode camcorder dan mikrofon aktif.AudioMix
: Digunakan untuk pemutaran audio ke perangkat umum.AudioOffload
: Digunakan untuk pemutaran hanya musik jangka panjang, untuk aplikasi yang mendukung mode ini.AudioSpatial
: Digunakan untuk pemutaran audio film atau musik multi-saluran di perangkat yang mendukung audio spasial.AudioUnknown
: Digunakan saat situasi lainnya tidak berlaku.MmapCapture
: Digunakan untuk pengambilan audio latensi rendah.MmapPlayback
: Digunakan untuk pemutaran latensi rendah, seperti untuk game atau untuk aplikasi audio profesional.
Rekomendasi
Sebaiknya lakukan praktik berikut:
- Jangan gunakan nama penguncian layar saat aktif yang diawali dengan
Audio
. - Jika menggunakan media API, Anda tidak perlu mendapatkan kunci tetap aktif secara langsung; Anda dapat mengandalkan API untuk mendapatkan kunci tetap aktif yang diperlukan untuk Anda.
- Saat Anda menggunakan API media, akhiri sesi media jika Anda tidak lagi memerlukannya.
Bluetooth
API Bluetooth platform tidak menahan kunci aktif yang dapat diatribusikan ke aplikasi saat tindakan Bluetooth terjadi. Untuk membantu memverifikasi bahwa transportasi Bluetooth terjadi di latar belakang, jadwalkan tugas menggunakan WorkManager.
Rekomendasi
- Gunakan penyambungan Perangkat Pendamping untuk menyambungkan perangkat Bluetooth agar tidak mendapatkan kunci tetap aktif manual selama penyambungan Bluetooth.
- Lihat panduan berkomunikasi di latar belakang untuk memahami cara melakukan komunikasi Bluetooth di latar belakang.
- Jika kunci tetap aktif manual dianggap perlu, hanya tahan kunci tetap aktif selama durasi tindakan Bluetooth.
Sensor Perangkat
Ada beberapa metode untuk melacak data sensor perangkat seperti jumlah langkah, data akselerometer atau giroskop.
Di Wear OS, gunakan Wear Health Services untuk mengambil data perangkat seperti ketinggian, detak jantung, dan jarak yang ditempuh.
Jika data dikumpulkan oleh aplikasi lain, Anda dapat menggunakan Health Connect yang dikombinasikan dengan WorkManager untuk mengambil data.
Untuk skenario seperti melacak selisih langkah atau jarak yang ditempuh, Anda dapat menggunakan Recording API di perangkat seluler yang dikombinasikan dengan WorkManager untuk mengambil data.
Dalam situasi tertentu, pelacakan sensor perangkat kustom mungkin diperlukan menggunakan
SensorManager
. SensorManager
tidak mendapatkan
wake lock atas nama aplikasi, kecuali jika sensor adalah sensor aktif, yang dapat diidentifikasi menggunakan API isWakeUpSensor
.
Rekomendasi
Menggunakan sensor untuk merekam pada kecepatan pengambilan sampel yang tinggi dapat menghabiskan daya baterai secara signifikan. Berikut rekomendasi untuk mengurangi pengurasan baterai dan penggunaan kunci tetap aktif:
- Jika melacak jumlah langkah atau jarak yang ditempuh, gunakan Recording API untuk merekam data secara efisien baterai.
- Untuk pelacakan sensor pasif di Wear OS, gunakan Fitur Kesehatan Wear untuk mengoptimalkan penggunaan baterai.
- Kurangi frekuensi sensor Anda menjadi kurang dari 200 Hz.
- Saat mendaftarkan sensor dengan
SensorManager
, tentukanmaxReportLatencyUs
lebih dari 30 detik untuk menggunakan logika pengelompokan sensor dan mengurangi jumlah interupsi yang diterima aplikasi. - Hindari penahanan kunci terus aktif yang lama selama durasi penuh pelacakan sensor, tetapi jadwalkan alarm menggunakan AlarmManager untuk melakukan polling data sensor setiap 30+ detik.
Firebase Cloud Message (FCM)
Wake lock diperoleh saat mengirimkan siaran
Firebase Cloud Message (FCM) ke aplikasi.
Wake lock dilepaskan setelah metode siaran FCM
onMessageReceived()
selesai dieksekusi.
Nama penguncian layar saat aktif
Penguncian layar saat aktif diperoleh dengan nama GOOGLE_C2DM
.
Rekomendasi
Sebaiknya lakukan praktik berikut untuk mengoptimalkan perilaku FCM:
- Mengoptimalkan frekuensi pengiriman FCM.
- Jangan gunakan FCM prioritas tinggi kecuali jika pesan benar-benar perlu dikirimkan segera.
- Selesaikan metode
onMessageReceived()
secepat mungkin. Lihat panduan Firebase untuk mengetahui informasi selengkapnya.
JobScheduler
Tugas JobScheduler mendapatkan wake lock saat menjalankan tugas di latar belakang. Wake lock diatribusikan ke aplikasi yang membuat pekerja.
Nama penguncian layar saat aktif
Nama kunci tetap aktif yang diperoleh oleh JobScheduler bergantung pada versi sistem Android yang dijalankannya, dan tujuan tugas.
Item yang diapit tanda kurung sudut adalah variabel. Misalnya,
"<package_name>" adalah nama paket aplikasi Anda, bukan
teks literal <package name>
. Namun, *job*
adalah urutan karakter
*job*
, dengan tanda bintang; tanda bintang tidak digunakan sebagai karakter pengganti.
Android 15 dan yang lebih lama
Tugas yang dimulai pengguna membuat kunci aktif dengan nama yang mengikuti pola ini:
*job*u/@<name_space>@/<package_name>/<classname>
Tugas lain menggunakan pola ini:
*job*/@<name_space>@/<package_name>/<classname>
Android 16 dan yang lebih baru
Tugas yang dimulai pengguna membuat kunci tetap aktif dengan nama yang mengikuti pola ini:
*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Tugas yang diprioritaskan menggunakan pola ini:
*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Tugas reguler menggunakan pola ini:
*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Contoh
Misalkan ada tugas yang dipercepat dengan namespace backup
dan tag
pelacakan started
. Nama paketnya adalah com.example.app
, dan class yang
membuat tugas adalah com.backup.BackupFileService
.
Di perangkat yang menjalankan Android 15 atau yang lebih rendah, kunci tetap aktif akan diberi nama:
*job*/@backup@/com.example.app/com.backup.BackupFileService
Pada perangkat yang menjalankan Android 16 atau yang lebih tinggi, kunci tetap aktif akan diberi nama:
*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService
Rekomendasi
Audit penggunaan tugas JobScheduler Anda. Khususnya, ikuti panduan kami untuk mengoptimalkan penggunaan baterai untuk API penjadwalan tugas.
Lokasi
LocationManager
dan FusedLocationProviderClient
menggunakan
kunci tetap aktif untuk mendapatkan dan mengirimkan lokasi perangkat. Wake lock
dikaitkan dengan aplikasi yang memanggil API tersebut.
Nama penguncian layar saat aktif
Layanan lokasi menggunakan nama berikut:
CollectionLib-SigCollector
NetworkLocationLocator
NetworkLocationScanner
NlpCollectorWakeLock
NlpWakeLock
*location*
Rekomendasi
- Mengoptimalkan penggunaan lokasi. Misalnya, tetapkan waktu tunggu, gabungkan permintaan lokasi, atau gunakan update lokasi pasif.
- Jika menggunakan API lokasi, Anda tidak perlu mendapatkan kunci tetap aktif secara langsung; Anda dapat mengandalkan API untuk mendapatkan kunci tetap aktif yang diperlukan untuk Anda.
WorkManager
Pekerja WorkManager mendapatkan kunci tetap aktif saat menjalankan tugas di latar belakang. Wake lock diatribusikan ke aplikasi yang membuat pekerja.
Nama penguncian layar saat aktif
Nama kunci tetap aktif yang diperoleh oleh WorkManager bergantung pada versi sistem Android yang dijalankannya.
Android 15 dan yang lebih lama
Tugas WorkManager membuat kunci aktivasi dengan nama yang mengikuti pola ini:
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 dan yang lebih baru
Tugas yang diprioritaskan membuat kunci wake dengan nama yang mengikuti pola ini:
*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Tugas reguler mengikuti pola ini:
*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Secara default, <trace_tag>
adalah nama pekerja.
Contoh
Misalkan ada pekerja yang dipercepat bernama BackupFileWorker
. Nama paketnya
adalah com.example.app
.
Di perangkat yang menjalankan Android 15 atau yang lebih rendah, kunci tetap aktif akan diberi nama:
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
Di perangkat yang menjalankan Android 16 atau yang lebih tinggi dan menggunakan WorkManager 2.10.0+
,
wake lock akan diberi nama:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
Rekomendasi
- Upgrade versi WorkManager Anda agar tag kunci tetap aktif lebih verbose di Android 16 atau yang lebih tinggi.
- Audit penggunaan pekerja WorkManager Anda. Khususnya, ikuti panduan kami untuk mengoptimalkan penggunaan baterai untuk API penjadwalan tugas.
_UNKNOWN
Jika alat proses debug menganggap nama penguncian layar saat aktif berisi informasi identitas pribadi (PII), alat tersebut tidak akan menampilkan nama penguncian layar saat aktif yang sebenarnya. Sebagai gantinya, mereka
melabeli kunci aktif sebagai _UNKNOWN
. Misalnya, alat dapat melakukan hal ini jika nama kunci
layar berisi alamat email.
Rekomendasi
Ikuti praktik terbaik penamaan penguncian layar saat aktif, dan hindari penggunaan PII dalam nama penguncian layar saat aktif. Jika Anda menemukan kunci tetap aktif bernama _UNKNOWN
yang dikaitkan dengan aplikasi Anda, coba
identifikasi kunci tetap aktif tersebut, dan beri nama yang berbeda.