כמה ספריות וממשקי מערכת API יכולים לקבל נעילות השכמה שאפשר לשייך לאפליקציה שלכם. לכן יכול להיות שיהיה קשה לזהות באפליקציה נעילת השכמה שגורמת לבעיה. אם משתמשים ב-API בצורה לא נכונה, יכול להיות שהאפליקציה תחזיק את נעילת ההשכמה למשך זמן ארוך מדי, גם אם לא קוראים ל-APIs של נעילת ההשכמה ישירות.
בתרחישים שבהם ממשקי API אחרים מקבלים חסימת מצב שינה, מומלץ להימנע מקבלת חסימת מצב שינה באופן ידני.
במאמר הזה מפורטים כמה שמות נפוצים של חסימת מצב שינה שאתם עשויים לראות כשאתם משתמשים בכלים לניפוי באגים של חסימת מצב שינה. יכול להיות שהשמות האלה יופיעו גם בדוח ממדדי הליבה. במקרים מסוימים, יכול להיות שה-wake lock נוצר על ידי ספרייה או מערכת API. במקרים אחרים, יש סיבה לכך שהכלי מסתיר את השם של נעילת ההשכמה שבה אתם משתמשים באפליקציה. אתם יכולים להשתמש בכלי לניפוי באגים כדי לזהות נעילות השכמה שמתנהגות בצורה לא תקינה, ואז לחפש את השם של נעילת ההשכמה במסמך הזה כדי לזהות איזה API עלול לגרום לבעיה ואיך לפתור אותה.
במסמך הזה מפורטים התרחישים שבהם יכול להיות שייווצרו נעילות השכמה. בכל מקרה, יכול להיות ש-wake lock נוצר על ידי ספרייה או API אחרים, אבל הנעילה משויכת לאפליקציה שקראה ל-API הזה.
- AlarmManager
- אודיו ומדיה
- Bluetooth
- חיישני המכשיר
- העברת הודעות בענן ב-Firebase (FCM)
- JobScheduler
- מיקום
- WorkManager
-
_UNKNOWN
: מוצג על ידי כלי ניפוי באגים אם נראה שהשם של חסימת מצב השינה כולל פרטים אישיים מזהים (PII).
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 של מדיה, צריך לסיים את סשן המדיה כשאין בו יותר צורך.
Bluetooth
ממשקי ה-API של Bluetooth בפלטפורמה לא מחזיקים נעילות השכמה שניתן לשייך לאפליקציה בזמן שמתבצעות פעולות Bluetooth. כדי לוודא שהעברת נתונים באמצעות Bluetooth מתבצעת ברקע, צריך לתזמן משימה באמצעות WorkManager.
המלצה
- כדי למנוע קבלת נעילת השכמה ידנית במהלך התאמת Bluetooth, אפשר להשתמש בהתאמה של מכשיר משני כדי להתאים מכשירי Bluetooth.
- כדי להבין איך מתקשרים ברקע באמצעות Bluetooth, אפשר לעיין בהנחיות בנושא תקשורת ברקע.
- אם נדרשת נעילת השכמה ידנית, צריך להחזיק את נעילת ההשכמה רק למשך הפעולה של Bluetooth.
חיישני המכשיר
יש כמה שיטות למעקב אחרי נתוני חיישנים במכשיר, כמו מספר הצעדים, נתונים ממד התאוצה או נתונים מהג'ירוסקופ.
ב-Wear OS, אפשר להשתמש בשירותי הבריאות של Wear כדי לאסוף נתונים מהמכשיר, כמו גובה, דופק ומרחק.
אם הנתונים נאספים על ידי אפליקציות אחרות, אפשר להשתמש ב-Health Connect בשילוב עם WorkManager כדי לאחזר את הנתונים.
בתרחישים כמו מעקב אחרי שינוי במספר הצעדים או במרחק שעברתם, אתם יכולים להשתמש ב-Recording API בנייד בשילוב עם WorkManager כדי לאחזר את הנתונים.
במצבים מסוימים, יכול להיות שיהיה צורך במעקב מותאם אישית של חיישני המכשיר באמצעות SensorManager
. SensorManager
לא מקבלת נעילות השהיה בשם האפליקציה, אלא אם החיישן הוא חיישן השכמה, שאפשר לזהות אותו באמצעות API isWakeUpSensor
.
המלצה
שימוש בחיישנים להקלטה בקצב דגימה גבוה עלול לרוקן את הסוללה באופן משמעותי. הנה המלצות לצמצום צריכת הסוללה והשימוש ב-wake lock:
- אם אתם עוקבים אחרי מספר הצעדים או המרחק שעברתם, כדאי להשתמש ב-Recording API כדי לתעד את הנתונים בצורה חסכונית בסוללה.
- כדי לעקוב אחרי נתונים מחיישנים פסיביים ב-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
משתמשות בנעילות השכמה כדי לקבל את מיקום המכשיר ולספק אותו. הנעילות של מצב הפעולה משויכות לאפליקציה שקראה לממשקי ה-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
המלצה
- כדי שהתגים של נעילת ההשכמה יהיו מפורטים יותר ב-Android מגרסה 16 ואילך, צריך לשדרג את גרסת WorkManager.
- ביצוע ביקורת על השימוש בעובדים של WorkManager. בפרט, מומלץ לפעול לפי ההנחיות שלנו בנושא אופטימיזציה של השימוש בסוללה בממשקי API לתזמון משימות.
_UNKNOWN
אם כלי הניפוי באגים מזהים ששם של נעילת השהיה מכיל פרטים אישיים מזהים (PII), הם לא מציגים את השם האמיתי של נעילת ההשהיה. במקום זאת, הם מסמנים את נעילת ההשכמה בתווית _UNKNOWN
. לדוגמה, כלים עשויים לעשות זאת אם שם ה-wake lock מכיל כתובת אימייל.
המלצה
פועלים לפי השיטות המומלצות למתן שמות לחסימת מצב שינה, ונמנעים משימוש בפרטים אישיים מזהים בשם של חסימת מצב השינה. אם מצאתם נעילת השכמה בשם _UNKNOWN
שמשויכת לאפליקציה שלכם, נסו לזהות איזו נעילת השכמה זו, ותנו לה שם אחר.