नेटवर्क से जुड़ी समस्याओं को हल करना

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

इस विषय में, नेटवर्क ट्रैफ़िक पर नज़र रखने और उसे कैटगरी में बांटने का तरीका बताया गया है. साथ ही, समस्याओं की पहचान करने और उन्हें हल करने के बारे में जानकारी दी गई है.

अनुरोधों को मॉनिटर करने के लिए, नेटवर्क प्रोफ़ाइलर का इस्तेमाल करना

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



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

डेटा ट्रांसफ़र की फ़्रीक्वेंसी और हर कनेक्शन के दौरान ट्रांसफ़र किए गए डेटा की मात्रा पर नज़र रखकर, अपने ऐप्लिकेशन के उन हिस्सों की पहचान की जा सकती है जिन्हें बैटरी के लिहाज़ से ज़्यादा बेहतर बनाया जा सकता है. आम तौर पर, आपको ऐसे छोटे स्पाइक देखने को मिलेंगे जिनमें देरी हो सकती है.

डेटा ट्रांसफ़र में अचानक होने वाली बढ़ोतरी की वजह का बेहतर तरीके से पता लगाने के लिए, Traffic Stats API आपको TrafficStats.setThreadStatsTag() का इस्तेमाल करके, किसी थ्रेड में मौजूद सॉकेट से होने वाले डेटा ट्रांसफ़र को टैग करने की सुविधा देता है. इस फ़ंक्शन को कॉल करने से, किसी खास थ्रेड के लिए सभी ट्रैफ़िक को अपने-आप टैग नहीं किया जाता. टैग को सॉकेट पर लागू करना ज़रूरी है.

थ्रेड टैग सेट करने के बाद, अलग-अलग सॉकेट को मैन्युअल तरीके से टैग और अनटैग किया जा सकता है. इसके लिए, TrafficStats.tagSocket() और TrafficStats.untagSocket() का इस्तेमाल करें. अगर थ्रेड पर कोई सॉकेट खोला जाता है या कोई सर्वर सॉकेट कनेक्शन स्वीकार करता है, तो भी टैग लागू किया जाता है.

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

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

Kotlin

const val USER_INITIATED = 0x1000
const val APP_INITIATED = 0x2000
const val SERVER_INITIATED = 0x3000

Java

public static final int USER_INITIATED = 0x1000;
public static final int APP_INITIATED = 0x2000;
public static final int SERVER_INITIATED = 0x3000;

इसके बाद, नेटवर्क के अनुरोधों को इस तरह टैग किया जा सकता है:

Kotlin

TrafficStats.setThreadStatsTag(USER_INITIATED)
TrafficStats.tagSocket(outputSocket)
// Transfer data using socket
TrafficStats.untagSocket(outputSocket)

Java

TrafficStats.setThreadStatsTag(USER_INITIATED);
TrafficStats.tagSocket(outputSocket);
// Transfer data using socket
TrafficStats.untagSocket(outputSocket);

HttpURLConnection लाइब्रेरी, मौजूदा TrafficStats.getThreadStatsTag() वैल्यू के आधार पर सॉकेट को अपने-आप टैग करती है. लाइब्रेरी, सॉकेट को टैग और अनटैग भी करती है. ऐसा तब होता है, जब सॉकेट को कीप-अलाइव पूल की मदद से रीसाइकल किया जाता है. इसके बारे में यहां दिए गए कोड सैंपल में बताया गया है:

Kotlin

class IdentifyTransferSpikeTask {
    @WorkerThread
    fun request(url: String) {
        TrafficStats.setThreadStatsTag(APP_INITIATED)
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag()
    }
}

Java

public class IdentifyTransferSpikeTask {
    @WorkerThread
    public void request(String url) {
        TrafficStats.setThreadStatsTag(APP_INITIATED);
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag();
    }
}

नेटवर्क ट्रैफ़िक के टाइप का विश्लेषण करना

अपने ऐप्लिकेशन से जनरेट हुए नेटवर्क ट्रैफ़िक को देखते समय, आपको ट्रैफ़िक के सोर्स को समझना होगा, ताकि आप उसे सही तरीके से ऑप्टिमाइज़ कर सकें. अगर आपका ऐप्लिकेशन, उपयोगकर्ता की कार्रवाइयों के जवाब में नेटवर्क पर की जाने वाली गतिविधि बार-बार करता है, तो यह सही है. हालांकि, अगर आपका ऐप्लिकेशन फ़ोरग्राउंड में नहीं है या डिवाइस जेब या पर्स में है, तो यह गलत है.

उपयोगकर्ता की ओर से शुरू किए गए ट्रैफ़िक का विश्लेषण करना

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

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

उपयोगकर्ता की ओर से शुरू किए गए ट्रैफ़िक को ऑप्टिमाइज़ करने के सुझावों के लिए, उपयोगकर्ता की ओर से शुरू किए गए अनुरोधों को ऑप्टिमाइज़ करना लेख पढ़ें.

ऐप्लिकेशन से शुरू किए गए ट्रैफ़िक का विश्लेषण करना

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

ऐप्लिकेशन से शुरू होने वाले ट्रैफ़िक को ऑप्टिमाइज़ करने के सुझावों के लिए, ऐप्लिकेशन से शुरू होने वाले अनुरोधों को ऑप्टिमाइज़ करना लेख पढ़ें.

सर्वर से शुरू किए गए ट्रैफ़िक का विश्लेषण करना

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

सर्वर से शुरू किए गए ट्रैफ़िक को ऑप्टिमाइज़ करने के सुझावों के लिए, सर्वर से शुरू किए गए अनुरोधों को ऑप्टिमाइज़ करना लेख पढ़ें.

नेटवर्क ट्रैफ़िक के असर को विज़ुअलाइज़ करने के लिए, Battery Historian का इस्तेमाल करना

Battery Historian एक ऐसा टूल है जो किसी समयावधि के दौरान, डिवाइस की बैटरी खर्च होने की जानकारी दिखाता है. इस टूल का इस्तेमाल करके, यह विश्लेषण किया जा सकता है कि नेटवर्क पर की जाने वाली गतिविधि से बैटरी खर्च पर क्या असर पड़ता है. उदाहरण के लिए, Battery Historian आपको यह दिखा सकता है कि आपका ऐप्लिकेशन, सेल्युलर रेडियो का इस्तेमाल आपकी उम्मीद से ज़्यादा बार कर रहा है या नहीं. बैटरी हिस्टोरियन का इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, बैटरी स्टैटिस्टिक्स और बैटरी हिस्टोरियन की मदद से बैटरी खर्च की प्रोफ़ाइल बनाना लेख पढ़ें.