โหมดโรงรถ

โหมดโรงรถจะเปิดระบบไว้เพื่อให้ทำงานได้ในช่วงที่มีเวลาว่างในรถ จึงทำให้งานใน JobScheduler ที่มีข้อจำกัดด้านเวลาว่างทำงานได้

โหมดโรงรถคืออะไร

ในอุปกรณ์ที่เชื่อมต่ออินเทอร์เน็ต เช่น โทรศัพท์ ผู้ใช้ต้องอาศัยระบบเพื่อให้อุปกรณ์ทำงานได้อย่างเสถียร เป็นเวอร์ชันล่าสุด และเพิ่มประสิทธิภาพ แพลตฟอร์ม Android มีกรอบเวลาเวลาที่ไม่ได้ใช้งานเพื่อให้แอปทำงานได้เมื่อผู้ใช้ไม่ได้โต้ตอบกับอุปกรณ์ ระบบจะถือว่าโทรศัพท์ไม่มีการใช้งานเมื่อผู้ใช้ไม่ได้สัมผัสโทรศัพท์เป็นเวลานาน (60 นาทีขึ้นไป) และหน้าจอปิดอยู่ ซึ่งต่างจากโทรศัพท์ตรงที่เมื่อไม่ได้ใช้งาน รถจะปิดอยู่ ซึ่งหมายความว่ารถไม่มีกรอบเวลาไม่มีการใช้งาน โหมดโรงรถจะตรวจสอบเวลาที่ไม่มีการใช้งานในรถ

เมื่อผู้ใช้ปิดรถ ระบบจะเข้าสู่โหมดโรงรถ ขณะที่รถอยู่ในโหมดโรงรถ ระบบจะเปิดเครื่อง ปิดจอแสดงผล และทำงานที่ไม่มีการใช้งานในคิว JobScheduler หากต้องการใช้โหมดโรงรถ โปรดดูหลักเกณฑ์การติดตั้งใช้งานอุปกรณ์

หลักเกณฑ์การติดตั้งใช้งานอุปกรณ์

หากต้องการเปิดใช้งานโหมดโรงรถ เมื่อปิดรถ HAL ของยานพาหนะ (VHAL) ต้องส่ง AP_POWER_STATE_REQ ที่มีสถานะ SHUTDOWN_PREPARE โดยตั้งค่าพารามิเตอร์เป็น SHUTDOWN_ONLY หรือ CAN_SLEEP

VHAL ต้องระบุพารามิเตอร์ 2 รายการ (สถานะและพารามิเตอร์เพิ่มเติม) สําหรับคําสั่ง AP_POWER_STATE_REQ เพื่อให้สถานะ SHUTDOWN_PREPARE มีผล ซึ่งจะช่วยให้อุปกรณ์เข้าสู่โหมดโรงรถได้ ซึ่งจะตรวจหางานที่กําหนดเวลาไว้ใน JobScheduler และป้องกันไม่ให้ระบบระงับหรือปิดจนกว่างานจะเสร็จสมบูรณ์

การติดตั้งใช้งานอุปกรณ์เชื่อมต่อกับเฟรมเวิร์ก Android อย่างไร

สำหรับโหมดโรงรถ เฟรมเวิร์กจะขอให้ VHAL ขยายเวลาการปิดระบบจนกว่าจะเกินระยะเวลาที่กำหนดหรือมีการดำเนินการงานทั้งหมดแล้ว ระบบก็จะปิด การติดตั้งใช้งานอุปกรณ์อาจปิดระบบเร็วขึ้นในบางสถานการณ์ที่ระบุไว้ใน CDD ดูรายละเอียดเกี่ยวกับข้อกำหนดความเข้ากันได้ของ Android ได้ที่เอกสารนิยามความเข้ากันได้ (CDD) ของ Android

หาก VHAL ต้องปิดระบบก่อนที่โหมดโรงรถจะเสร็จสมบูรณ์ VHAL สามารถออกคำสั่ง SHUTDOWN_PREPARE โดยตั้งค่าพารามิเตอร์เป็น SHUTDOWN_IMMEDIATELY หรือ SLEEP_IMMEDIATELY การติดตั้งใช้งานอุปกรณ์จะใช้วิธีนี้เท่านั้นภายใต้สถานการณ์ที่เฉพาะเจาะจง โดยปกติแล้วจะเป็นเมื่อไม่มีทรัพยากรที่จำเป็นต่อการรักษาให้ระบบทำงานต่อไป เช่น เมื่อความจุแบตเตอรี่ไม่เพียงพอ

โหมดโรงรถ

รูปที่ 1 ขั้นตอนโหมดโรงรถ

นักพัฒนาแอปทำงานร่วมกับโหมดโรงรถอย่างไร

แอปและบริการจะไม่โต้ตอบกับโหมดโรงรถโดยตรง แต่แอปจะตั้งเวลางานใน JobScheduler แทน งานที่ถูกจำกัดด้วยสถานะไม่มีการใช้งานจะทำงานในระหว่างโหมดโรงรถ

โค้ดต่อไปนี้แสดงวิธีตั้งเวลาให้งานทํางานในโหมดโรงรถ

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 เพื่อระบุว่าโหมดโรงรถกำลังเริ่มต้น
    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