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.
- Ada e-posta adresi gibi kimliği tanımlayabilecek bilgiler (PII) eklemeyin. Aksi takdirde, cihaz uyanık kalma kilidi adı yerine
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 birrelease()
ç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.
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- Donmuş kare
- Sürekli Entegrasyon'da karşılaştırmalar çalıştırma
- Makrobenchmark olmadan Temel Profiller oluşturma ve ölçme