নেটওয়ার্ক সমস্যা সমাধান করুন

একটি অ্যাপ থেকে উৎপন্ন নেটওয়ার্ক ট্র্যাফিক ডিভাইসের ব্যাটারি লাইফের উপর উল্লেখযোগ্য প্রভাব ফেলতে পারে। সেই ট্র্যাফিককে অপ্টিমাইজ করতে, আপনাকে এটি পরিমাপ করতে হবে এবং এর উৎস শনাক্ত করতে হবে। নেটওয়ার্ক রিকোয়েস্ট সরাসরি ব্যবহারকারীর কোনো কার্যকলাপ থেকে, আপনার নিজের অ্যাপ কোড থেকে, অথবা আপনার অ্যাপের সাথে যোগাযোগকারী কোনো সার্ভার থেকে আসতে পারে।

এই অধ্যায়ে আপনার নেটওয়ার্ক ট্র্যাফিক নিরীক্ষণ ও শ্রেণিবদ্ধ করার পদ্ধতি দেখানো হয়েছে এবং সমস্যা শনাক্ত ও সমাধান করার জন্য নির্দেশনা প্রদান করা হয়েছে।

অনুরোধগুলি নিরীক্ষণ করতে নেটওয়ার্ক প্রোফাইলার ব্যবহার করুন।

আপনার অ্যাপ্লিকেশনের নেটওয়ার্ক অনুরোধগুলো ট্র্যাক করতে নেটওয়ার্ক প্রোফাইলার ব্যবহার করুন। এর মাধ্যমে আপনি পর্যবেক্ষণ করতে পারবেন যে আপনার অ্যাপ কীভাবে এবং কখন ডেটা স্থানান্তর করে এবং সেই অনুযায়ী অন্তর্নিহিত কোডটি অপ্টিমাইজ করতে পারবেন।



চিত্র ১. নেটওয়ার্ক ট্র্যাফিক পর্যবেক্ষণ। নেটওয়ার্ক ট্র্যাফিকের ধরণ থেকে বোঝা যায় যে, অনুরোধ প্রিফেচ করার মাধ্যমে অথবা আপলোডগুলো বান্ডল করার মাধ্যমে কার্যকারিতা ব্যাপকভাবে উন্নত করা যেতে পারে।

আপনার ডেটা স্থানান্তরের হার এবং প্রতিটি সংযোগের সময় স্থানান্তরিত ডেটার পরিমাণ পর্যবেক্ষণ করে, আপনি আপনার অ্যাপ্লিকেশনের সেই ক্ষেত্রগুলি চিহ্নিত করতে পারেন যেগুলিকে আরও ব্যাটারি-সাশ্রয়ী করা যেতে পারে। সাধারণত, আপনি এমন স্বল্পস্থায়ী বৃদ্ধি খুঁজবেন যেগুলিকে বিলম্বিত করা সম্ভব।

ডেটা ট্রান্সফারের আকস্মিক বৃদ্ধির কারণ আরও ভালোভাবে শনাক্ত করার জন্য, ট্র্যাফিক স্ট্যাটস এপিআই আপনাকে TrafficStats.setThreadStatsTag() ব্যবহার করে একটি নির্দিষ্ট থ্রেডের মধ্যে কোনো সকেট থেকে হওয়া ডেটা ট্রান্সফারগুলোকে ট্যাগ করার সুযোগ দেয়। এই ফাংশনটি কল করলে কোনো নির্দিষ্ট থ্রেডের সমস্ত ট্র্যাফিক স্বয়ংক্রিয়ভাবে ট্যাগ হয়ে যায় না; ট্যাগগুলো সকেটগুলোতে প্রয়োগ করতে হয়।

একবার থ্রেড ট্যাগ সেট করা হয়ে গেলে, আপনি TrafficStats.tagSocket() এবং TrafficStats.untagSocket() ব্যবহার করে ম্যানুয়ালি স্বতন্ত্র সকেট ট্যাগ এবং আনট্যাগ করতে পারেন। থ্রেডে কোনো সকেট খোলা হলে, অথবা কোনো সার্ভার সকেট সংযোগ গ্রহণ করলে, একটি ট্যাগ প্রয়োগ করা হয়।

