नेटवर्क के समय का पता लगाने की सुविधा

Android डिवाइस, किसी नेटवर्क सोर्स से अपने-आप सही Unix epoch टाइम पाने की कोशिश करते हैं. Android, समय की जानकारी पाने के लिए एसएनटीपी प्रोटोकॉल का इस्तेमाल करता है. यह प्रोटोकॉल, यूडीपी प्रोटोकॉल का इस्तेमाल करता है.

इस पेज पर बताए गए कॉम्पोनेंट, समय का पता अपने-आप लगाने वाले सिस्टम का हिस्सा हैं. इसे नेटवर्क टाइम ऑरिजिन कहा जाता है. नेटवर्क टाइम सर्वर से मिले टाइम सिग्नल का इस्तेमाल, Android डिवाइस की सिस्टम घड़ी को सेट करने के लिए किया जा सकता है. ऐसा तब किया जा सकता है, जब डिवाइस पर समय का अपने-आप पता चलने की सुविधा काम करती हो और time_detector सेवा को इसका इस्तेमाल करने के लिए कॉन्फ़िगर किया गया हो.

डिफ़ॉल्ट रूप से, Android नेटवर्क टाइम ऑरिजिन का इस्तेमाल, समय का अपने-आप पता लगाने वाले मुख्य ऑरिजिन के तौर पर करता है.

नेटवर्क टाइम डिटेक्शन सिस्टम

network_time_update_service सेवा, जो Android सिस्टम सर्वर में चलती है उसमें नेटवर्क टाइम डिटेक्शन सिस्टम लागू किया जाता है. यह सेवा, समय-समय पर किसी सर्वर से समय का सिग्नल पाने के लिए, एसएनटीपी का इस्तेमाल करती है. यह सेवा, नेटवर्क कनेक्टिविटी को भी मॉनिटर करती है और लंबे समय तक खराब कनेक्टिविटी के बाद भी, हाल ही का कोई सिग्नल उपलब्ध न होने पर रीफ़्रेश ट्रिगर करती है.

network_time_update_service सेवा, बूट होने के बाद और नेटवर्क कनेक्टिविटी पहली बार सेट अप होने पर, समय का सिग्नल पाने की कोशिश करती है. इसके बाद, सेवा अपने पास मौजूद सबसे नए सिग्नल को अपडेट रखने की कोशिश करती है. यह अलग-अलग Android डिवाइसों की ज़रूरतों को, दुनिया भर के कई Android डिवाइसों के समय को रीफ़्रेश करने से होने वाले भारी लोड के साथ संतुलित करता है.

इंटरनल एपीआई का इस्तेमाल करके, 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 (एक मिनट) नेटवर्क टाइम को फिर से पॉलिंग करने के लिए मिलीसेकंड में इंटरवल. इसका इस्तेमाल तब किया जाता है, जब समय रीफ़्रेश नहीं हो पाता.
config_ntpServers एक एंट्री: ntp://time.android.com सटीक समय पाने के लिए इस्तेमाल किए जाने वाले NTP सर्वर. आइटम इस फ़ॉर्मैट में होना चाहिए: ntp://<host>[:port].
यह रजिस्टर की गई IANA यूआरआई स्कीम नहीं है.
config_ntpTimeout 5000 टाइम आउट से पहले, NTP सर्वर के जवाब का इंतज़ार करने के लिए, मिलीसेकंड में तय किया गया समय.

सर्वर

डिफ़ॉल्ट रूप से, AOSP time.android.com पर टाइम सर्वर का इस्तेमाल करता है. यह Google Public NTP का दूसरा नाम है. इस सेवा के लिए कोई सेवा स्तर समझौता (एसएलए) नहीं है. ज़्यादा जानकारी के लिए, Google के सार्वजनिक एनटीपी के बारे में अक्सर पूछे जाने वाले सवाल देखें.

एक से ज़्यादा सर्वर की सुविधा

Android 14 और उसके बाद के वर्शन के लिए, फ़्रेमवर्क कई NTP सर्वर के साथ काम करता है. यह उन स्थितियों में काम करता है जहां डिवाइसों को एक ही कॉन्फ़िगरेशन के साथ दुनिया भर में डिस्ट्रिब्यूट किया जाता है, लेकिन time.android.com जैसे सर्वर का ऐक्सेस कुछ जगहों पर प्रतिबंधित होता है.

एल्गोरिदम, config_ntpServers कॉन्फ़िगरेशन कुंजी में बताए गए हर सर्वर को आज़माता है. जब सर्वर को कोई जवाब मिलता है, तो सिस्टम उसका इस्तेमाल तब तक करता रहता है, जब तक वह रीफ़्रेश नहीं होता या डिवाइस फिर से चालू नहीं हो जाता.

 सटीक जानकारी

Android का डिफ़ॉल्ट नेटवर्क टाइम सिंक, SNTP का इस्तेमाल करता है. यह दिन में करीब एक बार, टाइम क्वेरी के साथ सिंक होता है. इससे यह पक्का करने की कोशिश की जाती है कि डिवाइस पर हमेशा अप-टू-डेट टाइम सिग्नल हो.

