การตรวจหาเวลาของ GNSS

ใน Android 12 ขึ้นไป Android สามารถใช้ ระบบดาวเทียมนำร่องทั่วโลก (GNSS) เพื่อแนะนำเวลา Epoch ของ Unix ให้กับบริการ time_detector ได้ โดยจะไม่ได้เปิดใช้โดยค่าเริ่มต้นใน AOSP

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

ผลกระทบต่อการใช้พลังงาน

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

การใช้งาน

หากต้องการเปิดใช้การตรวจหาเวลา GNSS ผู้ผลิตอุปกรณ์ต้องเปิดใช้ gnss_time_update_service ในเซิร์ฟเวอร์ระบบอย่างชัดเจน

ต้องอัปเดตทั้งค่า config_enableGnssTimeUpdateService และ config_autoTimeSourcesPriority ในไฟล์ core/res/res/values/config.xml เพื่อเปิดใช้ฟีเจอร์นี้ ตั้งค่าสำหรับ config_enableGnssTimeUpdateService เป็น true และเพิ่ม gnss ลงในรายการสินค้า สำหรับ config_autoTimeSourcesPriority ตำแหน่งของ gnss ในรายการลำดับความสำคัญ จะกำหนดลำดับความสำคัญที่ให้กับคำแนะนำ GNSS เมื่อเทียบกับคำแนะนำ จากแหล่งที่มาอื่นๆ

ตัวอย่างต่อไปนี้คือไฟล์ core/res/res/values/config.xml ที่เปิดใช้การตรวจหาเวลา GNSS และ gnss อยู่ในอันดับที่ 3 ในรายการลำดับความสำคัญหลังจาก network และ telephony

<!-- 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>network</item>
        <item>telephony</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>

แก้ไขข้อบกพร่องและทดสอบ

หากต้องการทดสอบการตรวจหาเวลา GNSS ให้ใช้คำสั่ง adb shell cmd location ใช้คำสั่งเหล่านี้เพื่อเพิ่มผู้ให้บริการตำแหน่งทดสอบที่คุณระบุตำแหน่งและเวลา GNSS ที่เกี่ยวข้องได้ gnss_time_update_service จะฟัง ข้อมูลอัปเดตตำแหน่งเหล่านี้และให้คำแนะนำเป็นระยะๆ

ตัวอย่างคำสั่ง adb shell cmd location มีดังนี้

  • เปิดสวิตช์ตำแหน่งหลักสำหรับผู้ใช้ที่อยู่เบื้องหน้า (โดยปกติคือผู้ใช้ 10 ในยานยนต์) หากเพิ่งแฟลช คุณจะทำได้ผ่านวิซาร์ดการตั้งค่า

    adb shell cmd location set-location-enabled true --user 10
  • เพิ่มผู้ให้บริการทดสอบ GPS (โดยปกติจะล้มเหลวในครั้งแรกและจะเกิดข้อยกเว้นด้านความปลอดภัย พร้อมกับ android from <SOME_UID> not allowed to perform MOCK_LOCATION)

    adb shell cmd location providers add-test-provider gps
  • เปิดใช้สิทธิ์เข้าถึงตำแหน่งจำลองสำหรับ UID ก่อนหน้า

    adb shell appops set UID_PRINTED_IN_PREVIOUS_ERROR android:mock_location allow
  • เพิ่มผู้ให้บริการทดสอบ GPS (ควรทำงานได้โดยไม่มีข้อผิดพลาด)

    adb shell cmd location providers set-test-provider-enabled gps true
  • เปิดใช้ผู้ให้บริการทดสอบ GPS

    adb shell cmd location providers set-test-provider-enabled gps true
  • ตั้งค่าตำแหน่งพร้อมเวลา (เวลาต้องไม่ต่ำกว่าขีดจำกัดที่กำหนดโดย ขอบเขตล่าง)

    adb shell cmd location providers set-test-provider-location gps --location LATITUDE,LONGITUDE --time TIME