Ürün Haberleri

Android vitals uyanık kalma kilidi metriğini kullanarak uygulamanızın pil kullanımını optimize etme

Okuma süresi: 7 dakika
Alice Yuan
Geliştirici İlişkileri Mühendisi, Android

Pil ömrü, kullanıcı deneyiminin önemli bir yönüdür ve uyanık kalma kilitleri bu konuda büyük bir rol oynar. Uyanık kalma kilitlerini aşırı mı kullanıyorsunuz? Bu blog yayınında, uyanık kalma kilitlerinin ne olduğunu, bunları kullanmayla ilgili en iyi uygulamaları ve Play Console metriğiyle uygulamanızın davranışını nasıl daha iyi anlayabileceğinizi ele alacağız.

Android Vitals'da aşırı sayıda kısmi uyanık kalma kilidi kullanımı

Play Console artık temel performans göstergesi olarak aşırı sayıda kısmi uyanık kalma kilidi kullanımı üzerinde durarak pilin hızlı tükenmesini izliyor.

Bu özellik, pil verimliliğinin önemini mevcut temel metrik kararlılık göstergeleri (kullanıcı tarafından algılanan aşırı sayıda kilitlenme ve ANR) ile birlikte artırır. Aşırı sayıda uyanık kalma kilidi için kötü davranış eşiği belirledik. 1 Mart 2026'dan itibaren, başlığınız bu kalite eşiğini karşılamıyorsa başlığı öneriler gibi öne çıkan keşif alanlarından hariç tutabiliriz. Bazı durumlarda, uygulamanızın aşırı pilin hızlı tükenmesine neden olabileceğini kullanıcılara bildirmek için mağaza girişinizde bir uyarı gösterebiliriz.

warning.png

Android vitals'a genel bakış bölümündeki aşırı uyanık kalma kilidi uyarısı.

Mobil cihazlarda Android vitals metriği, ekran kapalıyken ve uygulama arka plandayken veya ön plan hizmeti çalıştırırken edinilen, muaf olmayan uyanık kalma kilitleri için geçerlidir. Android vitals, aşağıdaki durumlarda kısmi uyanık kalma kilidi kullanımını aşırı olarak değerlendirir:

  • Uyanık kalma kilitleri, 24 saatlik bir süre içinde en az iki saat boyunca tutulur.
  • 28 günlük ortalamaya göre, uygulamanızın oturumlarının% 5'inden fazlasını etkiliyor.

Seskonum ve JobScheduler kullanıcı tarafından başlatılan API'leri tarafından oluşturulan uyandırma kilitleri, uyandırma kilidi hesaplamasına dahil edilmez.

Uyanık kalma kilitlerini anlama

Uyanık kalma kilidi, kullanıcının cihazla etkin olarak etkileşimde bulunmadığı durumlarda bile uygulamanın cihazın CPU'sunu çalıştırmaya devam etmesini sağlayan bir mekanizmadır. 

Kısmi uyanık kalma kilidi, ekran kapalı olsa bile CPU'nun çalışmaya devam etmesini sağlayarak CPU'nun düşük güç durumuna ("askıya alma") girmesini engeller. Tam uyanık kalma kilidi ise hem ekranın hem de CPU'nun çalışmaya devam etmesini sağlar.

Kısmi uyanık kalma kilitleri 2 yöntemle elde edilir:

  • Uygulama, belirli bir kullanım alanı için PowerManager API'lerini kullanarak uyanık kalma kilidini manuel olarak alır ve serbest bırakır. Bu kilit genellikle kullanıcı tarafından algılanabilen işlemler için tasarlanmış bir platform yaşam döngüsü API'si olan ön plan hizmeti ile birlikte alınır.
  • Alternatif olarak, uyanık kalma kilidi başka bir API tarafından alınır ve API kullanımı nedeniyle uygulamaya atfedilir. Bu konuyla ilgili daha fazla bilgiyi en iyi uygulamalar bölümünde bulabilirsiniz.

Wake lock'lar, kullanıcının başlattığı büyük bir dosyanın indirilmesi gibi görevler için gerekli olsa da aşırı veya uygunsuz kullanımı önemli ölçüde pilin hızlı tükenmesine yol açabilir. Uygulamaların saatlerce wake lock tuttuğu veya bunları düzgün şekilde serbest bırakmadığı, kullanıcının uygulamayla etkileşimde bulunmadığı zamanlarda bile önemli ölçüde pilin hızlı tükenmesiyle ilgili şikayetlere yol açtığı durumlar gördük.

