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

Bu belge, uygulamanızdaki uyandırma kilidi kullanım alanlarını belirlemenize ve optimize etmenize yardımcı olur. Ayrıca, bu kullanım alanıyla ilişkili diğer kitaplıklar veya sistem API'leri tarafından edinilen uyandırma kilitleri olup olmadığını vurgular. Bu uyanık kalma kilitleri uygulamanızla ilişkili olduğundan, sorunlu bir uyanık kalma kilidinin kaynağını belirlemek zor olabilir. API'nin yanlış kullanımı, uyandırma kilidi almasanız bile uygulamanızın aşırı uyandırma kilidi kullanımı nedeniyle işaretlenmesine neden olabilir.

Bu belgede, uyandırma kilidi hata ayıklama araçlarını kullanırken veya vitals raporlarında karşılaşabileceğiniz bazı yaygın uyandırma kilidi adları listelenmektedir. Bu adlar bir kitaplıktan veya sistem API'sinden kaynaklanabilir ya da karartılmış olabilir. Hatalı çalışan uyanık kalma kilitlerini belirlemek için hata ayıklama araçlarını kullanıp bu dokümanda uyanık kalma kilidi adını arayarak hangi API'nin soruna neden olabileceğini belirleyebilir ve kullanımını optimize etme hakkında öneriler bulabilirsiniz.

Bu belgede, uyandırma kilitleri edinmeyle ilgili yaygın kullanım alanları özetlenmekte, çeşitli API'ler ve kitaplıklar tarafından kullanılan uyandırma kilidi adları ayrıntılı olarak açıklanmakta ve uyandırma kilidi kullanımını optimize etme ve azaltmaya yönelik öneriler ve en iyi uygulamalar sunulmaktadır.

AlarmManager

AlarmManager, uyanık kalma kilitleri edinir ve bunları arayan uygulamayla ilişkilendirir. AlarmManager, alarm çaldığında uyanık kalma kilidini edinir ve alarm yayınının onReceive() yöntemi yürütmeyi bitirdiğinde kilidi serbest bırakır.

Uyanık kalma kilidi adları

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

Öneri

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

  • Yaklaşık veya tam alarm arasında karar vermek için alarm türünü seçme başlıklı makaleyi inceleyin. Alarmınızın tam zamanında çalması gerekmiyorsa sistemin planlama konusunda daha esnek olmasını sağlamak için yaklaşık alarm kullanın. Bu, pil ömrünü iyileştirebilir.
  • Sistem tarafından uygulanan alarm kotaları hakkında bilgi sahibi olun ve uygulamanızı bu kotalara uyacak şekilde tasarlayın.
  • onReceive() yönteminde uzun süren işlemler yapmaktan kaçının ve alarmdan sonra ek işlem yapılması gerekiyorsa çalışanları planlayın.

Ses ve medya

Media API'ler, ses kaydederken veya çalarken uyandırma kilidi alabilir. Uyanık kalma kilitleri, arama uygulamasıyla ilişkilendirilir.

Uyanık kalma kilidi adları

Medya API'leri, Audio ile başlayan çeşitli adlara sahip uyanık kalma kilitleri edinir:

  • AudioBitPerfect: Kayıpsız USB ses oynatma için kullanılır.
  • AudioDirectOut: TV'de veya özel bir cihazda kayıpsız ses oynatma için kullanılır.
  • AudioDup: Bluetooth veya USB ile bağlıyken bildirimlerin oynatılması için kullanılır.
  • AudioIn: Mikrofon etkinken video kamera modunda ses kaydı için kullanılır.
  • AudioMix: Sesin ortak bir cihazda oynatılması için kullanılır.
  • AudioOffload: Bu modu destekleyen uygulamalarda uzun süreli yalnızca müzik çalma için kullanılır.
  • AudioSpatial: Üç boyutlu ses destekleyen cihazlarda çok kanallı film veya müzik sesinin oynatılması için kullanılır.
  • AudioUnknown: Diğer durumlar geçerli olmadığında kullanılır.
  • MmapCapture: Düşük gecikmeli ses yakalama 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ı bildirmeyin.
  • Media API'leri kullanıyorsanız doğrudan uyandırma kilitleri edinmeniz gerekmez. Gerekli uyandırma kilitlerini sizin için edinmek üzere API'leri kullanabilirsiniz.
  • Medya API'lerini kullandığınızda, 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 uyandırma kilitlerini tutar. Bu kilitler uygulamaya atfedilemez.

