Uyandırma kilidi kullanım alanlarını belirleme ve optimize etme

Bu doküman, uygulamanızdaki uyanık kalma kilidi kullanım alanlarını belirleyip optimize etmenize yardımcı olur. Ayrıca, bu kullanım alanıyla ilişkili diğer kitaplıklar veya sistem API'leri tarafından alınan uyanık kalma kilitleri olup olmadığını vurgular. Bu uyanık kalma kilitleri uygulamanızla ilişkilendirilebildiğinden, sorunlu bir uyanık kalma kilidinin kaynağını belirlemek zor olabilir. API'nin yanlış kullanımı, uyanık kalma kilitlerini açıkça edinmiyor olsanız bile uygulamanızın aşırı uyanık kalma kilidi kullanımı nedeniyle işaretlenmesine neden olabilir.

Bu dokümanda, uyanık kalma kilidi hata ayıklama araçlarını kullanırken veya vitals raporlarında karşılaşabileceğiniz bazı yaygın uyanık kalma kilidi adları listelenmiştir. Bu adlar bir kitaplıktan veya sistem API'sinden gelebilir ya da gizlenmiş olabilir. Hatalı uyanık kalma kilitlerini belirlemek için hata ayıklama araçlarını kullanıp ardından bu dokümanda uyanık kalma kilidi adını arayarak hangi API'nin soruna neden olabileceğini belirleyebilir ve kullanımını optimize etmeyle ilgili öneriler bulabilirsiniz.

Bu dokümanda, uyanık kalma kilitlerini edinmeyle ilgili yaygın kullanım alanları açıklanmakta, çeşitli API'ler ve kitaplıklar tarafından kullanılan uyanık kalma kilidi adları ayrıntılı olarak ele alınmakta ve uyanık kalma kilidi kullanımını optimize edip azaltmaya yönelik öneriler ve en iyi uygulamalar sunulmaktadır.

AlarmManager

AlarmManager, uyanık kalma kilitleri alır ve bunları arama uygulamasıyla ilişkilendirir. AlarmManager, alarm çaldığında uyanık kalma kilidini alır ve alarm yayınının onReceive() yöntemi yürütmeyi tamamladığında kilidi kaldırır.

Uyanık kalma kilidi adları

AlarmManager, *alarm* adıyla uyanık kalma kilitleri oluşturuyor. (Yıldız işaretleri, uyanık kalma kilidi adının bir parçasıdır, joker karakterleri temsil etmez.)

Öneri

Alarm davranışını optimize etmek için aşağıdaki uygulamaları öneririz:

  • Yaklaşık zamanlı veya kesin zamanlı alarm arasında karar vermek için alarm türünü seçme bölümüne bakın. Alarmınızın hassas olması gerekmiyorsa yaklaşık alarmlar kullanarak sisteme planlama konusunda daha fazla esneklik tanıyın. Bu sayede pil ömrünü uzatabilirsiniz.
  • Sistem tarafından uygulanan alarm kotalarına dikkat edin ve uygulamanızı bu kotalara uyacak şekilde tasarlayın.
  • onReceive() yönteminde uzun süreli işlemler yapmaktan kaçının ve alarmdan sonra ek işlem yapılması gerekiyorsa çalışanları planlayın.

Ses ve medya

Medya API'leri, ses kaydederken veya oynatırken uyanık kalma kilitleri alabilir. Uyanık kalma kilitleri, arama uygulamasıyla ilişkilendirilir.

Uyanık kalma kilidi adları

Medya API'leri, Audio ile başlayan çeşitli adlarla uyanık kalma kilitleri alır:

  • AudioBitPerfect: Kayıpsız USB ses çalma için kullanılır.
  • AudioDirectOut: TV'de veya özel bir cihazda kayıpsız ses çalma için kullanılır.
  • AudioDup: Bluetooth veya USB ile bağlıyken bildirimleri oynatmak için kullanılır.
  • AudioIn: Mikrofon etkinken video kamera modunda ses kaydı için kullanılır.
  • AudioMix: Ortak bir cihazda ses çalmak için kullanılır.
  • AudioOffload: Bu modu destekleyen uygulamalarda uzun süreli müzik çalma için kullanılır.
  • AudioSpatial: Üç boyutlu ses özelliğini destekleyen cihazlarda çok kanallı film veya müzik seslerini oynatmak için kullanılır.
  • AudioUnknown: Diğer durumlar geçerli olmadığında kullanılır.
  • MmapCapture: Düşük gecikmeli ses kaydı için kullanılır.
  • MmapPlayback: Oyun veya profesyonel ses uygulamaları gibi düşük gecikmeli oynatma için kullanılır.

