זיהוי של נעילת התעוררות שנוצרה על ידי ממשקי API אחרים

כמה ספריות וממשקי מערכת API יכולים לקבל נעילות השכמה שאפשר לשייך לאפליקציה שלכם. לכן יכול להיות שיהיה קשה לזהות באפליקציה נעילת השכמה שגורמת לבעיה. אם משתמשים ב-API בצורה לא נכונה, יכול להיות שהאפליקציה תחזיק את נעילת ההשכמה למשך זמן ארוך מדי, גם אם לא מתבצעת קריאה ישירה ל-APIs של נעילת ההשכמה.

במאמר הזה מפורטים כמה שמות נפוצים של חסימת מצב שינה שאתם עשויים לראות כשאתם משתמשים בכלים לניפוי באגים של חסימת מצב שינה. יכול להיות שהשמות האלה יופיעו גם בדוח מהמדדים החיוניים של Android. במקרים מסוימים, יכול להיות שה-wake lock נוצר על ידי ספרייה או מערכת API. במקרים אחרים, יש סיבה לכך שהכלי מסתיר את השם של נעילת ההשכמה שבה אתם משתמשים באפליקציה. אתם יכולים להשתמש בכלי לניפוי באגים כדי לזהות נעילות השכמה שמתנהגות בצורה לא תקינה, ואז לחפש את השם של נעילת ההשכמה במסמך הזה כדי לזהות איזה API עלול לגרום לבעיה ואיך לפתור אותה.

במסמך הזה מפורטים התרחישים שבהם יכול להיות שייווצרו נעילות השכמה. בכל מקרה, יכול להיות שנעילת ההשכמה נוצרה על ידי ספרייה או API אחרים, אבל הנעילה משויכת לאפליקציה שקראה ל-API הזה.

AlarmManager

AlarmManager מקבלת נעילות השהיה ומקצה אותן לאפליקציה שקוראת להן. AlarmManager מקבלת את נעילת ההשהיה כשההתראה מופעלת, ומשחררת את הנעילה כשהשידור של ההתראה, onReceive(), מסיים את ההרצה.

שמות של חסימות מצב שינה

AlarmManager יוצרת חסימות מצב שינה בשם *alarm*. (הכוכביות הן חלק משם נעילת ההשכמה, הן לא מייצגות תווים כלליים לחיפוש).

המלצה

כדי לבצע אופטימיזציה של התנהגות ההתראות, מומלץ לפעול לפי השיטות המומלצות הבאות:

  • אפשר להשתמש בAlarmManager כדי לשפר את התדירות של תזמון ההתראות.
  • מומלץ להשתמש בשעונים מעוררים מסוג RTC_WAKEUP (שמעירים את המכשיר) רק כשצריך.
  • מומלץ להשתמש בכמה שפחות התראות, ולהימנע מביצוע עבודה ארוכה בשיטה onReceive().

אודיו ומדיה

ממשקי Media API יכולים לקבל נעילות השכמה בזמן הקלטה או הפעלה של אודיו. הנעילות של המכשיר מיוחסות לאפליקציית השיחות.

שמות של חסימות מצב שינה

ממשקי Media API מקבלים חסימות מצב שינה עם שמות שונים שמתחילים ב-Audio:

  • AudioBitPerfect: משמש להפעלת אודיו ב-USB ללא אובדן נתונים.
  • AudioDirectOut: משמש להפעלת אודיו ללא אובדן נתונים בטלוויזיה או במכשיר מיוחד.
  • AudioDup: משמש להפעלת התראות כשמחוברים באמצעות Bluetooth או USB.
  • AudioIn: משמש להקלטת אודיו במצב מצלמת וידאו כשהמיקרופון פעיל.
  • AudioMix: משמש להפעלת אודיו במכשיר נפוץ.
  • AudioOffload: משמש להפעלה ארוכת טווח של מוזיקה בלבד, באפליקציות שתומכות במצב הזה.
  • AudioSpatial: משמש להפעלה של אודיו רב-ערוצי בסרטים או במוזיקה במכשירים שתומכים באודיו מרחבי.
  • AudioUnknown: משמש כשהמצבים האחרים לא רלוונטיים.
  • MmapCapture: משמש להקלטת אודיו עם השהיה נמוכה.
  • MmapPlayback: משמש להפעלה עם השהיה נמוכה, למשל במשחקים או באפליקציות אודיו מקצועיות.

המלצה

אנחנו ממליצים לפעול לפי השיטות המומלצות הבאות:

  • אל תשתמשו בשמות של חסימת מצב שינה שמתחילים ב-Audio.
  • אם אתם משתמשים בממשקי ה-API של המדיה, אתם לא צריכים להשיג נעילות השהיה ישירות. אתם יכולים להסתמך על ממשקי ה-API כדי להשיג את נעילות ההשהיה הנדרשות בשבילכם.
  • כשמשתמשים בממשקי API של מדיה, צריך לסיים את סשן המדיה כשאין בו יותר צורך.

הודעה בענן ב-Firebase‏ (FCM)

‫GCM מקבל נעילת השהיה בזמן שהוא מעביר שידור של הודעה בענן ב-Firebase ‏(FCM) לאפליקציה. נעילת ההשהיה משתחררת אחרי ששידור ה-FCM onMessageReceived() מסיים את ההרצה.

שמות של חסימות מצב שינה

‫GCM מקבל חסימת מצב שינה בשם GOOGLE_C2DM.

