טיפול במערכת משתמשים בחזית וברקע

ב-Android לנייד, התמיכה בכמה משתמשים מאפשרת למשתמשים להריץ את האפליקציה ברקע (כשמשתמש אחר פעיל) ובחזית (המכונה גם המשתמש הנוכחי). כדי לחסוך במשאבים לפי הצורך, המערכת מנהלת השבתת המשתמשים. תמיד נדרש משתמש אחד בחזית.

החל מ-Android 10, הגדרת ברירת המחדל של Android Automotive מאפשרת להפעיל רק שלושה משתמשים בו-זמנית (config_multiuserMaxRunningUsers). לכן, בנוסף למשתמש המערכת ללא ראש (משתמש 0), אפשר להגדיר רק משתמש אחד בחזית ומשתמש אחד ברקע.

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

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

תהליכי משתמש ברקע

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

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

מצב המשתמש

המשתמש נמצא בסטטוס מושהה (STATE_SHUTDOWN) עד שהוא מופעל. אם מוגדרים פרטי כניסה של משתמש (כמו קוד אימות), המשתמש ב-Android פועל אבל נשאר נעול (STATE_RUNNING_LOCKED) עד שמישהו פותח את מסך הנעילה של המשתמש הזה. כשמנעולים את המכשיר, האחסון של פרטי הכניסה המוצפנים של המשתמש מפוענח וספריות הנתונים של המשתמש הופכות לזמינות. במעבר משתמש רגיל, המשתמש ברקע לא מושבת, והוא ממשיך לפעול וללא נעילת המסך (STATE_RUNNING_UNLOCKED) אחרי שהנעילה שלו מבוטלת.

מצב מוסך, JobScheduler ועדכוני אפליקציות למשתמשים

השיטה המומלצת לעדכון נתונים באפליקציות של כלי רכב היא להשתמש ב-JobScheduler כדי לתזמן משימות שיפעלו כשהמכשיר במצב לא פעיל, באמצעות מצב חניון (לדוגמה, הורדה עדכונים לאפליקציה מ-Google Play). אחרי שאפליקציות רושמות משימות עם JobScheduler ועם JobSchedulerService, המשימות ירוצו כשהדבר אפשרי.

CarService שולח אות אל JobSchedulerService כדי להפעיל משימות שהוגדרו לפעול כשמכשיר כלי הרכב לא פעיל באמצעות 'מצב חנייה'. כדי ש-JobSchedulerService יריץ משימות למשתמש ברקע, המשתמש חייב להיות במצב STATE_RUNNING_UNLOCKED. משימות בתור אל JobSchedulerService נשמרות ושורדים לאורך מחזורי כוח.

ל-JobScheduler אין אפשרות להריץ משימות עבור משתמש מסוים אם המשתמש אף פעם לא פתוח לאחר מחזור חשמל. עם זאת, כשהמשתמש לא נעול ואם המשתמש נשאר בבית STATE_RUNNING_UNLOCKED, אפשר להריץ משימות למשתמש.