Öneri

Aşağıdaki uygulamaları öneririz:

  • Audio ile başlayan uyanık kalma kilidi adları tanımlamayın.
  • Medya API'lerini kullanıyorsanız uyanık kalma kilitlerini doğrudan edinmeniz gerekmez. Gerekli uyanık kalma kilitlerini sizin için edinmek üzere API'leri kullanabilirsiniz.
  • Medya API'lerini kullanırken artık ihtiyacınız kalmadığında medya oturumunu ve ilişkili ön plan hizmetini sonlandırın.

Bluetooth

Platform Bluetooth API'leri, Bluetooth işlemleri gerçekleşirken genellikle çekirdek uyanık kalma kilitlerini tutar. Bu kilitler uygulamayla ilişkilendirilemez.

Öneri

  • Bluetooth eşleme sırasında manuel uyanık kalma kilidi edinmekten kaçınmak için Bluetooth cihazları eşlemek üzere yardımcı cihaz eşleştirmeyi kullanın.
  • Arka planda Bluetooth iletişiminin nasıl yapılacağını anlamak için arka planda iletişim kurma kılavuzuna bakın.
  • Gecikmeli iletişimin kullanıcı üzerinde bir etkisi yoksa genellikle WorkManager kullanmak yeterlidir. Manuel uyanık kalma kilidi gerekli görülürse uyanık kalma kilidini yalnızca Bluetooth etkinliği veya etkinlik verilerinin işlenmesi süresince etkin tutun.

Cihaz Sensörleri

Adım sayısı, ivme ölçer veya jiroskop verileri gibi cihaz sensör verilerini izlemenin birkaç yöntemi vardır.

Wear OS'te, rakım, nabız ve kat edilen mesafe gibi cihaz verilerini almak için Wear Sağlık Hizmetleri'ni kullanın.

Veriler başka uygulamalar tarafından toplanıyorsa verileri düzenli olarak almak için WorkManager ile birlikte Health Connect'i kullanabilirsiniz.

Adım sayısındaki veya kat edilen mesafedeki farkı izleme gibi senaryolarda, verileri düzenli olarak almak için WorkManager ile birlikte mobil cihazlarda Recording API'yi kullanabilirsiniz. Health Connect, geçmiş adım verilerine (ör. günlük toplam adım sayısı veya son 6 saatteki adım sayısı) erişmek için Android 14 veya sonraki sürümleri çalıştıran cihazlarda cihaz üzerinde adım takibini de destekler.

Bazı durumlarda, SensorManager kullanılarak özel cihaz sensörü izleme gerekebilir. SensorManager, sensör bir uyandırma sensörü olmadığı sürece uygulama adına uyanık kalma kilitleri edinmez. Uyandırma sensörleri, isWakeUpSensor API'si kullanılarak tanımlanabilir.

Öneri