המלצה

כדי לייעל את ההתנהגות של FCM, מומלץ לפעול לפי השיטות המומלצות הבאות:

  • אופטימיזציה של תדירות המסירה של FCM.
  • אל תשתמשו ב-FCM בעדיפות גבוהה אלא אם ההודעה באמת צריכה להישלח באופן מיידי.
  • חשוב להשלים את השיטה onMessageReceived() במהירות האפשרית. מידע נוסף זמין בהנחיות ל-Firebase.

JobScheduler

משימות של JobScheduler מקבלות חסימות של מצבי שינה בזמן שהן מבצעות משימות ברקע. הנעילות של המכשיר במצב פעיל משויכות לאפליקציה שיצרה את העובדים.

שמות של חסימות מצב שינה

השמות של נעילות ההשכמה שמתקבלות על ידי JobScheduler תלויים בגרסה של מערכת Android שבה הן פועלות, ובמטרה של העבודה.

הפריטים שמוקפים בסוגריים זוויתיים הם משתנים. לדוגמה, "<package_name>" הוא שם החבילה של האפליקציה, ולא הטקסט המילולי <package name>. עם זאת, *job* הוא רצף התווים *job*, עם כוכביות. הכוכביות לא משמשות כתווים כלליים לחיפוש.

‫Android מגרסה 15 ומטה

עבודות שהמשתמש מפעיל יוצרות חסימות מצב שינה עם שמות שמתאימים לתבנית הבאה:

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

משימות אחרות שמשתמשות בדפוס הזה:

*job*/@<name_space>@/<package_name>/<classname>
‫Android מגרסה 16 ואילך

עבודות שהמשתמש מפעיל יוצרות חסימות מצב שינה עם שמות שמתאימים לתבנית הבאה:

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

משרות בעדיפות גבוהה פועלות לפי הדפוס הזה:

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

משימות רגילות פועלות לפי הדפוס הזה:

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
דוגמה

נניח שיש עבודה מזורזת עם מרחב השמות backup ותג המעקב started. שם החבילה הוא com.example.app, והמחלקה שיצרה את המשימה היא com.backup.BackupFileService.

במכשירים עם Android בגרסה 15 או בגרסאות מוקדמות יותר, נעילת ההשכמה נקראת:

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

במכשירים עם Android 16 ומעלה, נעילת ההשכמה נקראת:

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

המלצה

ביצוע ביקורת על השימוש במשימות JobScheduler. בפרט, מומלץ לפעול לפי ההנחיות שלנו בנושא אופטימיזציה של השימוש בסוללה בממשקי API לתזמון משימות.

מיקום

LocationManager ו-FusedLocationProviderClient משתמשות ב-wake locks כדי לקבל את מיקום המכשיר ולספק אותו. הנעילות של המכשיר במצב פעיל משויכות לאפליקציה שקראה לממשקי ה-API האלה.

שמות של חסימות מצב שינה

שירותי המיקום משתמשים בשמות הבאים:

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

המלצה

אופטימיזציה של השימוש במיקום. לדוגמה, הגדרת פסק זמן, בקשות למיקום באצווה או שימוש בעדכוני מיקום פסיביים.

WorkManager

עובדי WorkManager מקבלים הרשאות לביטול מצב שינה בזמן שהם מבצעים משימות ברקע. הנעילות של המכשיר במצב פעיל משויכות לאפליקציה שיצרה את העובדים.

שמות של חסימות מצב שינה

השמות של חסימות מצב השינה שמתקבלות על ידי WorkManager תלויים בגרסה של מערכת Android שבה הן פועלות.

‫Android מגרסה 15 ומטה

משימות של WorkManager יוצרות חסימות מצב שינה עם שמות שמתאימים לתבנית הבאה:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
‫Android מגרסה 16 ואילך

משימות מואצות יוצרות נעילות השכמה עם שמות שמתאימים לתבנית הבאה:

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

משימות רגילות פועלות לפי הדפוס הבא:

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

כברירת מחדל, שם העובד הוא <trace_tag>.

דוגמה

נניח שיש עובד מזורז בשם BackupFileWorker. שם החבילה הוא com.example.app.

במכשירים עם Android בגרסה 15 או בגרסאות מוקדמות יותר, נעילת ההשכמה נקראת:

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

במכשירים עם Android 16 ומעלה, נעילת ההשכמה נקראת:

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

המלצה

ביצוע ביקורת על השימוש בעובדים של WorkManager. בפרט, מומלץ לפעול לפי ההנחיות שלנו בנושא אופטימיזציה של השימוש בסוללה בממשקי API לתזמון משימות.

_UNKNOWN

אם כלי הניפוי באגים מזהים ששם של נעילת השהיה מכיל פרטים אישיים מזהים (PII), הם לא מציגים את השם האמיתי של נעילת ההשהיה. במקום זאת, הם מסמנים את נעילת ההשכמה כ-_UNKNOWN. לדוגמה, כלים עשויים לעשות זאת אם שם ה-wake lock מכיל כתובת אימייל.

המלצה

פועלים לפי השיטות המומלצות למתן שמות לחסימת מצב שינה, ונמנעים משימוש בפרטים אישיים מזהים בשם של חסימת מצב השינה. אם מצאתם נעילת השכמה בשם _UNKNOWN שמשויכת לאפליקציה שלכם, נסו לזהות איזו נעילת השכמה זו, ותנו לה שם אחר.