حالت گاراژ

برای ارائه دوره‌های بیکاری در وسایل نقلیه، Garage Mode سیستم را بیدار نگه می‌دارد تا کارهایی که در JobScheduler با بیکاری محدود شده‌اند، اجرا شوند.

حالت گاراژ چیست؟

در دستگاه‌های متصل مانند تلفن‌ها، کاربران برای اطمینان از پایداری، به‌روز بودن و بهینه بودن دستگاه‌ها به سیستم تکیه می‌کنند. برای دستیابی به این حالت، پلتفرم اندروید یک پنجره زمان بیکار را فراهم می کند که در طی آن برنامه ها می توانند وظایف خود را در زمانی که کاربر با دستگاه تعامل ندارد انجام دهند. هنگامی که کاربر برای مدت طولانی (60 دقیقه یا بیشتر) آن را لمس نمی کند و صفحه خاموش می شود، یک تلفن بیکار در نظر گرفته می شود. برخلاف تلفن، وقتی از خودرو استفاده نمی‌شود، خاموش می‌شود، به این معنی که خودرو پنجره زمان بیکاری ندارد. حالت گاراژ زمان بیکاری در خودرو را تضمین می کند.

هنگامی که یک خودرو توسط کاربر خاموش می شود، سیستم وارد حالت گاراژ می شود. هنگامی که یک خودرو در حالت گاراژ است، سیستم روشن می شود، صفحه نمایش خاموش می شود و کارهای بیکار در صف JobScheduler اجرا می شوند. برای پیاده‌سازی حالت گاراژ، دستورالعمل‌های اجرای دستگاه را ببینید.

دستورالعمل های پیاده سازی دستگاه

برای فعال کردن حالت گاراژ، هنگام خاموش کردن خودرو، خودرو HAL (VHAL) باید AP_POWER_STATE_REQ با وضعیت SHUTDOWN_PREPARE با پارامتر تنظیم شده روی SHUTDOWN_ONLY یا CAN_SLEEP ارسال کند.

برای اینکه حالت SHUTDOWN_PREPARE موثر باشد، VHAL باید دو پارامتر (وضعیت و پارامتر اضافی) را برای دستور AP_POWER_STATE_REQ مشخص کند. این دستگاه را قادر می‌سازد تا وارد حالت گاراژ شود، که کارهای برنامه‌ریزی‌شده را در JobScheduler شناسایی می‌کند و از تعلیق یا خاموش شدن سیستم تا تکمیل کارها جلوگیری می‌کند.

پیاده سازی های دستگاه چگونه به فریم ورک اندروید متصل می شوند؟

برای Garage Mode، فریم ورک از VHAL درخواست می‌کند تا زمان خاموش شدن را تا زمانی که از مدت زمان مورد نیاز فراتر رود یا تمام کارها اجرا شوند، تمدید کند که در آن زمان سیستم خاموش می‌شود. تحت شرایط خاص تعریف شده در CDD، پیاده سازی دستگاه می تواند سیستم را زودتر خاموش کند. برای جزئیات در مورد الزامات سازگاری Android، به سند تعریف سازگاری Android (CDD) مراجعه کنید.

اگر VHAL باید قبل از تکمیل حالت گاراژ، سیستم را خاموش کند، VHAL می‌تواند SHUTDOWN_PREPARE با پارامتر تنظیم شده روی SHUTDOWN_IMMEDIATELY یا SLEEP_IMMEDIATELY صادر کند. پیاده‌سازی‌های دستگاه فقط در شرایط خاص می‌توانند از این مورد استفاده کنند، معمولاً زمانی که منابع مورد نیاز برای راه‌اندازی سیستم در دسترس نیست. به عنوان مثال، زمانی که ظرفیت باتری ناکافی است.

حالت گاراژ

شکل 1. جریان حالت گاراژ

توسعه دهندگان اپلیکیشن چگونه با Garage Mode کار می کنند؟

برنامه‌ها و سرویس‌ها مستقیماً با Garage Mode تعامل ندارند. در عوض، برنامه‌ها کارها را در JobScheduler زمان‌بندی می‌کنند. آن کارهایی که به دلیل بیکاری محدود می شوند، در حالت Garage Mode اجرا می شوند.

کد زیر نحوه برنامه ریزی یک کار را برای اجرا در حالت Garage Mode نشان می دهد:

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());

اشکال زدایی حالت گاراژ

برای رفع اشکال حالت گاراژ:
  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 برای نشان دادن اینکه حالت Garage شروع می شود:
    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 نشان می دهد که حالت Garage به پایان رسیده است (لغو یا تکمیل شده است):
    [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