การตรวจหาเวลาของเครือข่าย

อุปกรณ์ Android จะพยายามรับเวลา Unix Epoch ที่ถูกต้องจากแหล่งที่มาของเครือข่ายโดยอัตโนมัติ Android ใช้โปรโตคอล SNTP ซึ่งใช้โปรโตคอล 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 พื้นฐานอยู่ที่ 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