নেটওয়ার্ক নির্বাচন

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

নেটওয়ার্ক নির্বাচন আচরণ

এই অংশে অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণ এবং অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) ও তার নিম্নতর সংস্করণ চালিত ডিভাইসগুলোর জন্য নেটওয়ার্ক নির্বাচন পদ্ধতি বর্ণনা করা হয়েছে।

অ্যান্ড্রয়েড ১২

অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে, অ্যান্ড্রয়েড উপলব্ধ নেটওয়ার্কগুলির মধ্যে থেকে নির্বাচন করার জন্য NetworkScore ক্লাস ব্যবহার করে। এই ক্লাসে এমন কিছু ফ্ল্যাগ থাকে যা নীতিগত সিদ্ধান্ত গ্রহণ করে। প্রতিটি ফ্ল্যাগ একটি নেটওয়ার্ক অ্যাট্রিবিউটকে প্রতিনিধিত্ব করে, যা নেটওয়ার্ক নির্বাচনের জন্য গুরুত্বপূর্ণ।

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

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

NetworkScore ক্লাসটি একটি নেটওয়ার্ক এজেন্টকে KEEP_CONNECTED_FOR_HANDOVER ফ্ল্যাগ এবং NetworkScore.Builder.setKeepConnectedReason মেথড ব্যবহার করে নেটওয়ার্ক সংযুক্ত রাখার জন্য অ্যান্ড্রয়েডকে নির্দেশ দেওয়ার সুযোগ দেয়। এই KEEP_CONNECTED_FOR_HANDOVER ফ্ল্যাগটি সম্ভাব্য নেটওয়ার্কগুলোকে সাহায্য করে। এই ফ্ল্যাগটি একটি নেটওয়ার্ক এজেন্টকে অ্যান্ড্রয়েড নেটওয়ার্কটির পারফরম্যান্স মূল্যায়ন না করা পর্যন্ত সেটিকে প্রাইমারি নেটওয়ার্ক না বানিয়েই একটি সেকেন্ডারি Wi-Fi STA-তে নেটওয়ার্কটি চালু করার সুযোগ দেয়। যদি কোনো নেটওয়ার্ক এজেন্ট এই ফ্ল্যাগটি নির্দেশ না দেয়, তবে এজেন্ট নেটওয়ার্কটির পারফরম্যান্স মূল্যায়ন করার আগেই অ্যান্ড্রয়েড কোনো অনুরোধ পূরণ না করার জন্য সম্ভাব্য নেটওয়ার্কগুলোকে বন্ধ করে দেয়।

যদি দুটি নেটওয়ার্ক একটি নির্দিষ্ট অনুরোধ পূরণ করতে পারে এবং তাদের পলিসি একই রকম হয়, তবে অ্যান্ড্রয়েড সেই নেটওয়ার্কটিকেই অগ্রাধিকার দেয় যেটি অনুরোধটি পূরণ করছে। যদি কোনো নেটওয়ার্কই অনুরোধটি পূরণ না করে, তবে অ্যান্ড্রয়েড দুটির মধ্যে একটিকে বেছে নেয়। পলিসি ফ্ল্যাগ পরিবর্তিত না হওয়া পর্যন্ত এই নেটওয়ার্কটিই অগ্রাধিকার পেতে থাকে।

অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (AOSP)-এর কানেক্টিভিটি মডিউলে নেটওয়ার্ক সিলেকশন ফিচারটি প্রয়োগ করা হয়েছে। নেটওয়ার্ক সিলেকশনের জন্য পলিসি লজিকটি NetworkRanker ক্লাস এবং এর হেল্পার ক্লাসগুলোতে থাকে। এর মানে হলো, ডিভাইস নির্মাতারা সরাসরি নেটওয়ার্ক সিলেকশন কোডটি কাস্টমাইজ করতে পারেন না। পরিবর্তে, নেটওয়ার্ক সম্পর্কিত তথ্য জানানোর জন্য তাদের অবশ্যই NetworkScore এর ফ্ল্যাগগুলো ব্যবহার করতে হয়।

অ্যান্ড্রয়েড ১১

অ্যান্ড্রয়েড ১১ বা তার নিচের সংস্করণে চালিত ডিভাইসগুলোর জন্য, অ্যান্ড্রয়েড একটি নেটওয়ার্ক এজেন্ট ( NetworkAgent ) থেকে পাঠানো একটি পূর্ণসংখ্যার উপর ভিত্তি করে নেটওয়ার্ক নির্বাচন করে। প্রতিটি অনুরোধের জন্য, অ্যান্ড্রয়েড সর্বোচ্চ সাংখ্যিক স্কোরযুক্ত সেই নেটওয়ার্কটি নির্বাচন করে যা অনুরোধটি পূরণ করতে পারে। এই সাংখ্যিক স্কোরটি নেটওয়ার্ক এজেন্টের পাঠানো পূর্ণসংখ্যা এবং অতিরিক্ত বোনাস বা পেনাল্টির সমন্বয়ে গঠিত হয়। অ্যান্ড্রয়েড বিভিন্ন শর্তের উপর ভিত্তি করে এই বোনাস বা পেনাল্টিগুলো প্রয়োগ করে, যেমন—নেটওয়ার্কটি যাচাইকৃত নাকি একটি ভিপিএন (VPN)। নীতিগত সিদ্ধান্ত নেওয়ার জন্য নেটওয়ার্ক এজেন্টরা একে অপরের সাথে সমন্বয় সাধন করে।

