Takılı kalan kısmi uyanık kalma kilitleri

Kısmi uyanık kalma kilitleri, PowerManager API'de bulunan ve geliştiricilerin cihaz ekranı kapandıktan sonra CPU'nun çalışmaya devam etmesini sağlayan bir mekanizmadır (sistem zaman aşımı veya kullanıcının güç düğmesine basmasından dolayı). Uygulamanız, PARTIAL_WAKE_LOCK işaretli acquire() yöntemini çağırarak kısmi bir uyanık kalma kilidi alır. Kısmi bir uyanık kalma kilidi, uygulamanız arka planda çalışırken uzun süre tutulursa (uygulamanızın hiçbir bölümü kullanıcı tarafından görülemez) takılır. Bu durum, cihazın daha düşük güç durumlarına girmesini engellediği için cihaz pilini bitirir. Kısmi uyanık kalma kilitleri yalnızca gerektiğinde kullanılmalı ve artık ihtiyaç duyulmadığında kısa süre içinde serbest bırakılmalıdır.

Uygulamanızda kısmi uyanık kalma kilidi takılıysa sorunu teşhis edip düzeltmek için bu sayfadaki kılavuzu kullanabilirsiniz.

Sorunu tespit edin

Uygulamanızın kısmi uyanık kalma kilitlerinin takılı kaldığını her zaman fark edemeyebilirsiniz. Uygulamanızı daha önce yayınladıysanız Android vitals sorundan haberdar olmanıza yardımcı olabilir.

Android vitals

Android vitals, uygulamanız takılı kalan kısmi uyanık kalma kilitleri gösterdiğinde Play Console aracılığıyla sizi uyararak uygulamanızın performansının iyileştirilmesine yardımcı olabilir. Android vitals, kısmi uyanık kalma kilitlerini en az bir saat boyunca takılıp kaldığında bildirirken arka planda kısmi uyanık kalma kilidi pil oturumunda gerçekleşir.

Pil oturumunun tanımı, platform sürümüne bağlıdır.

  • Android 10'da pil oturumu, belirli bir 24 saatlik süre içinde alınan tüm pil raporlarının toplamıdır. Pil raporu, %20'nin altından% 80'in üstüne veya herhangi bir şarj seviyesinin %100'e kadarki iki pil şarjı arasındaki aralığı ifade eder.
  • Android 11'de pil oturumu, 24 saatlik sabit bir süredir.

Gösterilen pil oturumu sayısı, uygulamanın ölçülen tüm kullanıcıları için toplu olarak gösterilir. Google Play'in Android vitals verilerini nasıl topladığı hakkında bilgi için Play Console dokümanlarına bakın.

Uygulamanızda aşırı sayıda kısmi uyanık kalma kilidi olduğunu fark ettiğinizde bir sonraki adımınız sorunu gidermektir.

Sorunu çöz

Uyanık kalma kilitleri, Android platformunun ilk sürümlerinde kullanıma sunulmuştur ancak zaman içinde, önceden uyanık kalma kilitlerinin kullanılmasını gerektiren birçok kullanım alanı artık WorkManager gibi yeni API'ler tarafından daha iyi hizmet vermektedir.

Bu bölümde, uyanık kalma kilitlerinizi düzeltmeyle ilgili ipuçları yer almaktadır. Ancak uzun vadede, en iyi uygulamalar bölümündeki önerileri uygulamak için uygulamanızı taşımayı düşünebilirsiniz.