Yüksek örnekleme hızlarında kayıt yapmak için sensörlerin kullanılması pilin önemli ölçüde tükenmesine neden olabilir. Pil tüketimini ve uyanık kalma kilidi kullanımını azaltmak için aşağıdaki önerileri uygulayabilirsiniz:

  • Adım sayısını veya kat edilen mesafeyi izliyorsanız verileri pil tasarrufu sağlayacak şekilde kaydetmek için Recording API'yi kullanın. Android 14 veya sonraki sürümlerin yüklü olduğu cihazlarda geçmiş cihaz verilerine ve toplam adım sayısına erişmek için Health Connect'i kullanabilirsiniz.
  • Wear OS'te pasif sensör takibi için Wear Sağlık Hizmetleri'ni kullanarak pil kullanımını optimize edin.
  • SensorManager ile bir sensör kaydederken sensör toplu işleme mantığını kullanmak ve uygulamanın aldığı kesinti sayısını azaltmak için 30 saniyeden uzun bir maxReportLatencyUs tanımlayın. Cihaz daha sonra kullanıcı etkileşimi, konum alma veya planlanmış bir iş gibi başka bir tetikleyici tarafından uyandırıldığında sistem, önbelleğe alınmış sensör verilerini hemen gönderir.
  • Uygulamanız hem konum hem de sensör verileri gerektiriyorsa etkinlik alma ve işleme işlemlerini senkronize edin. Sensör okumalarını, sistemin konum güncellemeleri için tuttuğu kısa uyanık kalma kilidinde birleştirerek CPU'yu uyanık tutmak için uyanık kalma kilidine ihtiyaç duymazsınız. Bu birleştirilmiş verilerin yüklenmesini ve işlenmesini yönetmek için bir çalışan veya kısa süreli uyanık kalma kilidi kullanın.

Firebase Cloud Messaging (FCM)

Uygulamaya bir Firebase Cloud Messaging (FCM) yayını gönderilirken uyanık kalma kilidi alınır. FCM yayını onMessageReceived() yönteminin yürütülmesi tamamlandığında uyanık kalma kilidi serbest bırakılır.

Uyanık kalma kilidi adları

Cihazda bir FCM mesajı alındığında GOOGLE_C2DM adıyla kısa bir uyanık kalma kilidi tutulur. Android 16 ve sonraki sürümlerde uyanık kalma kilidinin adı GCM_MESSAGE olur.

Öneri

FCM davranışını optimize etmek için aşağıdaki uygulamaları öneririz:

  • FCM teslimat sıklığını optimize edin.
  • Mesajın hemen teslim edilmesi gerekmiyorsa yüksek öncelikli FCM kullanmayın.
  • onMessageReceived() yönteminin mümkün olduğunca hızlı bir şekilde tamamlanmasını sağlayın veya ek işlem gerekiyorsa göreve devam etmek için bir çalışan planlayın. Daha fazla bilgi için Firebase kılavuzuna bakın.

JobScheduler

JobScheduler işleri, arka planda görevleri yürütürken uyanık kalma kilitleri alır. Uyanık kalma kilitleri, çalışanları oluşturan uygulamayla ilişkilendirilir.

Uyanık kalma kilidi adları

JobScheduler tarafından alınan uyanık kalma kilidi adları, çalıştıkları Android sisteminin sürümüne ve işin amacına bağlıdır.

Açılı ayraçlarla çevrili öğeler değişkendir. Örneğin, "<package_name>" uygulamanızın paketinin adıdır, <package name> metni değildir. Ancak *job*, yıldız işaretleriyle birlikte *job* karakter dizisidir. Yıldız işaretleri joker karakter olarak kullanılmaz.

Android 15 ve önceki sürümler

Kullanıcı tarafından başlatılan işler, aşağıdaki kalıba uygun adlarla uyanık kalma kilitleri oluşturur:

*job*u/@<name_space>@/<package_name>/<classname>

Diğer işlerde bu kalıp kullanılır:

*job*/@<name_space>@/<package_name>/<classname>
Android 16 QPR2 ve sonraki sürümler

Kullanıcı tarafından başlatılan işler, şu kalıba uygun adlarla uyanık kalma kilitleri oluşturur:

*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Yüksek öncelikli işler şu kalıbı kullanır:

*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Normal işler şu kalıbı kullanır:

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Örnek

backup ad alanına ve started izleme etiketine sahip yüksek öncelikli bir iş olduğunu varsayalım. Paket adı com.example.app, işi oluşturan sınıf ise com.backup.BackupFileService.

Android 15 veya daha eski sürümlerin yüklü olduğu cihazlarda uyanık kalma kilidi şu şekilde adlandırılır:

*job*/@backup@/com.example.app/com.backup.BackupFileService

