وضع المرآب

لتوفير فترات من وقت الخمول في المركبات، يحافظ وضع Garage على النظام نشطًا بحيث يمكن تنفيذ المهام في JobScheduler المقيدة بالخمول .

ما هو وضع المرآب؟

في الأجهزة المتصلة مثل الهواتف، يعتمد المستخدمون على النظام لضمان استقرار الأجهزة وتحديثها وتحسينها. ولتحقيق هذه الحالة، يوفر نظام Android نافذة زمنية خاملة يمكن للتطبيقات خلالها تنفيذ المهام عندما لا يتفاعل المستخدم مع الجهاز. يعتبر الهاتف خاملاً عندما لا يلمسه المستخدم لمدة طويلة (60 دقيقة أو أكثر) ويتم إيقاف تشغيل الشاشة. على عكس الهاتف، عندما لا يتم استخدام السيارة، يتم إيقاف تشغيلها، مما يعني أن السيارة ليس لديها نافذة زمنية خاملة . يضمن وضع المرآب وقت الخمول في السيارة.

عندما يقوم المستخدم بإيقاف تشغيل السيارة، يدخل النظام في وضع المرآب. عندما تكون السيارة في وضع Garage، يتم تشغيل النظام، ويتم إيقاف تشغيل الشاشة، ويتم تنفيذ المهام الخاملة في قائمة انتظار JobScheduler . لتنفيذ وضع Garage، راجع إرشادات تنفيذ الجهاز .

إرشادات تنفيذ الجهاز

لتنشيط وضع المرآب، عند إيقاف تشغيل السيارة، يجب أن ترسل مركبة 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، راجع مستند تعريف توافق Android (CDD) .

إذا كان يجب على VHAL إيقاف تشغيل النظام قبل اكتمال وضع Garage، فيمكن لـ VHAL إصدار SHUTDOWN_PREPARE مع تعيين المعلمة على SHUTDOWN_IMMEDIATELY أو SLEEP_IMMEDIATELY . يمكن لتطبيقات الأجهزة استخدام هذا في ظل ظروف محددة فقط ، عادةً عندما تكون الموارد اللازمة للحفاظ على تشغيل النظام غير متوفرة. على سبيل المثال، عندما تكون سعة البطارية غير كافية.

وضع المرآب

الشكل 1. تدفق وضع المرآب

كيف يعمل مطورو التطبيقات مع وضع Garage؟

لا تتفاعل التطبيقات والخدمات بشكل مباشر مع وضع Garage. وبدلاً من ذلك، تقوم التطبيقات بجدولة المهام في JobScheduler . يتم تنفيذ تلك المهام المقيدة بالخمول أثناء وضع المرآب.

يوضح التعليمة البرمجية التالية كيفية جدولة مهمة ليتم تشغيلها أثناء وضع 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());

تصحيح وضع المرآب

لتصحيح وضع المرآب:
  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