Android के SNTP लागू करने के साथ, समय में गड़बड़ी होने की सबसे बड़ी वजह नेटवर्क के इंतज़ार का समय है. SNTP, नेटवर्क में होने वाली देरी को एक जैसा मानता है. इसका मतलब है कि अनुरोध के लिए नेटवर्क में होने वाली देरी, जवाब के लिए नेटवर्क में होने वाली देरी के बराबर होती है. साथ ही, सही समय, नेटवर्क के राउंड ट्रिप के बीच में होता है. अक्सर, नेटवर्क का राउंड ट्रिप समय कुछ सौ मिलीसेकंड के आस-पास होता है. साथ ही, वायर वाले नेटवर्क पर इंतज़ार का समय करीब-करीब एक जैसा होता है. इस वजह से, डेटा में थोड़ी गड़बड़ी होती है, जो उपयोगकर्ताओं को महसूस नहीं होती. हालांकि, मोबाइल या रेडियो टेलीफ़ोनी में कई ऐसे चरण होते हैं जहां नेटवर्क लेन-देन में, अपेक्षाकृत लंबी और असमान देरी हो सकती है. इससे ज़्यादा गड़बड़ी हो सकती है.

config_ntpTimeout के लिए एओएसपी डिफ़ॉल्ट सेटिंग को 5000 मिलीसेकंड पर सेट किया जाता है. साथ ही, अगर नेटवर्क के इंतज़ार का समय सिर्फ़ इनबाउंड या आउटबाउंड लेग पर दिखाया जाता है, तो सबसे ज़्यादा गड़बड़ी करीब 2.5 सेकंड की होती है.

सिस्टम की घड़ी के सटीक होने पर भी, Android डिवाइस की समय सिग्नल मिलने के बाद, बीत चुके समय को सटीक तरीके से ट्रैक करने की क्षमता का असर पड़ता है. यह समस्या, नेटवर्क के ज़रिए समय का पता लगाने की सुविधा के साथ-साथ, Android पर समय सेट करने की सभी सुविधाओं के लिए ज़रूरी है. यही वजह है कि time_detector सेवा, समय के पुराने सुझावों को अनदेखा करती है. time_detector सेवा को नए समय के सुझावों के साथ बनाए रखने के लिए, network_time_update_service सेवा नियमित रूप से config_ntpPollingInterval इंटरवल का इस्तेमाल करके रीफ़्रेश करती है. साथ ही, यह पक्का करती है कि time_detector सेवा की प्राथमिकता कम न हो और अक्सर कम सटीक या कभी-कभी गलत टाइम ऑरिजिन, जैसे कि telephony पर सेट न हो.

समय का अपने-आप पता चलने की सुविधा का इस्तेमाल करने पर, डिवाइस की सिस्टम घड़ी के सटीक होने पर, time_detector सेवा के अन्य कॉन्फ़िगरेशन का असर पड़ सकता है. जैसे, कॉन्स्टेंट और फ़्लैग, जिनसे यह तय होता है कि घड़ी में बदलाव करने से पहले, समय का सुझाव, मौजूदा सिस्टम घड़ी के समय से कितना अलग होना चाहिए (ServiceConfigAccessorImpl.java).

डिवाइस बनाने वाली कंपनियां, पहले से मौजूद कॉन्फ़िगरेशन के विकल्पों और कॉन्स्टेंट का इस्तेमाल करके, सटीक जानकारी में बदलाव कर सकती हैं. हालांकि, प्लैटफ़ॉर्म पर SNTP लागू करने की सीमाओं के बारे में जानना ज़रूरी है. साथ ही, यह भी जानना ज़रूरी है कि ज़्यादा बार नेटवर्क ऑपरेशन करने से, बिजली की खपत पर क्या असर पड़ सकता है. इसके अलावा, डिवाइस पर चल रहे ऐप्लिकेशन पर, ज़्यादा बार होने वाले छोटे-मोटे क्लॉक अडजस्टमेंट का क्या असर पड़ सकता है और सर्वर लोड पर क्या असर पड़ सकता है.

नेटवर्क टाइम के अन्य इस्तेमाल

अगर network ऑरिजिन का इस्तेमाल करके, समय का अपने-आप पता लगाने की सुविधा कॉन्फ़िगर नहीं की गई है या उपयोगकर्ता ने समय का अपने-आप पता लगाने की सुविधा बंद कर दी है, तो network_time_update_service सेवा से मिले समय का इस्तेमाल अब भी इन कॉम्पोनेंट में किया जाता है:

  • SystemClock.currentNetworkTimeClock() तरीका.
  • प्लैटफ़ॉर्म के इंटरनल फ़ंक्शन. उदाहरण के लिए, अगर इसमें नेटवर्क के समय की जानकारी होती है, तो ए-जीपीएस, जीएनएसएस (जगह की जानकारी) का पता पहले तेज़ी से लगा सकता है.

डीबग करना और जांच करना

नीचे दिए गए सेक्शन में, नेटवर्क के समय का पता लगाने की सुविधा को डीबग करने और उसकी जांच करने के लिए, शेल कमांड के बारे में बताया गया है.

network_time_update_service सेवा के साथ इंटरैक्ट करना

network_time_update_service की मौजूदा स्थिति को हटाने के लिए, इसका इस्तेमाल करें:

adb shell cmd network_time_update_service dump

टेस्टिंग में मदद करने वाले कमांड लाइन विकल्पों का सेट देखने के लिए, इनका इस्तेमाल करें:

adb shell cmd network_time_update_service help