একাধিক থ্রেড দ্বারা একই সকেটে যুগপৎ অ্যাক্সেসের ক্ষেত্রে, নেটওয়ার্ক প্যাকেট পাঠানো বা গ্রহণ করার সময় সকেটটির যে ট্যাগটি ছিল, সেটিই ব্যবহৃত হবে (যা বাফারিং এবং পুনঃপ্রেরণের কারণে, ব্যবহারকারীর ডেটা লেখা বা পড়ার সময়ের ট্যাগ থেকে ভিন্ন হতে পারে)।

উদাহরণস্বরূপ, আপনি বিভিন্ন ধরণের নেটওয়ার্ক ট্র্যাফিককে উপস্থাপন করার জন্য কনস্ট্যান্ট নির্ধারণ করতে পারেন, যেমনটি নিম্নলিখিত কোড নমুনায় দেখানো হয়েছে:

কোটলিন

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

জাভা

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

এরপর আপনি সেই অনুযায়ী আপনার নেটওয়ার্ক অনুরোধগুলোকে ট্যাগ করতে পারেন:

কোটলিন

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

জাভা

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

HttpURLConnection লাইব্রেরিটি বর্তমান TrafficStats.getThreadStatsTag() মানের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে সকেট ট্যাগ করে। নিম্নলিখিত কোড নমুনায় দেখানো অনুযায়ী, লাইব্রেরিটি কিপ-অ্যালাইভ পুলের মাধ্যমে রিসাইকেল করার সময়ও সকেট ট্যাগ ও আনট্যাগ করে থাকে:

কোটলিন

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

জাভা

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

নেটওয়ার্ক ট্র্যাফিকের প্রকারভেদ বিশ্লেষণ করুন

আপনার অ্যাপ থেকে তৈরি হওয়া নেটওয়ার্ক ট্র্যাফিক পর্যালোচনা করার সময়, সেটির উৎস বোঝা প্রয়োজন, যাতে আপনি সেটিকে যথাযথভাবে অপ্টিমাইজ করতে পারেন। আপনার অ্যাপের ঘন ঘন নেটওয়ার্ক কার্যকলাপ সম্পূর্ণ উপযুক্ত হতে পারে যদি এটি ব্যবহারকারীর কোনো কাজের প্রতিক্রিয়া হিসেবে ঘটে, কিন্তু এটি পুরোপুরি অনুপযুক্ত হতে পারে যদি আপনার অ্যাপটি ফোরগ্রাউন্ডে না থাকে অথবা ডিভাইসটি পকেট বা পার্সে থাকে।

ব্যবহারকারী-প্রবর্তিত ট্র্যাফিক বিশ্লেষণ করুন

যখন কোনো ব্যবহারকারী আপনার অ্যাপের মধ্যে একটি নির্দিষ্ট কাজ সম্পাদন করেন, তখন তার দ্বারা সৃষ্ট নেটওয়ার্ক ট্র্যাফিক দক্ষতার সাথে একত্রিত হতে পারে, অথবা যখন ব্যবহারকারী আপনার অ্যাপের প্রয়োজনীয় অতিরিক্ত তথ্যের জন্য অনুরোধ করেন, তখন তা অসংলগ্নভাবে ছড়িয়ে পড়তে পারে। ব্যবহারকারী-প্রবর্তিত নেটওয়ার্ক ট্র্যাফিক বিশ্লেষণ করার ক্ষেত্রে আপনার লক্ষ্য হলো সময়ের সাথে সাথে ঘন ঘন নেটওয়ার্ক ব্যবহারের ধরণগুলো খুঁজে বের করা এবং অনুরোধগুলোকে একত্রিত করার মাধ্যমে এর পুনরাবৃত্তি কমানোর চেষ্টা করা।

ব্যবহারকারীর অনুরোধের অনিশ্চয়তার কারণে আপনার অ্যাপে এই ধরনের নেটওয়ার্ক ব্যবহার অপ্টিমাইজ করা কঠিন হয়ে পড়ে। এছাড়াও, ব্যবহারকারীরা যখন সক্রিয়ভাবে কোনো অ্যাপ ব্যবহার করেন, তখন তাঁরা দ্রুত প্রতিক্রিয়া আশা করেন, তাই দক্ষতার জন্য অনুরোধে বিলম্ব করলে ব্যবহারকারীর অভিজ্ঞতা খারাপ হতে পারে। সাধারণভাবে, যখন কোনো ব্যবহারকারী সরাসরি আপনার অ্যাপের সাথে ইন্টারঅ্যাক্ট করছেন, তখন নেটওয়ার্কের দক্ষ ব্যবহারের চেয়ে ব্যবহারকারীকে দ্রুত প্রতিক্রিয়া জানানোকে অগ্রাধিকার দেওয়া উচিত।

