מצב חנייה

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

מהו מצב מוסך?

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

כשהמשתמש מכבה את הרכב, המערכת עוברת למצב 'חניה'. כשהרכב במצב Garage, המערכת מופעלת, המסך כבוי ומתבצעות משימות במצב המתנה בתור JobScheduler. במאמר הנחיות להטמעה במכשיר מוסבר איך להטמיע את מצב המוסך.

הנחיות להטמעה במכשירים

כדי להפעיל את מצב המוסך, כשמכבים את הרכב, ה-HAL של הרכב (VHAL) צריך לשלוח את הערך AP_POWER_STATE_REQ עם המצב SHUTDOWN_PREPARE, כאשר הפרמטר מוגדר ל-SHUTDOWN_ONLY או ל-CAN_SLEEP.

כדי שהמצב SHUTDOWN_PREPARE יהיה תקף, צריך לציין ב-VHAL את שני הפרמטרים (המצב והפרמטר הנוסף) של הפקודה AP_POWER_STATE_REQ. כך המכשיר יכול לעבור למצב Garage, שמזהה משימות מתוזמנות ב-JobScheduler ומונע מהמערכת להמשיך בהשעיה או בהשבתה עד שהמשימות יושלמו.

איך הטמעות של מכשירים מתחברות למסגרת של Android?

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

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

מצב מוסך

איור 1. תהליך ההפעלה של מצב מוסך

איך מפתחי אפליקציות עובדים עם מצב Garage?

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

הקוד הבא מראה איך לתזמן משימה שתופעל במצב Garage:

public class MyGarageModeJob extends JobService { ... }

Context context = ...;
int jobId = ...;

ComponentName myGarageModeJobName = new componentName(context,
                                                      MyGarageModeJob.class);

JobInfo.Builder infoBuilder = new JobInfo.Builder(jobId, myGarageModeJobName)
                    .setRequiresDeviceIdle(true);

// Example of an optional constraint:
infoBuilder.setRequiredNetworkType(NetworkType.NETWORK_TYPE_UNMETERED);

JobScheduler jobScheduler = (JobScheduler) context
                    .getSystemService(Context.JOB_SCHEDULER_SERVICE);

jobScheduler.schedule(infoBuilder.build());

מצב ניפוי באגים במוסך

כדי לנפות באגים במצב Garage:
  1. כדי להפעיל קטגוריות של רישום ביומן שרלוונטיות למצב 'חניה':
    adb shell stop
    adb shell setprop log.tag.GarageMode VERBOSE
    adb shell setprop log.tag.Finsky VERBOSE
    adb shell setprop log.tag.CAR.POWER VERBOSE
    adb shell setprop log.tag.JobScheduler.Connectivity VERBOSE
    adb shell start
    
  2. כדי לבדוק את הפלט של logcat כדי לראות אם מצב המוסך מופעל:
    GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE
    GarageMode: [GarageMode]: Entering GarageMode
    GarageMode: [Controller]: Sending broadcast with action: com.android.server.jobscheduler.GARAGE_MODE_ON
  3. כדי לקבוע שהפלט של logcat מציין שהפעלת מצב המוסך הסתיימה (בוטלה או הושלמה):
    [GarageMode]: GarageMode was canceled
    או
    [GarageMode]: GarageMode completed normally

    מצב המוסך תלוי במצב הטעינה של הרכב, כפי שמתואר למעלה.

  4. בודקים את הפלט של logcat כדי לוודא שהוזנו מצבי ההפעלה הנכונים:
    CAR.POWER: starting shutdown prepare without Garage Mode
    GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE
    GarageMode: [GarageMode]: Entering GarageMode
    CAR.POWER: send shutdown prepare
    CAR.POWER: setPowerState=SHUTDOWN_PREPARE(7) param=0