ספריות וממשקי API של המערכת יכולים לקבל חסימות של מצב השינה שמשויכות לאפליקציה שלכם. לכן יכול להיות שיהיה לכם קשה לזהות באפליקציה חסימה של מצב השינה שגורמת לבעיה. שימוש לא נכון ב-API עלול לגרום לכך שהאפליקציה תחזיק חסימה של מצב השינה למשך זמן ארוך מדי, גם אם לא קראתם ישירות ל-APIs של חסימת מצב השינה.
בתרחישים שבהם ממשקי API אחרים מקבלים חסימה חלקית של מצב שינה, כדאי להימנע מקבלת חסימה ידנית של מצב שינה.
במאמר הזה מפורטים כמה שמות נפוצים של חסימת מצב שינה שאתם עשויים לראות כשאתם משתמשים בכלים לניפוי באגים של חסימת מצב שינה. יכול להיות שהשמות האלה יופיעו גם בדוח ממדדי הליבה. במקרים מסוימים, יכול להיות שה-wake lock נוצר על ידי ספרייה או מערכת API. במקרים אחרים, יש סיבה לכך שהכלי מסתיר את השם של נעילת ההשכמה שבה אתם משתמשים באפליקציה. אתם יכולים להשתמש בכלי לניפוי באגים כדי לזהות נעילות השכמה שמתנהגות בצורה לא תקינה, ואז לחפש את השם של נעילת ההשכמה במסמך הזה כדי לזהות איזה API עלול לגרום לבעיה ואיך לפתור אותה.
במסמך הזה מפורטים התרחישים שבהם יכול להיות שייווצרו נעילות השכמה. בכל מקרה, יכול להיות שחסימת מצב השינה נוצרה על ידי ספרייה או API אחרים, אבל החסימה משויכת לאפליקציה שקראה לאותו API.
- AlarmManager
- אודיו ומדיה
- Bluetooth
- חיישני המכשיר
- Firebase Cloud Message (FCM)
- JobScheduler
- מיקום
- WorkManager
-
_UNKNOWN: מוצג על ידי כלי ניפוי באגים אם נראה ששם חסימת מצב השינה כולל פרטים אישיים מזהים (PII).
AlarmManager
AlarmManager מקבלת נעילות השהיה ומקצה אותן לאפליקציה שקוראת לה. AlarmManager מקבלת את נעילת ההשהיה כשההתראה מופעלת, ומשחררת את הנעילה כשהשידור של ההתראה, onReceive(), מסתיים.
שמות של חסימות מצב שינה
AlarmManager יוצרת חסימות מצב שינה בשם *alarm*. (הכוכביות הן חלק מהשם של נעילת ההשכמה, הן לא מייצגות תווים כלליים לחיפוש).
המלצה
כדי לבצע אופטימיזציה של התנהגות ההתראות, מומלץ לפעול לפי השיטות המומלצות הבאות:
- אפשר להשתמש ב
AlarmManagerכדי לשפר את התדירות של תזמון ההתראות. - משתמשים באזעקות מסוג
RTC_WAKEUP(שמעירות את המכשיר) רק כשצריך. - צריך לצמצם את השימוש בהתראות, ולהימנע מביצוע עבודה ארוכה בשיטה
onReceive().
אודיו ומדיה
ממשקי 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 כדי לאחזר את הנתונים.
במצבים מסוימים, יכול להיות שיהיה צורך במעקב מותאם אישית אחרי חיישני המכשיר באמצעות SensorManager. SensorManager לא מקבלת חסימות של מצב השינה בשם האפליקציה, אלא אם החיישן הוא חיישן התעוררות, שאפשר לזהות אותו באמצעות API isWakeUpSensor.
המלצה
שימוש בחיישנים להקלטה בקצב דגימה גבוה עלול לרוקן את הסוללה באופן משמעותי. הנה המלצות לצמצום צריכת הסוללה והשימוש בחסימות של מצב השינה:
- אם אתם עוקבים אחרי מספר הצעדים או המרחק שעברתם, כדאי להשתמש ב-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 משתמשות ב-wake locks כדי לקבל את מיקום המכשיר ולספק אותו. החסימות החלקיות של מצב השינה משויכות לאפליקציה שקראה לממשקי ה-API האלה.
שמות של חסימות מצב שינה
שירותי המיקום משתמשים בשמות הבאים:
CollectionLib-SigCollectorNetworkLocationLocatorNetworkLocationScannerNlpCollectorWakeLockNlpWakeLock*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 workers. בפרט, מומלץ לפעול לפי ההנחיות שלנו בנושא אופטימיזציה של השימוש בסוללה בממשקי API לתזמון משימות.
_UNKNOWN
אם כלי הניפוי באגים מזהים ששם של נעילת השכמה מכיל פרטים אישיים מזהים (PII), הם לא מציגים את השם האמיתי של נעילת ההשכמה. במקום זאת, הם מסמנים את נעילת ההשכמה כ-_UNKNOWN. לדוגמה, כלים עשויים לעשות זאת אם שם ה-wake lock מכיל כתובת אימייל.
המלצה
פועלים לפי השיטות המומלצות למתן שמות לחסימת מצב שינה, ונמנעים משימוש בפרטים אישיים מזהים בשם של חסימת מצב השינה. אם אתם מוצאים נעילת השכמה בשם _UNKNOWN שמשויכת לאפליקציה שלכם, נסו לזהות איזו נעילת השכמה זו, ותנו לה שם אחר.