नेटवर्क के समय का पता लगाना

Android डिवाइस, नेटवर्क सोर्स से Unix epoch time की सही जानकारी अपने-आप पाने की कोशिश करते हैं. Android, समय की जानकारी पाने के लिए, Simple Network Time Protocol (SNTP) का इस्तेमाल करता है. यह प्रोटोकॉल, User Datagram Protocol (UDP) का इस्तेमाल करता है.

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

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

नेटवर्क टाइम की जानकारी पता लगाने वाला सिस्टम

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

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

network_time_update_service सेवा, इंटरनल एपीआई का इस्तेमाल करके, time_detector सेवा को नेटवर्क टाइम के सुझाव सबमिट करती है. इसके बाद, Android प्लैटफ़ॉर्म के अन्य कॉम्पोनेंट, नेटवर्क टाइम के इन सुझावों का इस्तेमाल करते हैं.

नेटवर्क टाइम ओरिजिन से सुझाव मिलने के बाद, time_detector सेवा यह तय करती है कि कॉन्फ़िगर किए गए प्राथमिकता के नियमों के मुताबिक, सिस्टम घड़ी को अपडेट करना है या नहीं.

सिस्टम घड़ी को अपने-आप सेट करने के लिए, नेटवर्क ओरिजिन के सुझावों का इस्तेमाल करने के लिए, समय की जानकारी अपने-आप पता लगाने वाले सिस्टम को कॉन्फ़िगर करने के लिए, core/res/res/values/config.xml सिस्टम सर्वर कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करें. पक्का करें कि config_autoTimeSourcesPriority में, network वैल्यू सही जगह पर मौजूद हो. ज़्यादा जानकारी के लिए, टाइम सोर्स की प्राथमिकता देखें.

डिवाइस कॉन्फ़िगरेशन

इस सेक्शन में, डिवाइस बनाने वाली कंपनियां, नेटवर्क टाइम की जानकारी पता लगाने वाले सिस्टम को कॉन्फ़िगर करने का तरीका जान सकती हैं.

AOSP का बुनियादी कॉन्फ़िगरेशन, config.xml फ़ाइल में होता है: frameworks/base/core/res/res/values/config.xml:

कॉन्फ़िगरेशन कुंजी AOSP की वैल्यू ब्यौरा
config_ntpRetry 3 रीफ़्रेश करने में गड़बड़ी होने के बाद, सिस्टम, नेटवर्क टाइम पोलिंग की कोशिश कितनी बार करता है. इसके लिए, वह कम एनपीटी पोलिंग इंटरवल (config_ntpPollingIntervalShorter) का इस्तेमाल करता है. इसके बाद, वह सामान्य पोलिंग इंटरवल (config_ntpPollingInterval) का इस्तेमाल करता है. अगर वैल्यू 0 से कम है, तो सिस्टम, एनपीटी पोलिंग के कम इंटरवल पर तब तक पोलिंग की कोशिश करता है, जब तक वह सफलतापूर्वक रीफ़्रेश नहीं हो जाता.
config_ntpPollingInterval 64800000 (18 घंटे) मिलीसेकंड में, नेटवर्क टाइम पोलिंग का सामान्य इंटरवल.
config_ntpPollingIntervalShorter 60000 (1 मिनट) मिलीसेकंड में, नेटवर्क टाइम पोलिंग का रीट्राइ इंटरवल. इसका इस्तेमाल, टाइम रीफ़्रेश करने में गड़बड़ी होने पर किया जाता है.
config_ntpServers एक एंट्री: ntp://time.android.com सटीक समय पाने के लिए, इस्तेमाल किए जाने वाले एनपीटी सर्वर. आइटम, ntp://<host>[:port] फ़ॉर्मैट में होने चाहिए.
यह, रजिस्टर किया गया IANA यूआरआई स्कीम नहीं है.
config_ntpTimeout 5000 टाइम आउट होने से पहले, एनपीटी सर्वर के जवाब का इंतज़ार करने का समय, मिलीसेकंड में.

सर्वर

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

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

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

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

सटीकता

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

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

config_ntpTimeout के लिए, AOSP की डिफ़ॉल्ट सेटिंग 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 सेवा से मिली समय की जानकारी का इस्तेमाल इन कॉम्पोनेंट से किया जाता है:

  • The 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