Kodunuzda uyanık kalma kilidi alan yerleri (ör. newWakeLock(int, String) veya WakefulBroadcastReceiver alt sınıflarına yapılan çağrılar) belirleyip düzeltin. Aşağıda bazı ipuçlarını görebilirsiniz:

  • Paketinizin, sınıfınızın veya yönteminizin adını uyanık kalma kilidi etiketinin adına eklemenizi öneririz. Böylece, kaynağınızda uyanık kalma kilidinin oluşturulduğu konumu kolayca bulabilirsiniz. Aşağıda bazı ek ipuçları verilmiştir:
    • Ada e-posta adresi gibi kimliği tanımlayabilecek bilgiler (PII) eklemeyin. Aksi takdirde, cihaz uyanık kalma kilidi adı yerine _UNKNOWN işlemini günlüğe kaydeder.
    • Sınıf veya yöntem adını programatik olarak almayın (örneğin, getName() yöntemini çağırarak adı ProGuard tarafından kod karartılabilir). Bunun yerine sabit kodlanmış bir dize kullanın.
    • uyanık kalma kilidi etiketlerini kullanmak için sayaç veya benzersiz tanımlayıcı eklemeyin. Hepsi benzersiz tanımlayıcılara sahip olduğundan sistem, aynı yöntem tarafından oluşturulan uyanık kalma kilitlerini toplayamaz.
  • Kodunuzun aldığı tüm uyanık kalma kilitlerini serbest bıraktığından emin olun. Bu işlem, her acquire() çağrısına karşılık gelen bir release() çağrısı olmasını sağlamaktan daha karmaşıktır. Yakalanmamış bir istisna nedeniyle serbest bırakılmayan bir uyanık kalma kilidi örneğini burada görebilirsiniz:

    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
        }

    Kodun doğru sürümü şu şekildedir:

    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();
            }
        }
  • Uyanık kalma kilitlerinin artık ihtiyaç duyulmadığı anda serbest bırakıldığından emin olun. Örneğin, arka plandaki bir görevin tamamlanmasına izin vermek için uyanık kalma kilidi kullanıyorsanız bırakmanın söz konusu görev tamamlandığında gerçekleştiğinden emin olun. Uyanık kalma kilidi açılmadan beklenenden daha uzun süre tutulursa bu durum, arka plan görevinizin beklenenden daha fazla zaman aldığı anlamına gelebilir.

Koddaki sorunu düzelttikten sonra, aşağıdaki Android araçlarını kullanarak uygulamanızın uyanık kalma kilitlerini doğru şekilde yayınladığını doğrulayın:

  • dumpsys - bir cihazdaki sistem hizmetlerinin durumu hakkında bilgi sağlayan bir araçtır. Uyanık kalma kilitlerinin listesini de içeren güç hizmetinin durumunu görmek için adb shell dumpsys power komutunu çalıştırın.

  • Pil Geçmişi: Android hata raporunun çıkışını güçle ilgili etkinliklerin görsel bir temsili olarak ayrıştıran bir araçtır.

En iyi uygulamalar

Genel olarak, kullanıcının pilini bitirmesi çok kolay olduğundan uygulamanız kısmi uyanık kalma kilitlerinden kaçınmalıdır. Android, önceden kısmi uyanık kalma kilidi gerektiren neredeyse her kullanım alanı için alternatif API'ler sağlar. Kısmi uyanık kalma kilitleri için diğer bir kullanım alanı da ekran kapalıyken müzik uygulamasının çalmaya devam etmesini sağlamaktır. Görevleri çalıştırmak için uyanık kalma kilitlerini kullanıyorsanız arka planda işleme kılavuzunda açıklanan alternatifleri kullanmayı düşünün.

Kısmi uyanık kalma kilitleri kullanmanız gerekiyorsa aşağıdaki önerileri uygulayın:

  • Uygulamanızın bir bölümünün ön planda kaldığından emin olun. Örneğin, bir hizmeti çalıştırmanız gerekiyorsa bunun yerine ön plan hizmeti başlatın. Bu, görsel olarak kullanıcıya uygulamanızın hâlâ çalıştığını gösterir.
  • Uyanık kalma kilitlerini edinme ve bırakma mantığının mümkün olduğunca basit olduğundan emin olun. Uyanık kalma kilidi mantığınız karmaşık durum makinelerine, zaman aşımlarına, yürütme havuzlarına ve/veya geri çağırma etkinliklerine bağlı olduğunda bu mantıktaki küçük hatalar, uyanık kalma kilidinin beklenenden daha uzun süre tutulmasına neden olabilir. Bu hataların teşhisi ve hata ayıklaması zordur.