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

อุปกรณ์ 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 จะถือว่าความล่าช้าของเครือข่ายแบบสมมาตร กล่าวคือ เวลาในการตอบสนองของเครือข่ายสำหรับคำขอจะเท่ากับเวลาในการตอบสนองของเครือข่ายสำหรับการตอบกลับ และเวลาที่ถูกต้องจะอยู่ตรงกลางของการรับส่งข้อมูลไปกลับของเครือข่ายนั้น บ่อยครั้ง ระยะเวลารับส่งข้อมูลในเครือข่ายจะอยู่ที่ประมาณ 2-3 ร้อยมิลลิวินาที และในเครือข่ายแบบใช้สาย เวลาในการตอบสนองจะใกล้เคียงกับแบบสมมาตร ซึ่งส่งผลให้ผู้ใช้แทบไม่สังเกตเห็นระดับความไม่ถูกต้อง อย่างไรก็ตาม มือถือหรือโทรศัพท์วิทยุมีหลายขั้นตอนที่ มีระยะเวลาค่อนข้างนาน การหน่วงเวลาแบบอสมมาตรอาจแทรกเข้าไปในธุรกรรมของเครือข่าย ซึ่งทำให้เกิดความไม่ถูกต้องมากขึ้น

เมื่อตั้งค่าเริ่มต้นของ AOSP สำหรับ config_ntpTimeout เป็น 5000 มิลลิวินาที และหากเวลาในการตอบสนองทั้งหมดของเครือข่ายมุ่งเน้นที่ขาเข้าหรือขาออกเพียงอย่างเดียว ความคลาดเคลื่อนสูงสุดตามทฤษฎีจะอยู่ที่ประมาณ 2.5 วินาที

ความแม่นยำของนาฬิการะบบโดยรวมยังขึ้นอยู่กับความสามารถของอุปกรณ์ Android ในติดตามเวลาที่ผ่านไปอย่างถูกต้องหลังจากที่ได้รับสัญญาณเวลา ปัญหานี้เกี่ยวข้องกับการจับเวลาทั้งหมดใน Android ไม่ใช่แค่การตรวจหาเวลาของเครือข่าย และเป็นเหตุผลที่บริการ time_detector ไม่สนใจการแนะนำเวลาเก่า บริการ network_time_update_service จะรีเฟรชเป็นประจำโดยใช้ช่วงเวลา config_ntpPollingInterval เพื่อให้บริการ time_detector มีข้อมูลการแนะนำเวลาล่าสุดอยู่เสมอ และเพื่อให้มั่นใจว่าบริการ time_detector จะไม่กลับไปใช้แหล่งที่มาของเวลาที่มีลำดับความสำคัญต่ำกว่าและมักมีความแม่นยำต่ำกว่า หรือแหล่งที่มาของเวลาที่ไม่ถูกต้องเป็นครั้งคราว เช่น telephony

เมื่อใช้การตรวจหาเวลาอัตโนมัติ ความแม่นยำของนาฬิการะบบของอุปกรณ์อาจได้รับผลกระทบจากการกําหนดค่าอื่นๆ ของบริการ time_detector เช่น ค่าคงที่และ Flag ที่ส่งผลต่อความแตกต่างของเวลาแนะนําจากเวลาปัจจุบันของนาฬิการะบบก่อนที่จะปรับนาฬิกา (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