समय स्रोत प्राथमिकता

एंड्रॉइड फ्रेमवर्क समय सिंक्रनाइज़ेशन के लिए विभिन्न समय स्रोतों का उपयोग करता है। यह पृष्ठ नेटवर्क टाइम प्रोटोकॉल (NTP) और नेटवर्क आइडेंटिटी और टाइम ज़ोन (NITZ) स्वचालित समय स्रोतों पर केंद्रित है। Android 12 या उच्चतर में डिफ़ॉल्ट रूप से, फ्रेमवर्क NITZ की तुलना में NTP को समय स्रोत के रूप में प्राथमिकता देता है क्योंकि NTP NITZ की तुलना में अधिक सटीक और विश्वसनीय है। उन स्थितियों में जहां एनटीपी उपलब्ध नहीं है, ढांचा एनआईटीजेड पर वापस आ जाता है। यह प्लेटफ़ॉर्म के पुराने संस्करणों से डिफ़ॉल्ट प्राथमिकता का उलट है। डिफ़ॉल्ट रूप से Android 11 और उसके बाद के संस्करण में, फ्रेमवर्क NTP पर NITZ को प्राथमिकता देता है।

इस परिवर्तन के बारे में अधिक जानकारी के लिए, निम्नलिखित एओएसपी पैच देखें: 1563678 , 1513323

समय स्रोत प्राथमिकता को कॉन्फ़िगर करना

किसी विशिष्ट Android संस्करण के लिए डिफ़ॉल्ट रूप से कौन सा समय स्रोत प्राथमिकता लेता है, इसे कॉन्फ़िगर करने के लिए, config_autoTimeSourcesPriority कुंजी को frameworks/base/core/res/res/values/config.xml में बिल्ड समय पर कॉन्फ़िगर करें। समय स्रोत से समय सुझाव जो सूची में अधिक है, सूची में नीचे के स्रोतों पर पूर्वता लेता है।

कॉन्फ़िगर किए जा सकने वाले Android समय स्रोत TimeDetectorStrategy.java में पाए जाते हैं। निम्नलिखित स्रोत डिफ़ॉल्ट रूप से उपयोग के लिए कॉन्फ़िगर किए गए हैं:

  • टेलीफोनी (NITZ)
  • नेटवर्क (एनटीपी)

परिक्षण

यह सत्यापित करने के लिए कि एनटीपी उपलब्ध नहीं होने पर डिवाइस एनआईटीजेड का उपयोग करता है (जब मोबाइल डेटा और वाई-फाई अक्षम हो), निम्न कार्य करें:

  1. सुनिश्चित करें कि DUT में एक कार्यशील सिम है
  2. मोबाइल डेटा और वाई-फाई बंद करें
  3. सेल रेडियो बंद है यह सुनिश्चित करने के लिए डिवाइस को हवाई जहाज मोड में रखें
  4. स्वचालित समय का पता लगाना बंद करें
  5. भविष्य में घड़ी को मैन्युअल रूप से गलत समय मान पर सेट करें
  6. डिवाइस को रिबूट करें
  7. स्वचालित समय पहचान चालू करें
  8. डिवाइस को हवाई जहाज मोड से बाहर निकालें

ये कदम NITZ सिग्नल प्राप्त होते ही सिस्टम क्लॉक में बदलाव को ट्रिगर करते हैं। यह जांचने के लिए कि डिवाइस का समय कैसे सेट किया गया है, निम्न आदेश चलाएँ:

adb shell dumpsys time_detector

यह सत्यापित करने के लिए कि सिस्टम घड़ी NITZ का उपयोग करती है, कमांड आउटपुट में निम्नलिखित की पुष्टि करें:

  • mEnvironment.isAutoTimeDetectionEnabled() true
  • mEnvironment.autoOriginPriorities() में समय के स्रोतों की एक सूची होती है, जिसमें सूची में उच्च स्रोत वाले स्रोतों को सूची में नीचे के स्रोतों पर वरीयता दी जाती है।
  • Time change log सेक्शन दिखाता है कि सिस्टम क्लॉक एक टेलीफोनी सुझाव का उपयोग करके सेट किया गया है।
  • Telephony suggestion history खंड में समय के सुझाव हैं।
  • Network suggestion history अनुभाग खाली है।

Telephony suggestion history और Network suggestion history अनुभागों में समय के सुझावों को समय के लिए सत्य का स्रोत माना जाता है। यदि डिवाइस इंटरनेट से जुड़ा है और इसमें सिम कार्ड है, तो एनटीपी (नेटवर्क) और एनआईटीजेड (टेलीफोनी) दोनों का उपयोग करके सुझाव तैयार किए जाते हैं। इस परीक्षण मामले में, केवल Telephony suggestion history अनुभाग में सुझाव होते हैं क्योंकि NTP अक्षम है।

Time change log सेक्शन डिवाइस के सिस्टम क्लॉक में किए गए बदलावों और इस्तेमाल किए गए सुझावों को रिकॉर्ड करता है। सिस्टम क्लॉक को config_autoTimeSourcesPriority कुंजी में प्राथमिकता सूची में समय स्रोतों के क्रम के आधार पर सेट किया गया है। हालांकि, यदि सुझाव बहुत पुराना या अमान्य है, तो उच्च प्राथमिकता वाले स्रोत के सुझावों को अनदेखा किया जा सकता है। साथ ही, यदि सर्वोच्च प्राथमिकता वाला वैध सुझाव डिवाइस के वर्तमान सिस्टम क्लॉक टाइम से कुछ सेकंड के भीतर मेल खाता है, तो समय नहीं बदला जाएगा। इस परीक्षण मामले में, जब तक सुझाव पुराने न हों, तब तक सिस्टम क्लॉक को Telephony suggestion history के सुझावों में से किसी एक का उपयोग करके सेट किया जाता है।

निम्नलिखित आउटपुट का एक उदाहरण है जहां एनटीपी अनुपलब्ध होने पर डिवाइस एनआईटीजेड का उपयोग करने पर वापस आ जाता है।

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=73059
  mEnvironment.systemClockMillis()=1614186767818
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    {Empty}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}

संदर्भ के लिए परीक्षण परिदृश्य में आउटपुट की तुलना के रूप में, निम्नलिखित एक विशिष्ट आउटपुट का एक उदाहरण है जहां डिवाइस एनटीपी और एनआईटीजेड दोनों समय स्रोतों से समय के सुझाव प्राप्त करता है।

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=302926
  mEnvironment.systemClockMillis()=1614186997685
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}