การตรวจหาเวลาอัตโนมัติ

การตรวจหาเวลาอัตโนมัติจะรับคำแนะนำเวลาจากแหล่งที่มาต่างๆ เลือกตัวเลือกที่ดีที่สุด แล้วตั้งค่านาฬิกาของระบบใน Android ให้ตรงกัน Android เวอร์ชันก่อนหน้ามีวิธีตั้งค่าวันที่และเวลา 2 วิธี ได้แก่ ตั้งค่าด้วยตนเองตามผู้ใช้หรือโดยการตรวจหาเวลาอัตโนมัติ และตั้งค่าด้วยตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้

  • telephony ใช้สัญญาณโทรศัพท์ของ Network Identity and Time Zone (NITZ)
  • network ใช้เซิร์ฟเวอร์เวลาโปรโตคอลเวลาเครือข่าย (NTP)

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

Android รุ่นที่จะเปิดตัวนี้มีตัวเลือกเพิ่มเติม 2 รายการในการตั้งค่าและตรวจหาเวลาโดยอัตโนมัติ ดังนี้

  • gnss ใช้ระบบนำทางด้วยดาวเทียมทั่วโลก (GNSS)
  • external ใช้พร็อพเพอร์ตี้ VHAL หรือ System API

เปิดใช้การตรวจหาเวลาอัตโนมัติ

หากต้องการเปิดใช้การตรวจหาเวลาอัตโนมัติ ให้เลือกการตั้งค่า > วันที่และเวลา > วันที่และเวลาอัตโนมัติ

รูปที่ 1 เลือกวันที่และเวลาอัตโนมัติ

กำหนดค่าแหล่งที่มาของเวลา

หากต้องการระบุแหล่งเวลาที่จะรวมไว้ในการตรวจหาเวลาอัตโนมัติ และลำดับความสำคัญในการนำแหล่งเวลาเหล่านี้มาพิจารณา คุณต้องแก้ไขไฟล์การกำหนดค่าทรัพยากรของอุปกรณ์ core/res/res/values/config.xml โดยทำดังนี้

<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
     take precedence over lower ones. See com.android.server.timedetector.TimeDetectorStrategy for
     available sources. -->
<string-array name="config_autoTimeSourcesPriority">
    <item>telephony</item>
    <item>network</item>
</string-array>

ในตัวอย่างนี้ ระบบจะพิจารณา telephony และ network ในการตรวจจับเวลาอัตโนมัติ และระบบจะจัดลําดับความสําคัญของคําแนะนําเวลา telephony ไว้ก่อนคําแนะนําเวลา network

โดยทั่วไปแล้ว ระบบจะไม่สนใจคําแนะนําจากแหล่งที่มาที่มีลําดับความสําคัญสูงกว่าหากคําแนะนํานั้นไม่ถูกต้องหรือเก่าเกินไป นอกจากนี้ หากคำแนะนำที่ถูกต้องซึ่งมีลำดับความสำคัญสูงสุดตรงกับเวลานาฬิการะบบปัจจุบันของอุปกรณ์ภายในไม่กี่วินาที (ค่าเริ่มต้นคือ 2 วินาที) ระบบจะไม่เปลี่ยนแปลงเวลา

ขอบเขตเวลาล่าง

Android 12 มีขอบเขตเวลาต่ำสุดใหม่ให้ใช้เมื่อตรวจสอบการแนะนำเวลา ก่อนหน้านี้ การตรวจหาเวลาอัตโนมัติจะไม่ตรวจสอบเวลา UTC ที่เข้ามาซึ่งระบบแนะนำ เมื่อใช้ฟีเจอร์นี้ ระบบจะทิ้งเวลาที่ผ่านไปก่อนช่วงล่าง

ค่าขอบเขตล่างจะกำหนดจากวันที่ที่มาจากการประทับเวลาของบิลด์ ซึ่งทำงานตามหลักการที่ว่าเวลาที่ใช้ได้ต้องเกิดขึ้นหลังจากสร้างอิมเมจระบบแล้ว Android จะไม่บังคับใช้ขอบเขตบน

