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

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

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

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

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



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

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

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

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

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

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