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

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

בתרחישים שבהם ממשקי API אחרים מקבלים חסימה של מצב שינה, כדאי להימנע מקבלת חסימה ידנית של מצב שינה.

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

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

AlarmManager

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

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

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

המלצה

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

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

אודיו ומדיה

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

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

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

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

המלצה

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

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

‫Bluetooth

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

המלצה

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

חיישני המכשיר

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

ב-Wear OS, אפשר להשתמש ב-Wear Health Services כדי לאסוף נתונים מהמכשיר, כמו גובה, דופק ומרחק.

אם הנתונים נאספים על ידי אפליקציות אחרות, אפשר להשתמש ב-Health Connect בשילוב עם WorkManager כדי לאחזר את הנתונים באופן תקופתי.

בתרחישים כמו מעקב אחרי שינוי במספר הצעדים או במרחק שעברתם, אפשר להשתמש ב-Recording API בנייד בשילוב עם WorkManager כדי לאחזר את הנתונים באופן תקופתי. כדי לגשת לנתוני צעדים היסטוריים (כמו סך הצעדים היומי או הצעדים ב-6 השעות האחרונות), Health Connect תומכת גם במעקב צעדים במכשיר במכשירים עם Android בגרסה 14 ומעלה.

במצבים מסוימים, יכול להיות שיהיה צורך במעקב מותאם אישית של חיישני המכשיר באמצעות SensorManager. ‫SensorManager לא מקבלת חסימות של מצב השינה בשם האפליקציה, אלא אם החיישן הוא חיישן התעוררות, שאפשר לזהות אותו באמצעות API‏ isWakeUpSensor.

המלצה

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

  • אם אתם עוקבים אחרי מספר הצעדים או המרחק שעברתם, כדאי להשתמש ב-Recording API כדי לתעד את הנתונים בצורה שלא צורכת הרבה סוללה. במכשירים עם Android מגרסה 14 ואילך, אפשר להשתמש ב-Health Connect כדי לגשת להיסטוריית המכשיר ולסיכום של מספר הצעדים.
  • כדי לעקוב אחרי נתונים מחיישנים לבישים ב-Wear OS, משתמשים ב-Wear Health Services כדי לייעל את השימוש בסוללה.
  • מפחיתים את תדר החיישן לפחות מ-200 הרץ.
  • כשרושמים חיישן באמצעות SensorManager, צריך להגדיר maxReportLatencyUs של יותר מ-30 שניות כדי להשתמש בלוגיקה של אצווה חיישנים ולצמצם את מספר ההפרעות שהאפליקציה מקבלת.
  • מומלץ להימנע מהחזקת נעילת השכמה ארוכה למשך כל הזמן של מעקב החיישן, ובמקום זאת לתזמן התראות באמצעות AlarmManager כדי לבצע סקר נתוני חיישן כל 30 שניות ומעלה.

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

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

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

מתבצעת רכישה של חסימת מצב שינה בשם 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*

המלצה

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

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 ומעלה ומשתמשים ב-WorkManager 2.10.0+, השם של נעילת ההפעלה יהיה:

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

המלצה

_UNKNOWN

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

המלצה

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