Öneri

  • Bluetooth eşlemesi sırasında manuel uyanık kalma kilidi almamak için Bluetooth cihazları eşlerken ikincil cihaz eşleştirmesini kullanın.
  • Arka planda Bluetooth iletişimi nasıl yapılacağını öğrenmek için Arka planda iletişim kurma rehberine bakın.
  • Gecikmeli iletişimde kullanıcıları etkileyen bir durum yoksa WorkManager kullanmak genellikle yeterlidir. Manuel uyanık tutma kilidinin gerekli olduğu düşünülüyorsa uyanık tutma kilidini yalnızca Bluetooth etkinliği süresince veya etkinlik verilerinin işlenmesi süresince tutun.

Cihaz Sensörleri

Adım sayısı, ivme ölçer veya jiroskop verileri gibi cihaz sensörü verilerini izlemek için çeşitli yöntemler vardır.

Wear OS'te, yükseklik, kalp atış hızı ve kat edilen mesafe gibi cihaz verilerini almak için Wear Sağlık Hizmetleri'ni kullanın.

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

Adım sayısı veya kat edilen mesafedeki değişimi izleme gibi senaryolarda, verileri düzenli olarak almak için mobil cihazlarda Recording API'yi WorkManager ile birlikte kullanabilirsiniz. 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 Health Connect, 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 uyandırma sensörü olmadığı sürece uygulama adına uyandırma kilidi almaz. Uyandırma sensörleri, isWakeUpSensor API kullanılarak tanımlanabilir.

Öneri

Yüksek örnekleme hızlarında kayıt yapmak için sensörleri kullanmak pilin hızlı tükenmesine neden olabilir. Pilin hızlı tükenmesini ve uyanık kalma kilidi kullanımını azaltmak için öneriler:

  • Adım sayısı 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 izleme için pil kullanımını optimize etmek üzere Wear Sağlık Hizmetleri'ni kullanın.
  • SensorManager ile bir sensör kaydederken sensör toplama mantığını kullanmak ve uygulamanın aldığı kesintilerin 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 tetikleyiciyle uyandırıldığında sistem, arabelleğe alınan sensör verilerini hemen gönderir.
  • Uygulamanız hem konum hem de sensör verileri gerektiriyorsa bunların 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 ihtiyacınız olmasını önlersiniz. Bu birleştirilmiş verilerin yüklenmesini ve işlenmesini sağlamak için bir çalışan veya kısa süreli bir uyanık kalma kilidi kullanın.

Firebase Cloud Message (FCM)

Uygulamaya Firebase Cloud Message (FCM) yayını gönderilirken uyanık kalma kilidi alınır. FCM yayını onMessageReceived() yöntemi yürütmeyi tamamladığında uyanık kalma kilidi serbest bırakılır.

Uyanık kalma kilidi adları

Cihazda bir FCM mesajı alındığında, Android 16 ve sonraki sürümlerde GOOGLE_C2DM adıyla kısa bir uyanık kalma kilidi tutulur. Uyandırma 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 gerçekten hemen teslim edilmesi gerekmediği sürece yüksek öncelikli FCM kullanmayın.
  • onMessageReceived() yöntemini olabildiğince hızlı bir şekilde tamamlayın veya ek işlem yapılması gerekiyorsa göreve devam etmek için bir çalışan planlayın. Daha fazla bilgi için Firebase yönergelerini inceleyin.

JobScheduler

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

Uyanık kalma kilidi adları

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

Açılı ayraçlar içindeki öğ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şaretli *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 adlara sahip uyandırma kilitleri oluşturur:

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

Bu kalıbı kullanan diğer işler:

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

Kullanıcı tarafından başlatılan işler, aşağıdaki kalıba uygun adlara sahip uyandırma kilitleri oluşturur:

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

Yüksek öncelikli işlerde şu desen kullanılır:

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

Normal işlerde şu desen kullanılır:

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

Ad alanı backup ve izleme etiketi started olan hızlandırılmış 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ümleri çalıştıran cihazlarda uyanık tutma kilidi şu şekilde adlandırılır:

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

Android 16 QPR2 veya daha yeni 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 User-Initiated Data Transfer (UIDT) API'yi kullanın. Bu, kullanıcı tarafından başlatılan ve uzun süren veri aktarımı görevleri için belirlenen yoldur.
  • JobScheduler tarafından oluşturulan ve yüksek uyanık kalma kilidi kullanımına sahip uyanık kalma kilitleri tespit ederseniz bunun nedeni, işinizi belirli senaryolarda tamamlanmayacak şekilde yanlış yapılandırmış olmanız olabilir. Özellikle STOP_REASON_TIMEOUT ile ilgili yüksek sayıda hata görüyorsanız işin durdurulma nedenlerini analiz etmeyi düşünebilirsiniz.
  • JobScheduler görevlerini kullanımınızı denetleyin. Özellikle görev planlama API'leri için pil kullanımını optimize etme ile ilgili yönergelerimize uyun.