การแนะนำเวลา GNSS

gnssแหล่งที่มาของเวลาเป็นฟีเจอร์ใหม่ใน Android 12 ซึ่งได้จากสัญญาณ GPS ข้อมูลนี้เป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับเวลาที่ telephony และ network ไม่พร้อมให้บริการ ระบบจะเพิ่มตัวเลือกนี้ลงใน GnssTimeUpdateService ใหม่ใน SystemServer ที่คอยฟังการอัปเดตตำแหน่งแบบพาสซีฟ เมื่อได้รับตำแหน่งที่ถูกต้องแล้ว GnssTimeUpdateService จะแนะนำ TimeDetectorService ซึ่งจะเป็นผู้พิจารณาว่าควรอัปเดตนาฬิกาของระบบหรือไม่

โดยค่าเริ่มต้น แหล่งที่มาของเวลา gnss จะไม่เปิดใช้ใน AOSP ดังนั้นพาร์ทเนอร์จึงต้องเปิดใช้แหล่งที่มาดังกล่าว

<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
    take precedence over lower ones.
    See com.android.server.timedetector.TimeDetectorStrategy for available sources. -->
<string-array name="config_autoTimeSourcesPriority">
    <item>telephony</item>
    <item>network</item>
    <item>gnss</item>
</string-array>

<!-- Enables the GnssTimeUpdate service. This is the global switch for enabling Gnss time based
    suggestions to TimeDetector service. See also config_autoTimeSourcesPriority. -->
<bool name="config_enableGnssTimeUpdateService">true</bool>

วิธีเปิดใช้ฟีเจอร์นี้

  1. อัปเดต config_enableGnssTimeUpdateService ต้องตั้งค่าconfig_enableGnssTimeUpdateServiceเป็น true
  2. อัปเดต config_autoTimeSourcesPriority คุณต้องเพิ่ม gnss ลงในรายการสินค้าสำหรับ config_autoTimeSourcesPriority ตําแหน่งของ gnss ในรายการลําดับความสําคัญจะกําหนดลําดับความสําคัญของคําแนะนํา GNSS เทียบกับค่าจากแหล่งที่มาอื่นๆ

ผลกระทบต่อกำลังไฟ

GnssTimeUpdateService จะฟังการอัปเดตตำแหน่งแบบพาสซีฟ ซึ่งหมายความว่าแอปจะไม่เปิด GPS เพื่อสิ้นเปลืองพลังงาน ด้วยเหตุนี้ พลังงานที่ใช้ไปเมื่อเปิดใช้แหล่งที่มาของ GNSS จึงแทบจะไม่ต้องคำนึงถึง ซึ่งหมายความว่า GnssTimeUpdateService จะไม่ได้รับการอัปเดตตำแหน่งและแนะนำเวลา GNSS เว้นแต่แอปหรือบริการอื่นในระบบจะขอการอัปเดตตำแหน่ง

การทดสอบ

ชุดเครื่องมือทดสอบความเข้ากันได้ (CTS)

มีการทดสอบ CTS เพื่อยืนยันว่ามีเวลาจาก GNSS ดูรายละเอียดได้ที่ LocationShellCommand.java

การทดสอบ 1 หน่วย

ดูการทดสอบหน่วยพื้นฐานในไฟล์ต่อไปนี้

atest frameworks/base/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java

การทดสอบด้วยตนเอง

เราได้เพิ่มคำสั่งใหม่ลงใน LocationShellCommand.java เพื่อทดสอบฟีเจอร์นี้ ใช้คำสั่งเหล่านี้เพื่อเพิ่มผู้ให้บริการทดสอบที่คุณสามารถระบุตำแหน่งและเวลา GNSS ที่เชื่อมโยงได้ GnssTimeUpdateService จะฟังการอัปเดตตำแหน่งเหล่านี้และแสดงคำแนะนำเป็นระยะ

หมายเหตุ: อินเทอร์เฟซของคําสั่งเหล่านี้อาจเปลี่ยนแปลงไปในแต่ละรุ่น

