อุปกรณ์ Android จะพยายามรับเวลา Unix Epoch ที่ถูกต้องจากแหล่งที่มาของเครือข่ายโดยอัตโนมัติ Android ใช้ Simple Network Time Protocol (SNTP) ซึ่ง ใช้ User Datagram Protocol (UDP) เพื่อรับข้อมูลเวลา
คอมโพเนนต์ที่อธิบายไว้ในหน้านี้เป็นส่วนหนึ่งของระบบการตรวจหาเวลาอัตโนมัติ
ที่เรียกว่าแหล่งที่มาของเวลาในเครือข่าย สามารถใช้สัญญาณเวลาจากเซิร์ฟเวอร์เวลาของเครือข่าย
เพื่อตั้งค่านาฬิกาของระบบในอุปกรณ์ Android เมื่ออุปกรณ์รองรับการตรวจหาเวลาอัตโนมัติ
และมีการกำหนดค่าบริการ time_detector
ให้ใช้สัญญาณเวลาดังกล่าว
โดยค่าเริ่มต้น Android จะใช้แหล่งที่มาของเวลาเครือข่ายเป็นแหล่งที่มาหลักในการตรวจหาเวลาอัตโนมัติ
ระบบตรวจหาเวลาเครือข่าย
network_time_update_service
บริการที่ทำงานในเซิร์ฟเวอร์ระบบ Android
จะใช้ระบบตรวจหาเวลาของเครือข่าย บริการนี้จะใช้ SNTP เป็นระยะๆ
เพื่อรับสัญญาณเวลาจากเซิร์ฟเวอร์ นอกจากนี้ บริการยังตรวจสอบการเชื่อมต่อเครือข่าย
และทริกเกอร์การรีเฟรชเวลาเมื่อไม่มีสัญญาณเวลาล่าสุด
หลังจากช่วงเวลาที่การเชื่อมต่อไม่ดีเป็นเวลานาน
network_time_update_service
บริการจะพยายามรับสัญญาณเวลาหลังจากบูตและเมื่อมีการเชื่อมต่อเครือข่ายเป็นครั้งแรก จากนั้นบริการจะพยายาม
รักษาความสดใหม่ของสัญญาณล่าสุดที่ได้รับ โดยจะปรับสมดุลความต้องการของอุปกรณ์ Android แต่ละเครื่องกับภาระงานจำนวนมากที่อาจเกิดจากอุปกรณ์ Android จำนวนมากทั่วโลกที่รีเฟรชเวลา
network_time_update_service
บริการจะส่งคำแนะนำเกี่ยวกับเวลาของเครือข่ายไปยังtime_detector
บริการโดยใช้ API ภายใน จากนั้นคอมโพเนนต์อื่นๆ ของแพลตฟอร์ม Android
จะใช้คำแนะนำเวลาของเครือข่ายเหล่านี้
หลังจากได้รับคำแนะนำจากแหล่งที่มาของเวลาในเครือข่ายแล้ว time_detector
บริการจะพิจารณาว่าจะอัปเดตนาฬิกาของระบบตามกฎการจัดลําดับความสําคัญที่กําหนดค่าไว้หรือไม่
หากต้องการกำหนดค่าระบบตรวจหาเวลาอัตโนมัติให้ใช้คำแนะนำเกี่ยวกับต้นทางของเครือข่าย
เพื่อตั้งค่านาฬิกาของระบบโดยอัตโนมัติ ให้ใช้
core/res/res/values/config.xml
ไฟล์การกำหนดค่าเซิร์ฟเวอร์ของระบบ ตรวจสอบว่า
ค่า network
อยู่ใน config_autoTimeSourcesPriority
ใน
ตำแหน่งที่ต้องการ ดูข้อมูลเพิ่มเติมได้ที่ลำดับความสำคัญของแหล่งเวลา
การกำหนดค่าอุปกรณ์
ส่วนนี้จะอธิบายวิธีที่ผู้ผลิตอุปกรณ์สามารถกำหนดค่าระบบตรวจหาเวลาของเครือข่าย
การกำหนดค่า AOSP พื้นฐานอยู่ในไฟล์ config.xml
ดังนี้
frameworks/base/core/res/res/values/config.xml
:
คีย์การกำหนดค่า | ค่า AOSP | คำอธิบาย |
---|---|---|
config_ntpRetry |
3 |
หลังจากรีเฟรชไม่สำเร็จ นี่คือจำนวนครั้งที่ระบบพยายาม
สำรวจเวลาเครือข่ายโดยมีช่วงเวลาการสำรวจ NTP ที่สั้นลง
(config_ntpPollingIntervalShorter ) ก่อนที่จะหยุดชั่วคราวและใช้
ช่วงเวลาการสำรวจปกติ (config_ntpPollingInterval ) ค่าที่
น้อยกว่า 0 หมายความว่าระบบจะลองสำรวจอีกครั้งในช่วงเวลาการสำรวจ NTP ที่สั้นลง
จนกว่าจะรีเฟรชได้สำเร็จ |
config_ntpPollingInterval |
64800000 (18 ชั่วโมง) |
ช่วงเวลาการสำรวจเวลาเครือข่ายปกติเป็นมิลลิวินาที |
config_ntpPollingIntervalShorter |
60000 (1 นาที) |
ช่วงเวลาการสำรวจเวลาเครือข่ายของการลองใหม่เป็นมิลลิวินาที ใช้เมื่อ การรีเฟรชเวลาไม่สำเร็จ |
config_ntpServers |
รายการเดียว: ntp://time.android.com |
เซิร์ฟเวอร์ NTP ที่จะใช้เพื่อให้ได้เวลาที่ถูกต้อง รายการต้องอยู่ในรูปแบบ
ntp://<host>[:port]
นี่ไม่ใช่รูปแบบ URI ของ IANA ที่ลงทะเบียนแล้ว |
config_ntpTimeout |
5000 | ระยะเวลาที่รอการตอบกลับจากเซิร์ฟเวอร์ NTP เป็นมิลลิวินาทีก่อนหมดเวลา |
เซิร์ฟเวอร์
โดยค่าเริ่มต้น AOSP จะใช้เซิร์ฟเวอร์เวลาที่ time.android.com
ซึ่งเป็นชื่อแทนของ
NTP สาธารณะของ Google บริการนี้ไม่มี SLA ดูข้อมูลเพิ่มเติมได้ที่คำถามที่พบบ่อยเกี่ยวกับ NTP สาธารณะของ Google
รองรับเซิร์ฟเวอร์หลายตัว
สำหรับ Android 14 ขึ้นไป เฟรมเวิร์กจะรองรับเซิร์ฟเวอร์ NTP หลายรายการ ซึ่งรองรับสถานการณ์ที่อุปกรณ์มีการกระจายอยู่ทั่วโลกด้วยการกำหนดค่าเดียว
แต่มีการจำกัดการเข้าถึงเซิร์ฟเวอร์ เช่น time.android.com
ในบางสถานที่
อัลกอริทึมจะพยายามเชื่อมต่อกับเซิร์ฟเวอร์แต่ละตัวที่ระบุไว้ในconfig_ntpServers
คีย์การกำหนดค่า เมื่ออัลกอริทึมพบเซิร์ฟเวอร์ที่ตอบสนอง ระบบ
จะใช้เซิร์ฟเวอร์นั้นต่อไปจนกว่าจะรีเฟรชไม่สำเร็จหรืออุปกรณ์รีบูต
ความแม่นยำ
การซิงค์เวลาของเครือข่ายเริ่มต้นของ Android ใช้ SNTP ที่มีการค้นหาเวลาครั้งเดียว ประมาณวันละครั้งเพื่อให้มีสัญญาณเวลาล่าสุดอยู่เสมอ
ผลกระทบจากเวลาในการตอบสนองของเครือข่ายเป็นปัจจัยสำคัญที่ทำให้เวลาไม่ถูกต้องเมื่อใช้การติดตั้งใช้งาน SNTP ของ Android SNTP สันนิษฐานว่าเครือข่ายมีความล่าช้าแบบสมมาตร กล่าวคือ เวลาในการตอบสนองของเครือข่ายสำหรับคำขอจะเท่ากับเวลาในการตอบสนองของเครือข่ายสำหรับ การตอบกลับ และเวลาที่ถูกต้องจะอยู่ตรงกลางของเวลาไปกลับของเครือข่ายนั้น โดยปกติแล้ว เวลาในการรับส่งข้อมูลผ่านเครือข่ายจะอยู่ที่ประมาณ 200-300 มิลลิวินาที และในเครือข่ายแบบใช้สาย ความหน่วงจะใกล้เคียงกับแบบสมมาตร ซึ่งทำให้เกิดระดับความไม่ถูกต้องที่ผู้ใช้แทบมองไม่เห็น อย่างไรก็ตาม การโทรศัพท์ผ่านมือถือหรือวิทยุมีหลายขั้นตอนที่อาจทำให้เกิดความล่าช้าแบบอสมมาตรที่ค่อนข้างนาน ในการทำธุรกรรมในเครือข่าย ซึ่งส่งผลให้เกิดความไม่ถูกต้องมากขึ้น
เมื่อตั้งค่าเริ่มต้นของ AOSP สำหรับ config_ntpTimeout
เป็น 5000
มิลลิวินาที และหากเวลาในการตอบสนองของเครือข่ายทั้งหมดมุ่งเน้นเฉพาะขาเข้า
หรือขาออก ข้อผิดพลาดทางทฤษฎีสูงสุดจะอยู่ที่ประมาณ 2.5 วินาที
ความแม่นยำของนาฬิการะบบโดยรวมยังได้รับผลกระทบจากความสามารถของอุปกรณ์ Android
ในการติดตามเวลาที่ผ่านไปอย่างแม่นยำหลังจากได้รับสัญญาณเวลา นี่เป็น
ข้อกังวลเกี่ยวกับการจับเวลาทั้งหมดใน Android ไม่ใช่แค่การตรวจหาเวลาของเครือข่าย
ซึ่งเป็นเหตุผลที่time_detector
บริการไม่สนใจคำแนะนำเกี่ยวกับเวลาเก่า
network_time_update_service
บริการจะรีเฟรชเป็นประจำโดยใช้ช่วงเวลา
config_ntpPollingInterval
เพื่อให้time_detector
บริการ
มีคำแนะนำเวลาใหม่ๆ และเพื่อให้มั่นใจว่าtime_detector
บริการจะไม่กลับไปใช้แหล่งที่มาของเวลาที่มีลำดับความสำคัญต่ำกว่าและมักมีความแม่นยำต่ำกว่า หรือ
บางครั้งอาจไม่ถูกต้อง เช่น telephony
เมื่อใช้การตรวจหาเวลาอัตโนมัติ ความแม่นยำของนาฬิกาของระบบอุปกรณ์อาจได้รับผลกระทบจากการกำหนดค่าอื่นๆ ของบริการ time_detector
เช่น ค่าคงที่และค่าสถานะที่กำหนดว่าคำแนะนำเวลาต้องแตกต่างจากเวลาของนาฬิกาของระบบปัจจุบันมากน้อยเพียงใดก่อนที่จะมีการปรับนาฬิกา (ServiceConfigAccessorImpl.java
)
ผู้ผลิตอุปกรณ์สามารถแก้ไขความแม่นยำได้โดยใช้ตัวเลือกและการกำหนดค่าคงที่ก่อนหน้า แต่คุณควรทราบข้อจำกัดของการติดตั้งใช้งาน SNTP ของแพลตฟอร์ม และผลกระทบที่อาจเกิดขึ้นต่อการใช้พลังงานจากการดำเนินการเครือข่ายที่บ่อยขึ้น ผลกระทบต่อแอปที่ทำงานบนอุปกรณ์จากการปรับนาฬิกาที่บ่อยขึ้นแต่มีขนาดเล็กลง และผลกระทบต่อภาระงานของเซิร์ฟเวอร์
การใช้เวลาของเครือข่ายอื่นๆ
หากไม่ได้กำหนดค่าการตรวจหาเวลาอัตโนมัติโดยใช้ต้นทาง network
หรือหากผู้ใช้ปิดใช้การตรวจหาเวลาอัตโนมัติ คอมโพเนนต์ต่อไปนี้จะยังคงใช้เวลาที่ได้รับจากบริการ network_time_update_service
- วิธี
SystemClock.currentNetworkTimeClock()
- ฟังก์ชันแพลตฟอร์มภายใน เช่น A-GPS สามารถระบุตำแหน่ง GNSS (ตำแหน่ง) ครั้งแรกได้เร็วขึ้นเมื่อมีข้อมูลเวลาของเครือข่าย
การแก้ไขข้อบกพร่องและการทดสอบ
ส่วนต่อไปนี้จะอธิบายคำสั่งเชลล์สำหรับการแก้ไขข้อบกพร่องและการทดสอบ ฟีเจอร์การตรวจหาเวลาของเครือข่าย
โต้ตอบกับบริการ network_time_update_service
หากต้องการส่งออกสถานะปัจจุบันของ network_time_update_service
ให้ใช้คำสั่งต่อไปนี้
adb shell cmd network_time_update_service dump
หากต้องการดูชุดตัวเลือกบรรทัดคำสั่งที่ช่วยในการทดสอบได้ ให้ใช้คำสั่งต่อไปนี้
adb shell cmd network_time_update_service help