नेटवर्क चुनना

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

नेटवर्क चुनने का तरीका

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

Android 12

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

नेटवर्क एजेंट (NetworkAgent), POLICY_TRANSPORT_PRIMARY फ़्लैग का इस्तेमाल करके यह बताता है कि एक ही ट्रांसपोर्ट के कई नेटवर्क मौजूद होने पर, किस नेटवर्क को प्राथमिकता दी जाए. इसका एक उदाहरण, ड्यूअल सिम वाला डिवाइस है. इसमें सेटिंग में एक स्विच होता है, जिससे उपयोगकर्ता यह चुन सकता है कि डिफ़ॉल्ट रूप से किस सिम कार्ड का इस्तेमाल करना है. किसी ट्रांसपोर्ट में, Android उस नेटवर्क को प्राथमिकता देता है जिस पर POLICY_TRANSPORT_PRIMARY वाला फ़्लैग लगा हो.

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

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

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

नेटवर्क चुनने की सुविधा, AOSP में कनेक्टिविटी मॉड्यूल में लागू की गई है. नेटवर्क चुनने के लिए नीति का लॉजिक, NetworkRanker क्लास और उसकी हेल्पर क्लास में मिलता है. इसका मतलब है कि डिवाइस मैन्युफ़ैक्चरर, नेटवर्क चुनने के कोड को सीधे तौर पर पसंद के मुताबिक नहीं बना सकते. इसके बजाय, उन्हें नेटवर्क के बारे में ज़रूरी जानकारी देने के लिए, NetworkScore में फ़्लैग का इस्तेमाल करना होगा.

Android 11

Android 11 या इससे पहले के वर्शन वाले डिवाइसों के लिए, Android नेटवर्क एजेंट (NetworkAgent) के लागू होने से भेजे गए साधारण पूर्णांक के आधार पर नेटवर्क चुनता है. हर अनुरोध के लिए, Android सबसे ज़्यादा अंकों वाले उस नेटवर्क को चुनता है जो अनुरोध को पूरा कर सकता है. यह अंकों वाला स्कोर, नेटवर्क एजेंट से भेजे गए पूर्णांक के साथ-साथ कई शर्तों के आधार पर दिए गए अतिरिक्त बोनस या दंड से मिलकर बनता है. जैसे, नेटवर्क की पुष्टि की गई है या नहीं या नेटवर्क वीपीएन है या नहीं. नीति से जुड़े फ़ैसले लेने के लिए, अलग-अलग नेटवर्क एजेंट एक-दूसरे के साथ सिंक होते हैं.

अगर दो नेटवर्क किसी अनुरोध को दिखा सकते हैं और उनका अंकों वाला स्कोर एक जैसा है, तो व्यवहार तय नहीं किया जाता.

NetworkScore क्लास

नेटवर्क चुनने की सुविधा के लिए मुख्य क्लास, NetworkScore है. इस क्लास में, उपलब्ध फ़्लैग और setKeepConnectedReason के तरीके के लिए एपीआई और दस्तावेज़ शामिल हैं.

NetworkScore क्लास को उसकी बिल्डर क्लास के ज़रिए बनाया जाना चाहिए. साथ ही, शुरू करने पर, उसे NetworkAgent कंस्ट्रक्टर को पास किया जाना चाहिए. नेटवर्क के स्कोर को किसी भी समय अपडेट किया जा सकता है. इसके लिए, NetworkAgent#sendNetworkScore वाला तरीका अपनाएं.

नेटवर्क एजेंट लागू करने के उदाहरण

AOSP में, अलग-अलग नेटवर्क एजेंट को लागू करने के उदाहरण शामिल हैं. यहां दिए गए उदाहरणों में,

  • TelephonyNetworkAgent: मोबाइल नेटवर्क के लिए नीति के बारे में बताने के लिए, नेटवर्क स्कोर का इस्तेमाल करता है
  • ClientModeImpl.WifiNetworkAgent: वाई-फ़ाई नेटवर्क की नीति के बारे में बताने के लिए, नेटवर्क स्कोर का इस्तेमाल करता है. इस लागू करने के तरीके में, POLICY_EXITING फ़्लैग का इस्तेमाल करके नेटवर्क स्कोर के लिए, लेगसी इंटिजर के साथ बैकवर्ड कम्पैटिबिलिटी शामिल है.

Android 12 पर अपग्रेड किए जा रहे डिवाइस

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

इंटरनल NetworkFactory क्लास का इस्तेमाल करने वाले नेटवर्क एजेंट को, अपने स्कोर फ़िल्टर को NetworkScore ऑब्जेक्ट में दिखाना होगा. यह ऑब्जेक्ट, फ़ैक्ट्री के बनाए जा सकने वाले नेटवर्क के सबसे बेहतर स्कोर को दिखाता है. ऐसा इसलिए है, क्योंकि Android 12 में NetworkFactory क्लास, Android 11 और उससे पहले के वर्शन में सभी अनुरोधों के बजाय, सिर्फ़ उन अनुरोधों को पास करती है जो NetworkFactory के लिए तय किए गए स्कोर फ़िल्टर से मैच करते हैं.

हमारा सुझाव है कि आसानी से लागू करने और बैटरी बचाने के लिए, कोई फ़िल्टर पास करें, ताकि सभी अनुरोध NetworkFactory को पास न किए जाएं. हालांकि, अगर आपके कस्टम लागू करने के लिए ज़रूरी है कि सभी अनुरोध NetworkFactory को भेजे जाएं, तो सामान्य NetworkFactory.register तरीके के बजाय, NetworkFactory.registerIgnoringScore को रजिस्टर किया जा सकता है. इस तरीके का इस्तेमाल करते समय, हमारा सुझाव है कि आप स्कोर फ़िल्टर पास करें. इससे फ़ैक्ट्री, बैटरी बचाने के लिए, उन अनुरोधों का आकलन किए बिना सबसे अच्छा स्कोर बना सकती है जिन्हें फ़ैक्ट्री पूरा नहीं कर सकती.

पुष्टि करें

Android डिवाइस पर नेटवर्क चुनने के तरीके की पुष्टि करने के लिए, इन जांचों का इस्तेमाल करें:

गलत तरीके से लागू करने पर, ऐप्लिकेशन को NetworkCallback का इस्तेमाल करने पर, अनचाहे नेटवर्क मिल सकते हैं. इनमें डिवाइस का डिफ़ॉल्ट नेटवर्क भी शामिल है. यह वह नेटवर्क होता है जिसे सिस्टम, ऐप्लिकेशन के ConnectivityManager.registerDefaultNetworkCallback के साथ नेटवर्क कॉलबैक का इस्तेमाल करने पर भेजता है.

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