Android 16 QPR2 veya sonraki sürümlerin yüklü olduğu cihazlarda uyanık kalma kilidi şu şekilde adlandırılır:

*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService

Öneri

  • Kullanıcı tarafından başlatılan indirme/ yükleme kullanım alanları için manuel uyanık kalma kilidi edinmeyin. Bunun yerine Kullanıcı Tarafından Başlatılan Veri Aktarımı (UIDT) API'yi kullanın. Bu, kullanıcı tarafından başlatılan uzun süreli veri aktarımı görevleri için belirlenen yoldur.
  • JobScheduler tarafından oluşturulan uyanık kalma kilitlerinin kullanımının yüksek olduğunu tespit ederseniz bunun nedeni, işinizi belirli senaryolarda tamamlanmayacak şekilde yanlış yapılandırmış olmanız olabilir. Özellikle STOP_REASON_TIMEOUT ile sık sık karşılaşıyorsanız işlerin durdurulma nedenlerini analiz etmenizi öneririz.
  • JobScheduler görevlerini kullanımınızı denetleyin. Özellikle görev planlama API'leri için pil kullanımını optimize etme ile ilgili kılavuzumuzu inceleyin.

Konum

LocationManager ve FusedLocationProviderClient, cihazın konumunu almak ve iletmek için uyanık kalma kilitlerini kullanır. Uyanık kalma kilitleri, bu API'leri çağıran uygulamayla ilişkilendirilir.

Uyanık kalma kilidi adları

Konum hizmetleri aşağıdaki adları kullanır:

  • CollectionLib-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *location*

Öneri

  • Konum kullanımını optimize etme ile ilgili kılavuzumuzu inceleyin. Zaman aşımları uygulayabilir, konum isteği gruplandırmadan yararlanabilir veya pasif konum güncellemelerini kullanabilirsiniz.
  • Konum verilerini önbelleğe almak için ayrı ve sürekli bir uyanık kalma kilidi edinmekten kaçının. Bu gereksizdir ve kaldırılmalıdır. FusedLocationProvider veya LocationManager API'lerini kullanarak konum güncellemeleri istenirken sistem, konum etkinliği geri çağırma işlemi sırasında cihazı otomatik olarak uyandırır. Bunun yerine, konum etkinliklerini bellekte veya depolama alanında saklayın ve WorkManager kullanarak konum etkinliklerini düzenli olarak işleyin.

Uzaktan Mesajlaşma

Bu bölümde, uygulamaların bağlantıları sürdürmesi veya diğer cihazlardaki etkinliklere tepki vermesi gerekebilecek ve uyanık kalma kilidi kullanımını etkileyebilecek uzaktan mesajlaşma senaryoları ele alınmaktadır. Yaygın kullanım alanları şunlardır:

  • Yerel ağ üzerinden bağlı harici bir cihazda gerçekleşen etkinlikleri izlemesi gereken video veya ses izleme tamamlayıcı uygulamaları.
  • Masaüstü varyantıyla ağ soketi bağlantısı sürdüren mesajlaşma uygulamaları

Bu uzaktan mesajlaşma senaryolarındaki uyandırmaların çoğu çekirdek uyanık kalma kilitleridir. Çekirdek uyanık kalma kilitleri uygulamayla ilişkilendirilmediğinden burada listelenecek ilişkili uyanık kalma kilidi adı yoktur.

Öneri

  • Ağ etkinlikleri sunucu tarafında işlenebiliyorsa istemciyle ilgili bilgi almak için FCM'yi kullanın. FCM verilerinin ek işleme tabi tutulması gerekiyorsa hızlandırılmış çalışan planlamayı seçebilirsiniz.
  • Etkinliklerin istemci tarafında bir soket bağlantısı kullanılarak işlenmesi gerekiyorsa etkinlik kesintilerini dinlemek için uyanık kalma kilidi gerekmez. Veri paketleri kablosuz ağa veya telefon radyosuna ulaştığında radyo donanımı, çekirdek uyanık kalma kilidi biçiminde bir kesinti tetikler. Ardından, verileri işlemek için bir çalışan planlamayı veya uyanık kalma kilidi edinmeyi seçebilirsiniz.
  • Örneğin, bir ağ soketindeki veri paketlerini dinlemek için ktor-network kullanıyorsanız yalnızca paketler istemciye teslim edildiğinde uyanık kalma kilidi edinmeniz gerekir.