ব্যবহারকারী-প্রবর্তিত ট্র্যাফিক অপ্টিমাইজ করার সুপারিশের জন্য, 'ব্যবহারকারী-প্রবর্তিত অনুরোধ অপ্টিমাইজ করুন ' দেখুন।

অ্যাপ-প্রবর্তিত ট্র্যাফিক বিশ্লেষণ করুন

অ্যাপ-চালিত নেটওয়ার্ক ট্র্যাফিক সাধারণত এমন একটি ক্ষেত্র, যেখানে আপনি নেটওয়ার্ক ব্যান্ডউইথের কার্যকর ব্যবহারে উল্লেখযোগ্য প্রভাব ফেলতে পারেন। আপনার অ্যাপের নেটওয়ার্ক কার্যকলাপ বিশ্লেষণ করার সময়, নিষ্ক্রিয়তার সময়কালগুলো লক্ষ্য করুন এবং নির্ধারণ করুন যে সেগুলো বাড়ানো যায় কিনা। যদি আপনি আপনার অ্যাপ থেকে ধারাবাহিক নেটওয়ার্ক অ্যাক্সেসের প্যাটার্ন দেখতে পান, তবে এই ট্র্যাফিককে ব্যাচ করার চেষ্টা করুন, যাতে কার্যকলাপের সময়কালের মাঝে ডিভাইস রেডিও লো-পাওয়ার মোডে ফিরে যেতে পারে।

অ্যাপ-প্রবর্তিত ট্র্যাফিক অপ্টিমাইজ করার সুপারিশের জন্য, 'অ্যাপ-প্রবর্তিত অনুরোধ অপ্টিমাইজ করুন ' দেখুন।

সার্ভার-প্রবর্তিত ট্র্যাফিক বিশ্লেষণ করুন

আপনার অ্যাপের সাথে যোগাযোগকারী সার্ভারগুলো দ্বারা শুরু হওয়া নেটওয়ার্ক কার্যকলাপও সাধারণত এমন একটি ক্ষেত্র, যেখানে আপনি নেটওয়ার্ক ব্যান্ডউইথের কার্যকর ব্যবহারে উল্লেখযোগ্য প্রভাব ফেলতে পারেন। ফায়ারবেস ক্লাউড মেসেজিং (FCM) হলো একটি হালকা ব্যবস্থা যা একটি সার্ভার থেকে কোনো নির্দিষ্ট অ্যাপ ইনস্ট্যান্সে ডেটা প্রেরণের জন্য ব্যবহৃত হয়। FCM ব্যবহার করে, আপনার সার্ভার কোনো নির্দিষ্ট ডিভাইসে চলমান আপনার অ্যাপকে জানাতে পারে যে সেটির জন্য নতুন ডেটা উপলব্ধ হয়েছে।

সার্ভার-প্রবর্তিত ট্র্যাফিক অপ্টিমাইজ করার সুপারিশের জন্য, 'সার্ভার-প্রবর্তিত অনুরোধ অপ্টিমাইজ করুন ' দেখুন।

নেটওয়ার্ক ট্র্যাফিকের প্রভাব দেখতে ব্যাটারি হিস্টোরিয়ান ব্যবহার করুন।

ব্যাটারি হিস্টোরিয়ান হলো এমন একটি টুল যা একটি নির্দিষ্ট সময় ধরে কোনো ডিভাইসের ব্যাটারি ব্যবহারের চিত্র তুলে ধরে। আপনার নেটওয়ার্ক কার্যকলাপ কীভাবে ব্যাটারি খরচকে প্রভাবিত করে, তা বিশ্লেষণ করতে আপনি এই টুলটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, ব্যাটারি হিস্টোরিয়ান আপনাকে দেখাতে পারে যে আপনার অ্যাপটি আপনার প্রত্যাশার চেয়ে বেশি ঘন ঘন সেলুলার রেডিও ব্যবহার করছে কি না। ব্যাটারি হিস্টোরিয়ান ব্যবহার সম্পর্কে আরও তথ্যের জন্য, “ব্যাটারিস্ট্যাটস এবং ব্যাটারি হিস্টোরিয়ান দিয়ে ব্যাটারির ব্যবহার প্রোফাইল করুন” দেখুন।