Uyandırma kilidi kullanımıyla ilgili en iyi uygulamalar

Aşırı uyandırma kilidi kullanımında hata ayıklama yöntemlerine geçmeden önce uyandırma kilidiyle ilgili en iyi uygulamaları takip ettiğinizden emin olun. 

Şu dört önemli soruyu göz önünde bulundurun.


1. Alternatif uyanık kalma kilidi seçeneklerini değerlendirdiniz mi?

Manuel kısmi uyanık kalma kilidi edinmeyi düşünmeden önce aşağıdaki karar verme akış şemasını uygulayın:

wakelock.png

Uyanık kalma kilidinin ne zaman manuel olarak alınacağına karar verme akış çizelgesi

  1. Ekranın açık kalması gerekiyor mu?
  2. Uygulama ön plan hizmeti mi çalıştırıyor?
    • Hayır: Uyanık kalma kilidini manuel olarak edinmeniz gerekmez.
  3. Cihazın askıya alınması kullanıcı deneyimine zarar verir mi?
    • Hayır: Örneğin, cihaz uyandıktan sonra bildirimi güncellemek için uyanık kalma kilidi gerekmez.
    • Evet: Cihazın askıya alınmasını önlemek kritikse (ör. harici bir cihazla devam eden iletişim) devam edin.
  4. Cihazı sizin adınıza uyanık tutan bir API var mı?
    • Diğer API'ler tarafından oluşturulan uyandırma kilitlerinin kullanıldığı senaryoları belirlemek için Diğer API'ler tarafından oluşturulan uyandırma kilitlerini belirleme dokümanından yararlanabilirsiniz. Örneğin, LocationManager gibi diğer API'ler tarafından oluşturulan uyandırma kilitlerinin kullanıldığı senaryoları belirleyebilirsiniz.
    • API yoksa son soruya geçin.
  5. Tüm bu soruları yanıtladıysanız ve alternatif olmadığını belirlediyseniz uyanık kalma kilidini manuel olarak edinmeye devam etmeniz gerekir.

2. Uyanık kalma kilidini doğru şekilde adlandırıyor musunuz?

Uyandırma kilitleri manuel olarak edinilirken hata ayıklama için uygun adlandırma önemlidir:

  • E-posta adresleri gibi kimliği tanımlayabilecek bilgileri (PII) adın dışında bırakın. PII algılanırsa uyandırma kilidi _UNKNOWN olarak günlüğe kaydedilir ve hata ayıklama engellenir.
  • Uyanık kalma kilidinizi sınıf veya yöntem adlarını kullanarak programlı bir şekilde adlandırmayın. Bu adlar Proguard gibi araçlarla karartılabilir. Bunun yerine sabit kodlanmış bir dize kullanın.
  • Uyanık kalma kilidi etiketlerine sayaç veya benzersiz tanımlayıcı eklemeyin. Sistemin kullanımı ada göre toplamasına olanak tanımak için uyanık kalma kilidi her çalıştığında aynı etiket kullanılmalıdır. Bu sayede anormal davranışlar daha kolay tespit edilebilir.

3. Edinilen uyanık kalma kilidi her zaman serbest bırakılıyor mu?

Uyanık kalma kilidini manuel olarak alıyorsanız uyanık kalma kilidinin serbest bırakılmasının her zaman yürütüldüğünden emin olun. Uyanık kalma kilidinin serbest bırakılmaması, pilin hızlı tükenmesine neden olabilir. 

Örneğin, processingWork() sırasında yakalanmamış bir istisna oluşturulursa release() çağrısı hiçbir zaman gerçekleşmeyebilir. Bunun yerine, bir istisna oluşsa bile uyanık kalma kilidinin serbest bırakılmasını garanti etmek için bir try-finally bloğu kullanabilirsiniz.

Ayrıca, belirli bir süre sonra serbest bırakılmasını sağlamak ve süresiz olarak tutulmasını önlemek için uyanık kalma kilidine zaman aşımı ekleyebilirsiniz.

fun processingWork() {
    wakeLock.apply {
        try {
            acquire(60 * 10 * 1000) // timeout after 10 minutes
            doTheWork()
        } finally {
            release()
        }
    }
}

4. Uyandırma sıklığını azaltabilir misiniz?

