Wake lock parsial bermasalah

Penguncian layar saat aktif parsial adalah mekanisme di PowerManager API yang memungkinkan developer untuk menjaga CPU tetap berjalan setelah layar perangkat dinonaktifkan (terlepas dari akibat waktu tunggu sistem atau pengguna menekan tombol daya). Aplikasi Anda melakukan penguncian layar saat aktif parsial dengan memanggil acquire() dengan tanda PARTIAL_WAKE_LOCK. Penguncian layar saat aktif parsial menjadi bermasalah jika ditahan untuk waktu yang lama saat aplikasi sedang berjalan di latar belakang (tidak ada bagian aplikasi yang terlihat oleh pengguna). Kondisi ini menghabiskan baterai perangkat karena mencegah perangkat memasuki status daya yang lebih rendah. Penguncian layar saat aktif parsial sebaiknya hanya digunakan saat diperlukan dan dilepaskan segera setelah tidak diperlukan lagi.

Jika aplikasi memiliki penguncian layar saat aktif parsial bermasalah, Anda dapat menggunakan pedoman di halaman ini untuk mendiagnosis dan memperbaiki masalah.

Mendeteksi masalah

Anda mungkin tidak selalu mengetahui bahwa penguncian layar saat aktif parsial pada aplikasi bermasalah. Jika Anda sudah memublikasikan aplikasi, Android vitals dapat membantu Anda mengetahui masalahnya.

Android vitals

Android vitals dapat membantu meningkatkan performa aplikasi dengan memberi tahu Anda melalui Konsol Play ketika aplikasi menampilkan penguncian layar saat aktif parsial yang bermasalah. Android vitals melaporkan penguncian layar saat aktif parsial sebagai bermasalah saat terjadi setidaknya satu jam, sementara di latar belakang, penguncian layar saat aktif parsial terjadi dalam sesi baterai.

Definisi sesi baterai bergantung pada versi platform.

  • Di Android 10, sesi baterai merupakan gabungan dari semua laporan baterai yang diterima dalam periode 24 jam tertentu. Laporan baterai mengacu pada interval antara dua pengisian daya baterai, baik dari di bawah 20% hingga di atas 80% atau dari tingkat pengisian daya apa pun hingga 100%.
  • Di Android 11, sesi baterai adalah periode tetap selama 24 jam.

Jumlah sesi baterai yang ditampilkan adalah gabungan untuk semua pengguna aplikasi yang diukur. Untuk mengetahui informasi tentang cara Google Play mengumpulkan data Android vitals, lihat dokumentasi Konsol Play.

Setelah Anda mengetahui bahwa aplikasi memiliki penguncian layar saat aktif parsial bermasalah yang berlebihan, langkah berikutnya adalah mengatasi masalah.

Memperbaiki masalah

Penguncian layar saat aktif diperkenalkan pada platform Android versi awal, tetapi seiring waktu, banyak kasus penggunaan yang sebelumnya memerlukan penguncian layar saat aktif sekarang dilayani dengan lebih baik oleh API yang lebih baru seperti WorkManager.

Bagian ini berisi tips untuk memperbaiki penguncian layar saat aktif, tetapi dalam jangka panjang. Pertimbangkan untuk memigrasi aplikasi dengan mengikuti rekomendasi di bagian praktik terbaik.