Konum

LocationManager ve FusedLocationProviderClient, cihaz konumunu edinmek ve iletmek için uyandırma kilitlerini kullanır. Uyandırma 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 rehberimize göz atın. Zaman aşımlarını uygulama, konum isteği gruplamadan yararlanma veya pasif konum güncellemelerini kullanma gibi yöntemleri deneyebilirsiniz.
  • Konum verilerini önbelleğe almak için ayrı ve sürekli bir uyanık kalma kilidi edinmekten kaçının. Bu işlem gereksizdir ve kaldırılmalıdır. FusedLocationProvider veya LocationManager API'lerini kullanarak konum güncellemeleri istenirken sistem, konum etkinliği geri çağırması 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 gerekebileceği ve bu durumun uyanık kalma kilidi kullanımını etkileyebileceği uzaktan mesajlaşma senaryoları ele alınmaktadır. Yaygın kullanım alanları:

  • Yerel ağ üzerinden bağlı harici bir cihazda meydana gelen olayları izlemesi gereken video veya ses izleme tamamlayıcı uygulamaları.
  • Masaüstü sürümüyle ağ soketi bağlantısı kuran 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 adları yoktur.

Öneri

  • Ağ etkinlikleri sunucu tarafında işlenebiliyorsa istemcide bilgi almak için FCM'yi kullanın. FCM verilerinin ek olarak işlenmesi gerekiyorsa hızlandırılmış bir çalışan planlamayı seçebilirsiniz.
  • Etkinliklerin bir soket bağlantısı kullanılarak istemci tarafında işlenmesi gerekiyorsa etkinlik kesintilerini dinlemek için uyanık kalma kilidi gerekmez. Veri paketleri kablosuz veya hücresel radyoya ulaştığında radyo donanımı, çekirdek uyandırma kilidi şeklinde bir kesme tetikler. Ardından, verileri işlemek için bir çalışan planlamayı veya uyanık kalma kilidi edinmeyi seçebilirsiniz.
  • Örneğin, bir ağ yuvasındaki 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ı, görevleri arka planda yürütürken uyanık kalma kilitleri alır. Uyandırma kilitleri, çalışanları oluşturan uygulamayla ilişkilendirilir.

Uyanık kalma kilidi adları

WorkManager tarafından edinilen uyanık kalma kilidi adları, Android sisteminin hangi sürümünde çalıştıklarına 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 uyandırma 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>'dır.

Örnek

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

Android 15 veya daha eski sürümleri çalıştıran cihazlarda uyanık tutma kilidi şu şekilde adlandırılır:

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

Android 16 QPR2 veya sonraki sürümlerin yüklü olduğu ve WorkManager 2.10.0+ kullanılan cihazlarda uyanık kalma kilidinin adı:

*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 etiketlerinin daha ayrıntılı olması için WorkManager sürümünüzü en son kararlı sürüme yükseltin.
  • WorkManager çalışanlarının kullanımınızı denetleyin. Özellikle görev planlama API'leri için pil kullanımını optimize etme ile ilgili yönergelerimize uyduğunu doğrulayın. Android 16 QPR2 veya sonraki sürümlerde uyanık kalma kilidi etiketlerini daha ayrıntılı hale getirmek için çalışana setTraceTag yöntemini uygulayarak çalışanı hangi sınıfın planladığı gibi daha fazla hata ayıklama bilgisi ekleyin.
  • WorkManager tarafından oluşturulan ve yüksek uyanık kalma kilidi kullanımına sahip uyanık kalma kilitlerini tanımlarsanız bunun nedeni, çalışanınızı belirli senaryolarda tamamlanmayacak şekilde yanlış yapılandırmış olmanız olabilir. Özellikle STOP_REASON_TIMEOUT ile ilgili yüksek sayıda oluşum görüyorsanız işçi durdurma nedenlerini analiz etmeyi düşünebilirsiniz.
  • Çalışanların durdurulma nedenlerini kaydetmenin yanı sıra çalışanlarınızda hata ayıklama ile ilgili dokümanlarımıza da göz atın. Ayrıca, uyandırma kilitlerinin ne zaman alındığını ve serbest bırakıldığını anlamak için sistem izlerini toplamayı ve analiz etmeyi de düşünebilirsiniz.

_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, wake lock 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 bilgiler (PII) kullanmaktan kaçının. Uygulamanızla ilişkilendirilmiş _UNKNOWN adlı bir uyanık tutma kilidi bulursanız bu uyanık tutma kilidinin hangisi olduğunu belirlemeye çalışın ve farklı bir ad verin.