# Enable Master Location Switch in the foreground user (usually user 10 on automotive).
# If you just flashed, this can be done through Setup Wizard.
adb shell cmd location set-location-enabled true --user 10

# Add GPS test provider (this usually fails the first time and will throw a SecurityException
# with "android from <some-uid> not allowed to perform MOCK_LOCATION".)
adb shell cmd location providers add-test-provider gps

# Enable mock location permissions for previous UID
adb shell appops set <uid printed in previous error> android:mock_location allow

# Add GPS test provider (Should work with no errors.)
adb shell cmd location providers add-test-provider gps

# Enable GPS test provider
adb shell cmd location providers set-test-provider-enabled gps true

# Set location with time (time can't be earlier than the limit set by the lower bound.)
adb shell cmd location providers set-test-provider-location gps --location <LATITUDE>,<LONGITUDE> --time <TIME>

การแนะนำเวลาภายนอก

คำแนะนำเวลาภายนอกเป็นอีกวิธีในการให้คำแนะนำเวลาอัตโนมัติแก่ Android ตัวเลือกใหม่นี้ช่วยให้คุณระบุการแนะนำเวลาที่กำหนดเองทั้งหมดให้กับ Android ได้ ซึ่งอาจมาจาก ECU ต่างๆ ซึ่งจะใช้การผสมผสานระหว่างนาฬิกาแบบเรียลไทม์, GNSS, NITZ หรือแหล่งข้อมูลเวลาอื่นๆ ได้

คำแนะนำต่อไปนี้มีให้ใช้งานใน Android 12 เพื่อเป็นexternal คำแนะนำเวลา

  • พร็อพเพอร์ตี้ VHAL มีพร็อพเพอร์ตี้ VHAL ใหม่ชื่อ EPOCH_TIME พร็อพเพอร์ตี้นี้หมายถึงจํานวนมิลลิวินาทีที่ผ่านไปนับตั้งแต่วันที่ 1/1/1970 (UTC) ระบบจะส่งค่านี้ไปยัง Android TimeManager เพื่อแนะนำเวลาใหม่ของระบบ ตัวอย่างการติดตั้งใช้งาน VHAL ที่อัปเดตพร็อพเพอร์ตี้นี้มีอยู่ในการติดตั้งใช้งานอ้างอิงด้านล่าง
  • System API มีเมธอดใหม่ชื่อ suggestExternalTime() ใน TimeManager เพื่อระบุการแนะนำเวลาภายนอกให้กับระบบ หากระบบได้รับการกําหนดค่าให้พิจารณาคําแนะนําเวลาภายนอก (โดยใช้ config_autoTimeSourcesPriority ในไฟล์การกําหนดค่า) ระบบจะใช้การประทับเวลาซึ่งส่งไปยังเมธอดนี้เพื่อตั้งค่าเวลาของระบบ หากไม่มีคําแนะนําเวลาที่มีลําดับความสําคัญสูงกว่า

คุณสามารถใช้โซลูชันเวลาภายนอกได้ตามที่อธิบายไว้ด้านล่าง

  1. อัปเดตไฟล์การกําหนดค่าทรัพยากร (core/res/res/values/config.xml) แล้วเพิ่มค่า external ลงใน config_autoTimeSourcesPriority
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    ซึ่งจะเป็นการบอกให้ Android ให้ความสำคัญกับเวลาภายนอกเป็นลำดับความสำคัญสูงสุดเมื่อตั้งค่านาฬิกาของระบบ ฮาร์ดแวร์ในยานพาหนะจะเขียนการแนะนำการประทับเวลาลงในพร็อพเพอร์ตี้ VHAL ใหม่EPOCH_TIME

  2. แอปที่ผู้ให้บริการระบุจะอ่านพร็อพเพอร์ตี้นี้และเรียกใช้ TimeManager.suggestExternal() จากนั้น Android จะใช้การประทับเวลาที่ให้ไว้เป็นค่านาฬิกาของระบบใหม่