Periyodik veri istekleri için uygulamanızın cihazı uyandırma sıklığını azaltmak, pil optimizasyonu açısından önemlidir. Uyandırma sıklığını azaltmaya ilişkin bazı örnekler:

  • WorkManager: PeriodicWorkRequest'lerdeki periyodik aralığı artırın.
  • SensorManager: İşleyiciyi kaydederken maxReportLatencyMs değerini belirterek toplu işlemden yararlanın.
  • Fused Location Provider:

Daha fazla ayrıntıyı uyandırma kilidiyle ilgili en iyi uygulamalar dokümanında bulabilirsiniz.

Aşırı uyanık kalma kilidi kullanımında hata ayıklama

En iyi niyetlerle bile olsa aşırı uyanık tutma kilidi kullanımı olabilir. Uygulamanız Play Console'da işaretlenirse uygulamanızda hata ayıklamak için aşağıdaki adımları uygulayın:

Play Console ile ilk tanımlama

Android vitals'daki aşırı kısmi uyanık kalma kilidi kontrol panelinde, uygulamanızla ilişkili ve muaf olmayan uyanık kalma kilidi adlarının dökümleri sağlanır. Bu dökümlerde etkilenen oturumlar ve süreler gösterilir. Uyanık kalma kilidi adının uygulama tarafından mı yoksa başka bir API tarafından mı tutulduğunu belirlemek için belgeleri kullanmayı unutmayın.

breakdowns2.png

Aşırı sayıda uyanık kalma kilidi etiketlerini görüntülemek için Android vitals'daki aşırı sayıda kısmi uyanık kalma kilidi kontrol panelinde ayrıntılar bölümüne kaydırıldı.

Çalışanlar/işler tarafından tutulan aşırı sayıda uyanık kalma kilidinde hata ayıklama

Çalışan tarafından tutulan uyandırma kilitlerini şu uyandırma kilidi adıyla tanımlayabilirsiniz:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

Çalışan tarafından tutulan uyanık kalma kilidi adlarının tüm varyasyonlarının listesini belgelerde bulabilirsiniz. Bu uyanık kalma kilitlerinde hata ayıklamak için yerel olarak hata ayıklamak üzere Background Task Inspector'ı kullanabilir veya sahada sorunlarda hata ayıklamak için getStopReason'dan yararlanabilirsiniz. 

Android Studio Arka Plan Görevi Denetleyicisi

taskinspector.png


Sık sık yeniden denenip başarısız olan "WeatherSyncWorker" adlı bir çalışanın tanımlanabildiği Background Task Inspector'ın ekran görüntüsü.

WorkManager sorunlarının yerel olarak hata ayıklanması için bu aracı bir emülatörde veya bağlı cihazda (API düzeyi 26 ve üzeri) kullanın. Bu araç, çalışanların ve durumlarının (tamamlandı, yürütülüyor, sıraya alındı) listesini göstererek ayrıntıları incelemenize ve çalışan zincirlerini anlamanıza olanak tanır. 

Örneğin, bir çalışanın sistem sınırlamalarına ulaşması nedeniyle sık sık başarısız olup yeniden denediğini gösterebilir. 

Daha fazla bilgi için Arka Plan Görevi Denetleyicisi belgelerini inceleyin.

WorkManager getStopReason

Aşırı uyandırma kilidi olan çalışanların sahada hata ayıklaması için WorkManager 2.9.0 sürümü ve sonraki sürümlerde WorkInfo.getStopReason()'ı, JobScheduler için ise SDK 31 ve sonraki sürümlerde kullanılabilen JobParameters.getStopReason()'ı kullanın. 

Bu API, bir çalışanın neden durduğunu (ör.STOP_REASON_TIMEOUTSTOP_REASON_QUOTA) kaydetmeye yardımcı olur. Böylece, çalışma zamanı süresinin dolması nedeniyle sık sık zaman aşımına uğrama gibi sorunlar tespit edilebilir.

backgroundScope.launch {
    WorkManager.getInstance(context)
        .getWorkInfoByIdFlow(workRequest.id)
        .collect { workInfo ->
            logStopReason(workRequest.id, workInfo?.stopReason)
        }
}

Daha fazla bilgi için Görev planlama API'leri için pil kullanımını optimize etme başlıklı makaleyi inceleyin.

Diğer aşırı uyanık kalma kilidi türlerinde hata ayıklama

Uyanık kalma kilitlerinin manuel olarak tutulduğu veya uyanık kalma kilidini tutan API'lerin kullanıldığı daha karmaşık senaryolarda hata ayıklamak için sistem izi toplama özelliğini kullanmanızı öneririz.