যদি দুটি নেটওয়ার্ক একটি নির্দিষ্ট অনুরোধ পূরণ করতে পারে এবং তাদের সাংখ্যিক স্কোর একই হয়, তবে তাদের আচরণ অনির্ধারিত।

নেটওয়ার্কস্কোর ক্লাস

NetworkScore ক্লাসটি নেটওয়ার্ক নির্বাচন বৈশিষ্ট্যের কেন্দ্রবিন্দু। এই ক্লাসে উপলব্ধ ফ্ল্যাগ এবং NetworkScore.Builder.setKeepConnectedReason মেথডের জন্য এপিআই ও ডকুমেন্টেশন রয়েছে।

আপনাকে অবশ্যই এর বিল্ডার ক্লাস ব্যবহার করে NetworkScore ক্লাসটি তৈরি করতে হবে এবং ইনিশিয়ালাইজেশনের সময় NetworkAgent কনস্ট্রাক্টরে তা পাস করতে হবে। আপনি NetworkAgent#sendNetworkScore মেথডটি ব্যবহার করে যেকোনো সময় নেটওয়ার্ক স্কোর আপডেট করতে পারেন।

নেটওয়ার্ক এজেন্ট বাস্তবায়নের উদাহরণ

AOSP-তে বিভিন্ন নেটওয়ার্ক এজেন্টের উদাহরণমূলক বাস্তবায়ন অন্তর্ভুক্ত রয়েছে। নিম্নলিখিত তালিকায় উদাহরণমূলক বাস্তবায়নগুলো দেওয়া হলো:

  • TelephonyNetworkAgent : মোবাইল নেটওয়ার্কের জন্য নীতি জানাতে নেটওয়ার্ক স্কোর ব্যবহার করে।
  • ClientModeImpl.WifiNetworkAgent : ওয়াই-ফাই নেটওয়ার্কের জন্য পলিসি জানাতে নেটওয়ার্ক স্কোর ব্যবহার করে। এই ইমপ্লিমেন্টেশনটি POLICY_EXITING ফ্ল্যাগ ব্যবহারের মাধ্যমে নেটওয়ার্ক স্কোরের জন্য ব্যবহৃত লিগ্যাসি ইন্টিজারের সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটি প্রদান করে।

অ্যান্ড্রয়েড ১২-এ আপগ্রেড করা ডিভাইসগুলি

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

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

বাস্তবায়ন সহজ করতে এবং ব্যাটারি বাঁচাতে আপনি একটি ফিল্টার পাস করতে পারেন, যা নিশ্চিত করে যে NetworkFactory সমস্ত অনুরোধ প্রসেস করবে না। তবে, যদি আপনার কাস্টম বাস্তবায়নের জন্য সমস্ত অনুরোধ NetworkFactory তে পাঠানোর প্রয়োজন হয়, তাহলে আপনি সাধারণ NetworkFactory.register মেথডের পরিবর্তে NetworkFactory.registerIgnoringScore রেজিস্টার করতে পারেন। আপনি যদি এই মেথডটি ব্যবহার করেন, তাহলে এমন একটি স্কোর ফিল্টার পাস করুন যা ফ্যাক্টরির তৈরি করতে পারা সেরা স্কোরটিকে সবচেয়ে নির্ভুলভাবে উপস্থাপন করে। এটি ফ্যাক্টরি পূরণ করতে পারে না এমন অনুরোধগুলোর মূল্যায়ন রোধ করে ব্যাটারি সাশ্রয় করে।

বৈধতা

অ্যান্ড্রয়েড-চালিত ডিভাইসে নেটওয়ার্ক নির্বাচনের আচরণ যাচাই করতে, নিম্নলিখিত পরীক্ষাগুলো ব্যবহার করুন:

  • NetworkScoreTest সিটিএস পরীক্ষা
  • NetworkRanker ইউনিট টেস্ট

ভুল বাস্তবায়নের ফলে অ্যাপগুলো যখন NetworkCallback ব্যবহার করে, তখন অপ্রত্যাশিত নেটওয়ার্ক ফিরে আসতে পারে। এর মধ্যে ডিভাইসের ডিফল্ট নেটওয়ার্ক নির্বাচন করাও অন্তর্ভুক্ত (যেমন, ConnectivityManager.registerDefaultNetworkCallback এর মাধ্যমে নেটওয়ার্ক কলব্যাক ব্যবহার করার সময় সিস্টেম কোনো অ্যাপে যে নেটওয়ার্কটি পাঠায়)।

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