การตรวจจับเวลาเครือข่าย

อุปกรณ์ 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