Sistem izleme verilerinin toplanması

Sistem izi , bir süre boyunca sistem etkinliğinin ayrıntılı kaydını yakalayan güçlü bir hata ayıklama aracıdır. CPU durumu, iş parçacığı etkinliği, ağ etkinliği ve iş süresi ile uyanık kalma kilidi kullanımı gibi pille ilgili metrikler hakkında analizler sağlar.

Sistem izlemeyi çeşitli yöntemlerle yakalayabilirsiniz: 

powermgmt.png

Perfetto kullanıcı arayüzünde Android uygulamaları ve hizmetleri sekmesinde "power:PowerManagement" Atrace kategorisini etkinleştirin. 

Seçilen yöntemden bağımsız olarak, cihaz durumu izlemelerinin görüntülenmesini sağlamak için "power:PowerManagement" Atrace kategorisini topladığınızdan emin olmanız gerekir. 

Perfetto UI incelemesi ve SQL analizi

Sistem izleri, Perfetto kullanıcı arayüzünde açılıp incelenebilir. İzlemeyi açtığınızda, zaman çizelgesinde çeşitli işlemlerin görselleştirilmiş halini görürsünüz. Bu rehberde odaklanacağımız izler "Cihaz Durumu" bölümündekilerdir.

perfetto.png


"Cihaz durumu" bölümündeki "En çok kullanılan uygulama", "Ekran durumu", "Uzun uyanık tutma kilitleri" ve "İşler" gibi izleri sabitleyerek uzun süren uyanık tutma kiliti dilimlerini görsel olarak belirleyin.

Her blokta etkinliğin adı, başlangıç zamanı ve bitiş zamanı listelenir. Perfetto'da buna dilim adı verilir.

Birden fazla izlemenin ölçeklenebilir analizi için Perfetto'nun SQL analizini kullanabilirsiniz. Bir SQL sorgusu, tüm uyanık tutma kilitlerini süreye göre sıralayarak aşırı kullanıma en çok katkıda bulunanları belirlemeye yardımcı olabilir.

Aşağıda, sistem izlemede gerçekleşen tüm uyanık kalma kilidi etiketlerini toplam süreye göre sıralayarak toplayan bir sorgu örneği verilmiştir:

SELECT slice.name as name, track.name as track_name,SUM(dur / 100000) as total_dur_ms
FROM slice
JOIN track ON slice.track_id = track.id
WHERE track.name = 'WakeLocks'GROUP BY slice.name, track.name
ORDER BY total_dur_ms DESC

Sahada izleme toplama için ProfilingManager'ı kullanma

Yeniden üretilmesi zor sorunlar için ProfilingManager (SDK 35'te eklenmiştir), geliştiricilerin başlangıç ve bitiş tetikleyicileriyle sahada sistem izlemeleri toplamasına olanak tanıyan programatik bir API'dir. Profil toplama için başlangıç ve bitiş tetikleyici noktaları üzerinde daha fazla kontrol sunar ve cihaz performansını etkilemesini önlemek için sistem düzeyinde sıklık sınırlaması uygular. 

Alan sistem izi toplama işleminin nasıl uygulanacağıyla ilgili diğer adımlar için ProfilingManager dokümanlarına göz atın. Bu adımlar arasında programatik olarak izleme yakalama, profil oluşturma verilerini analiz etme ve yerel hata ayıklama komutlarını kullanma yer alır.

ProfilingManager kullanılarak toplanan sistem izleri, manuel olarak toplananlara benzer ancak sistem işlemleri ve diğer uygulama işlemleri izden çıkarılır.

Sonuç

Android vitals'daki aşırı sayıda kısmi uyanık kalma kilidi metriği, geliştiricilerin pilin hızlı tükenmesini azaltmasına ve uygulama kalitesini artırmasına yardımcı olma konusundaki sürekli çabalarımızın yalnızca küçük bir parçasıdır. 

Uyandırma kilitlerini anlayıp doğru şekilde uygulayarak uygulamanızın pil performansını önemli ölçüde optimize edebilirsiniz. Alternatif API'lerden yararlanmak, uyandırma kilidiyle ilgili en iyi uygulamalara uymak ve Background Task Inspector, sistem izleri ve ProfilingManager gibi güçlü hata ayıklama araçlarını kullanmak, uygulamanızın Google Play'deki başarısını sağlamak için çok önemlidir.

Yazan:

Okumaya devam edin