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 uyandırma kilitleri uygulamanızla ilişkili olduğundan, sorunlu bir uyandırma 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ık veya sistem API'sinden kaynaklanabilir ya da karartılmış olabilir. Hatalı çalışan uyandırma kilitlerini belirlemek için hata ayıklama araçlarını kullanıp bu dokümanda uyandırma 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, uyandırma kilitleri edinir ve bunları arayan uygulamayla ilişkilendirir. AlarmManager, alarm çaldığında uyandırma 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, uyandırma 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 hassas olması 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'leri, ses kaydederken veya çalarken uyandırma kilidi alabilir. Uyandırma 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 çalma 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 yalnızca müziklerin uzun süreli olarak oynatılması 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.
  • Medya API'lerini 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 uyandırma kilidi almamak için Bluetooth cihazları eşlerken eşlik eden cihaz eşlemesini 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 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 gidilen 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ümlerin yüklü olduğu 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'si kullanılarak tanımlanabilir.

Öneri

Yüksek örnekleme hızlarında kayıt yapmak için sensörleri kullanmak pilin önemli ölçüde tükenmesine neden olabilir. Pilin tükenmesini ve uyandırma kilidi kullanımını azaltmak için öneriler:

  • Adım sayısı veya kat edilen mesafeyi izliyorsanız verileri pil açısından verimli bir ş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örleri gruplandırma 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 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 verisi 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'nun uyanık kalması 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 uyandırma kilidi kullanın.

Firebase Cloud Message (FCM)

Uygulamaya bir Firebase Cloud Message (FCM) yayını gönderilirken uyandırma kilidi alınır. FCM yayını onMessageReceived() yöntemi yürütmeyi tamamladığında uyandırma 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 GCM_MESSAGE, diğer sürümlerde ise GOOGLE_C2DM adıyla kısa bir uyanık kalma kilidi tutulur.

Ö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, 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ı

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>" <package name> metni değil, uygulamanızın paketinin adıdır. 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 deseni kullanan diğer işler:

*job*/@<name_space>@/<package_name>/<classname>
Android 16.1 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 kalma kilidi şu şekilde adlandırılır:

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

Android 16.1 veya daha yeni sürümlerin yüklü olduğu cihazlarda uyandırma 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 uyandırma 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 uyandırma kilidi kullanımına sahip uyandırma 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 oluşum görüyorsanız iş durdurma 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önergelerimizi uygulayın.

Konum

LocationManager ve FusedLocationProviderClient, cihaz konumunu almak ve iletmek için uyandırma 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 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 uyandırma 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 uyandırma 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 çoğu uyandırma işlemi, çekirdek uyandırma kilitleridir. Çekirdek uyandırma kilitleri uygulamayla ilişkilendirilmediğinden, burada listelenecek ilişkili uyandırma 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 uyandırma 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 uyandırma 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 uyandırma kilidi edinmeniz gerekir.

WorkManager

WorkManager çalışanları, 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ı

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, şu kalıba uygun adlara sahip uyanık kalma kilitleri oluşturur:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16.1 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 kalma kilidi şu şekilde adlandırılır:

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

Android 16 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.1 veya sonraki sürümlerde uyandırma 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.1 veya sonraki sürümlerde uyandırma kilidi etiketlerini daha ayrıntılı hale getirmek için çalışana hangi sınıfın çalışanı planladığı gibi daha fazla hata ayıklama bilgisi eklemek üzere çalışanda setTraceTag yöntemini kullanın.
  • WorkManager tarafından oluşturulan ve yüksek uyandırma kilidi kullanımına sahip uyandırma 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şçinin durma nedenlerini analiz etmeyi düşünebilirsiniz.
  • Çalışan durdurma 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ı, uyandırma kilidi adının kimliği tanımlayabilecek bilgiler (PII) içerdiğini düşünürse gerçek uyandırma kilidi adını göstermez. Bunun yerine, uyandırma kilidini _UNKNOWN olarak etiketlerler. Örneğin, uyandırma 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 bilgiler 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.