อุปกรณ์ Android จะพยายามรับเวลายุค Unix ที่ถูกต้องจากแหล่งเครือข่ายโดยอัตโนมัติ Android ใช้โปรโตคอล SNTP ซึ่งใช้โปรโตคอล UDP เพื่อรับข้อมูลเวลา
ส่วนประกอบที่อธิบายในหน้านี้เป็นส่วนหนึ่งของระบบตรวจจับเวลาอัตโนมัติที่เรียกว่า ต้นทางเวลาของเครือข่าย สัญญาณเวลาจากเซิร์ฟเวอร์เวลาเครือข่ายสามารถใช้เพื่อตั้งค่านาฬิการะบบของอุปกรณ์ Android เมื่ออุปกรณ์รองรับการตรวจจับเวลาอัตโนมัติและบริการ time_detector
ได้รับการกำหนดค่าให้ใช้งาน
ตามค่าเริ่มต้น Android จะใช้เวลาต้นทางของเครือข่ายเป็นจุดกำเนิดการตรวจจับเวลาอัตโนมัติหลัก
ระบบตรวจจับเวลาเครือข่าย
บริการ network_time_update_service
ที่ทำงานบนเซิร์ฟเวอร์ระบบ Android จะใช้ระบบตรวจจับเวลาเครือข่าย บริการใช้ SNTP เป็นระยะเพื่อรับสัญญาณเวลาจากเซิร์ฟเวอร์ บริการนี้ยังตรวจสอบการเชื่อมต่อเครือข่ายและทริกเกอร์การรีเฟรชเวลาเมื่อไม่มีสัญญาณเวลาล่าสุดหลังจากการเชื่อมต่อที่ไม่ดีเป็นเวลานาน
บริการ network_time_update_service
พยายามรับสัญญาณเวลาหลังจากการบูตและเมื่อมีสร้างการเชื่อมต่อเครือข่ายเป็นครั้งแรก บริการจะพยายามรักษาสัญญาณล่าสุดไว้ โดยจะรักษาสมดุลระหว่างความต้องการของอุปกรณ์ Android แต่ละเครื่องกับภาระงานจำนวนมากที่อาจเกิดจากอุปกรณ์ Android จำนวนมากทั่วโลกที่รีเฟรชเวลา
เมื่อใช้ API ภายใน network_time_update_service
จะส่งคำแนะนำเวลาเครือข่ายไปยังบริการ time_detector
ส่วนประกอบแพลตฟอร์ม Android อื่นๆ ให้ใช้คำแนะนำเวลาเครือข่ายเหล่านี้
หลังจากได้รับคำแนะนำจากต้นทางเวลาของเครือข่าย บริการ time_detector
จะกำหนดว่าจะอัปเดตนาฬิการะบบตาม กฎการจัดลำดับความสำคัญ ที่กำหนดค่าไว้หรือไม่
เมื่อต้องการกำหนดค่าระบบการตรวจจับเวลาอัตโนมัติเพื่อใช้คำแนะนำต้นกำเนิดเครือข่ายเพื่อตั้งค่านาฬิการะบบโดยอัตโนมัติ ให้ใช้ไฟล์คอนฟิกูเรชันเซิร์ฟเวอร์ระบบ core/res/res/values/config.xml
ตรวจสอบให้แน่ใจว่า network
ค่าอยู่ใน config_autoTimeSourcesPriority
ในตำแหน่งที่ต้องการ สำหรับรายละเอียด โปรดดูที่ ลำดับความสำคัญของแหล่งที่มาของเวลา
การกำหนดค่าอุปกรณ์
ส่วนนี้อธิบายวิธีที่ผู้ผลิตอุปกรณ์สามารถกำหนดค่าระบบตรวจจับเวลาเครือข่าย
การกำหนดค่า AOSP พื้นฐานอยู่ที่ 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] นี่ไม่ใช่โครงการ IANA URI ที่ลงทะเบียนแล้ว |
config_ntpTimeout | 5,000 | เวลาที่ต้องรอการตอบสนองของเซิร์ฟเวอร์ NTP ในหน่วยมิลลิวินาทีก่อนหมดเวลา |
เซิร์ฟเวอร์
ตามค่าเริ่มต้น AOSP จะใช้เซิร์ฟเวอร์เวลาที่ time.android.com
ซึ่งเป็นชื่อแทนสำหรับ Google Public NTP บริการนี้ไม่มี SLA สำหรับรายละเอียด โปรดดู คำถามที่พบบ่อยของ Google Public NTP
รองรับเซิร์ฟเวอร์หลายเครื่อง
สำหรับ Android 14 ขึ้นไป เฟรมเวิร์กรองรับเซิร์ฟเวอร์ NTP หลายเซิร์ฟเวอร์ สิ่งนี้รองรับสถานการณ์ที่อุปกรณ์กระจายไปทั่วโลกด้วยการกำหนดค่าเดียว แต่การเข้าถึงเซิร์ฟเวอร์เช่น time.android.com
ถูกจำกัดในบางสถานที่
อัลกอริทึมจะพยายามแต่ละเซิร์ฟเวอร์ที่ระบุในคีย์การกำหนดค่า config_ntpServers
เมื่อพบเซิร์ฟเวอร์ที่ตอบสนอง ระบบจะใช้เซิร์ฟเวอร์นั้นต่อไปจนกว่าจะรีเฟรชไม่สำเร็จหรืออุปกรณ์รีบูต
ความแม่นยำ
การซิงค์เวลาเครือข่ายเริ่มต้นของ Android จะใช้ SNTP กับการสืบค้นครั้งเดียวประมาณวันละครั้ง เพื่อให้แน่ใจว่าจะมีสัญญาณเวลาล่าสุดอยู่เสมอ
ผลกระทบจากเวลาแฝงของเครือข่ายเป็นสาเหตุหลักที่ทำให้เวลาไม่แม่นยำในการใช้งาน SNTP ของ Android SNTP ถือว่าความล่าช้าของเครือข่ายแบบสมมาตร กล่าวคือ เวลาแฝงของเครือข่ายสำหรับคำขอจะเหมือนกับเวลาแฝงของเครือข่ายสำหรับการตอบสนอง และเวลาที่ถูกต้องจะอยู่ในช่วงกลางของการเดินทางไปกลับของเครือข่ายนั้นพอดี บ่อยครั้งที่เวลาไปกลับของเครือข่ายอยู่ที่ประมาณสองสามร้อยมิลลิวินาที และบนเครือข่ายแบบใช้สาย เวลาแฝงนั้นใกล้เคียงกับความสมมาตร นำไปสู่ระดับความไม่ถูกต้องที่ผู้ใช้แทบจะมองไม่เห็น อย่างไรก็ตาม ในระบบโทรศัพท์เคลื่อนที่หรือวิทยุ มีหลายขั้นตอนที่สามารถแทรกความล่าช้าที่ค่อนข้างยาวและไม่สมมาตรลงในธุรกรรมเครือข่าย ซึ่งนำไปสู่ความคลาดเคลื่อนมากขึ้น
ด้วยการตั้งค่าเริ่มต้น 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