WorkManager

WorkManager çalışanları, arka planda görevleri yürütürken uyanık kalma kilitleri alır. Uyanık kalma kilitleri, çalışanları oluşturan uygulamayla ilişkilendirilir.

Uyanık kalma kilidi adları

WorkManager tarafından alınan uyanık kalma kilidi adları, çalıştıkları Android sisteminin sürümüne bağlıdır.

Android 15 ve önceki sürümler

WorkManager görevleri, aşağıdaki kalıba uygun adlara sahip uyanık kalma kilitleri oluşturur:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 QPR2 ve sonraki sürümler

Hızlandırılmış görevler, aşağıdaki kalıba uygun adlara sahip uyanık kalma kilitleri oluşturur:

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

Normal görevler şu kalıbı izler:

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

Varsayılan olarak çalışan adı <trace_tag> şeklindedir.

Örnek

BackupFileWorker adında bir hızlandırılmış çalışan olduğunu varsayalım. Paket adı com.example.app.

Android 15 veya daha eski sürümlerin yüklü olduğu cihazlarda uyanık kalma kilidi şu şekilde adlandırılır:

*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Android 16 QPR2 veya sonraki sürümleri çalıştıran ve WorkManager 2.10.0+ kullanan cihazlarda uyanık kalma kilidi şu şekilde adlandırılır:

*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Öneri

  • Android 16 QPR2 veya sonraki sürümlerde uyanık kalma kilidi etiketlerini daha ayrıntılı hale getirmek için WorkManager sürümünüzü en son kararlı sürüme yükseltin.
  • WorkManager çalışanlarını kullanımınızı denetleyin. Özellikle görev planlama API'leri için pil kullanımını optimize etme ile ilgili kılavuzumuza uyduğundan emin olun. Android 16 QPR2 veya sonraki sürümlerde uyanık kalma kilidi etiketlerini daha ayrıntılı hale getirmek için çalışan üzerinde setTraceTag yöntemini kullanarak daha fazla hata ayıklama bilgisi (ör. çalışanı hangi sınıfın planladığı) ekleyin.
  • WorkManager tarafından oluşturulan uyanık kalma kilitlerinin kullanımının yüksek olduğunu tespit ederseniz bunun nedeni, çalışanınızı belirli senaryolarda tamamlanmayacak şekilde yanlış yapılandırmış olmanız olabilir. Özellikle STOP_REASON_TIMEOUT ile sık sık karşılaşıyorsanız çalışan durdurma nedenlerini analiz etmenizi öneririz.
  • Çalışanların durdurulma nedenlerini günlüğe kaydetmenin yanı sıra çalışanlarınızda hata ayıklama ile ilgili dokümanlarımıza göz atın. Ayrıca, uyanık kalma kilitlerinin ne zaman alındığını ve serbest bırakıldığını anlamak için sistem izlerini toplayıp analiz edebilirsiniz.

_UNKNOWN

Hata ayıklama araçları, uyanık kalma kilidi adının kimliği tanımlayabilecek bilgiler (PII) içerdiğini düşünürse gerçek uyanık kalma kilidi adını göstermez. Bunun yerine uyanık kalma kilidini _UNKNOWN olarak etiketlerler. Örneğin, uyanık kalma kilidi adı bir e-posta adresi içeriyorsa araçlar bunu yapabilir.

Öneri

Uyanık kalma kilidi adlandırmayla ilgili en iyi uygulamaları takip edin ve uyanık kalma kilidi adında kimliği tanımlayabilecek bilgileri kullanmaktan kaçının. Uygulamanızla ilişkilendirilmiş _UNKNOWN adlı bir uyanık kalma kilidi bulursanız bunun hangi uyanık kalma kilidi olduğunu belirlemeye çalışın ve farklı bir ad verin.