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

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

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

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

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



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

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

ट्रांसफ़र में अचानक हुई बढ़ोतरी की वजह का बेहतर तरीके से पता लगाने के लिए, ट्रैफ़िक के आंकड़े दिखाने वाला एपीआई, 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 से यह पता चल सकता है कि आपका ऐप्लिकेशन, मोबाइल नेटवर्क के रेडियो का इस्तेमाल आपकी उम्मीद से ज़्यादा बार कर रहा है या नहीं. Battery Historian का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, Batterystats और Battery Historian की मदद से, बैटरी के इस्तेमाल की प्रोफ़ाइल बनाना लेख पढ़ें.