Identifikasi dan perbaiki tempat dalam kode Anda yang mendapatkan penguncian layar saat aktif, seperti panggilan ke subclass newWakeLock(int, String) atau WakefulBroadcastReceiver. Berikut ini beberapa tips:

  • Sebaiknya sertakan nama paket, class, atau metode di nama tag penguncian layar saat aktif, agar Anda dapat dengan mudah mengidentifikasi lokasi di sumber tempat dibuatnya penguncian layar saat aktif. Berikut ini beberapa tips tambahan:
    • Kosongkan informasi identitas pribadi (PII) dalam nama, seperti alamat email. Jika tidak, perangkat akan mencatat log _UNKNOWN, bukan nama penguncian layar saat aktif.
    • Jangan mendapatkan nama class atau metode secara terprogram, misalnya dengan memanggil getName(), karena dapat diobfuscate oleh Proguard. Sebaiknya gunakan string hard code.
    • Jangan menambahkan penghitung atau ID unik ke tag penguncian layar saat aktif. Sistem tidak dapat menggabungkan penguncian layar saat aktif yang dibuat oleh metode yang sama karena semua memiliki ID unik.
  • Pastikan kode melepaskan semua penguncian layar saat aktif yang diperolehnya. Ini lebih rumit daripada memastikan bahwa setiap panggilan ke acquire() memiliki panggilan yang sesuai ke release(). Berikut ini contoh penguncian layar saat aktif yang tidak dilepaskan karena pengecualian yang tidak direkam:

    Kotlin

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            acquire()
            doSomethingThatThrows()
            release()  // does not run if an exception is thrown
        }
    }

    Java

        void doSomethingAndRelease() throws MyException {
            wakeLock.acquire();
            doSomethingThatThrows();
            wakeLock.release();  // does not run if an exception is thrown
        }

    Berikut ini versi kode yang tepat:

    Kotlin

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            try {
                acquire()
                doSomethingThatThrows()
            } finally {
                release()
            }
        }
    }

    Java

        void doSomethingAndRelease() throws MyException {
            try {
                wakeLock.acquire();
                doSomethingThatThrows();
            } finally {
                wakeLock.release();
            }
        }
  • Pastikan bahwa penguncian layar saat aktif langsung dilepaskan setelah tidak diperlukan lagi. Misalnya, jika Anda menggunakan penguncian layar saat aktif untuk mengizinkan tugas latar belakang diselesaikan, pastikan bahwa pelepasan terjadi langsung saat tugas tersebut selesai. Jika penguncian layar saat aktif ditahan lebih lama dari yang diharapkan tanpa dilepas, ini dapat berarti bahwa tugas latar belakang memerlukan waktu yang lebih lama dari yang diharapkan.

Setelah memperbaiki masalah di kode, verifikasi bahwa aplikasi dengan tepat melepaskan penguncian layar saat aktif dengan menggunakan alat Android berikut:

  • dumpsys - alat yang menyediakan informasi tentang status layanan sistem di perangkat. Untuk melihat status layanan daya, yang mencakup daftar penguncian layar saat aktif, jalankan adb shell dumpsys power.

  • Battery Historian - alat yang menguraikan output laporan bug Android menjadi representasi visual untuk peristiwa terkait daya.

Praktik terbaik

Secara umum, aplikasi harus menghindari penguncian layar saat aktif karena terlalu mudah menghabiskan baterai pengguna. Android menyediakan API alternatif untuk hampir setiap kasus penggunaan yang sebelumnya memerlukan penguncian layar saat aktif parsial. Satu kasus penggunaan yang tersisa untuk penguncian layar saat aktif parsial adalah memastikan bahwa aplikasi musik terus diputar saat layar mati. Jika Anda menggunakan penguncian layar saat aktif untuk menjalankan tugas, pertimbangkan alternatif yang dijelaskan dalam panduan pemrosesan latar belakang.

Jika Anda harus menggunakan penguncian layar saat aktif parsial, ikuti rekomendasi ini:

  • Pastikan beberapa bagian aplikasi tetap berada di latar depan. Misalnya, jika Anda perlu menjalankan layanan, mulai layanan latar depan. Tindakan ini akan memberi tanda visual kepada pengguna bahwa aplikasi masih berjalan.
  • Pastikan logika untuk mendapatkan dan melepaskan penguncian layar saat aktif sesederhana mungkin. Saat logika penguncian layar saat aktif dikaitkan ke mesin yang berstatus kompleks, waktu tunggu, gabungan eksekusi, dan/atau peristiwa callback, bug halus dalam logika tersebut dapat menyebabkan penguncian layar saat aktif ditahan lebih lama daripada yang diharapkan. Bug ini sulit untuk didiagnosis dan didebug.