این صفحه نحوه انتخاب شبکه از میان شبکههای دردسترس همزمان توسط Android را شرح میدهد. این سازوکار انتخاب شبکه بر نحوه انجام درخواستهای شبکه برنامه و سیستم در Android تأثیر میگذارد و بر نحوه انتخاب شبکه پیشفرض برای برنامه در Android تأثیر میگذارد.
عملکرد انتخاب شبکه
این بخش رفتار انتخاب شبکه را برای دستگاههای دارای Android 12 یا بالاتر و برای دستگاههای دارای Android 11 (سطح میانای برنامهسازی کاربردی ۳۰) و پایینتر شرح میدهد.
Android نسخه ۱۲
برای دستگاههایی که Android 12 یا بالاتر دارند، Android از کلاس NetworkScore برای انتخاب از بین شبکههای دردسترس استفاده میکند. این کلاس
شامل پرچمهایی است که تصمیمات خطمشی را میگیرند. هر پرچم نشاندهنده یک ویژگی شبکه است که برای انتخاب شبکه مهم است.
یک عامل شبکه (NetworkAgent) از پرچم POLICY_TRANSPORT_PRIMARY استفاده میکند تا مشخص کند که اگر چندین شبکه از یک انتقال وجود داشته باشد، Android آن شبکه را ترجیح میدهد. برای مثال، دستگاههای با امکان نصب دو سیمکارت در بخش
تنظیمات کلیدی دارند که به شما امکان میدهد سیمکارت پیشفرض را انتخاب کنید. در یک
حامل معین، Android شبکهای را که پرچم POLICY_TRANSPORT_PRIMARY
دارد بر شبکهای که پرچم ندارد ترجیح میدهد.
عامل شبکه از پرچم POLICY_EXITING برای شناسایی شبکهای استفاده میکند که
انتظار میرود اتصالش قطع شود. برای مثال، اگر کاربر از محدوده شبکه خارج شود، کیفیت شبکه Wi-Fi کاهش مییابد. اگر شبکه دیگری بدون این پرچم دردسترس باشد، Android از استفاده از شبکهای با این پرچم اجتناب میکند. هر عامل شبکه میتواند تعیین کند
چه زمانی شبکه بهاندازه کافی تنزل پیدا کرده است که خروج از آن درنظر گرفته شود.
کلاس NetworkScore همچنین به عامل شبکه اجازه میدهد اعلام کند که Android بااستفاده از پرچم KEEP_CONNECTED_FOR_HANDOVER و روش NetworkScore.Builder.setKeepConnectedReason شبکه را متصل نگه میدارد. این
پرچم KEEP_CONNECTED_FOR_HANDOVER به شبکههای آینده کمک میکند. این پرچم به عامل شبکه اجازه میدهد
شبکهای را در Wi-Fi STA ثانویه بالا بیاورد بدون اینکه آن را به شبکه اصلی تبدیل کند
تا زمانی که Android عملکرد شبکه را ارزیابی کند. اگر عامل شبکه
این پرچم را اعلام نکند، Android شبکههای احتمالی را بهدلیل
عدم ارائه خدمات به درخواستها قبلاز اینکه عامل عملکرد شبکه را ارزیابی کند، ازهم میپاشد.
اگر دو شبکه بتوانند به درخواست معینی خدمات ارائه دهند و خطمشی یکسانی داشته باشند، Android شبکهای را ترجیح میدهد که درحال ارائه خدمات به درخواست است. اگر هیچ شبکهای درخواست را ارائه نکند، Android یکی از این دو را انتخاب میکند. این شبکه همچنان ترجیح داده میشود تا زمانی که پرچمهای خطمشی تغییر کند.
ویژگی انتخاب شبکه در واحد اتصالپذیری در
«پروژه متنباز Android» (AOSP) پیادهسازی شده است. منطق خطمشی برای انتخاب شبکه در کلاس NetworkRanker و کلاسهای کمکی آن قرار دارد. این یعنی سازندگان دستگاه نمیتوانند کد انتخاب شبکه را مستقیماً سفارشیسازی کنند. درعوض، آنها باید از پرچمها در NetworkScore برای انتقال اطلاعات درباره شبکهها استفاده کنند.
Android 11
برای دستگاههای دارای Android 11 یا پایینتر، Android انتخاب شبکه را براساس عدد صحیحی که از نماینده شبکه ارسال میشود (NetworkAgent) انجام میدهد. برای هر درخواست، Android شبکهای را انتخاب میکند که بالاترین امتیاز عددی را داشته باشد و بتواند درخواست را برآورده کند. این امتیاز عددی از عدد صحیحی که
عامل شبکه ارسال میکند بهعلاوه پاداشها یا جریمههای اضافی تشکیل شده است. Android این
پاداشها یا جریمهها را براساس شرایط، برای مثال، اینکه شبکه
تأیید شده است یا VPN، اعمال میکند. عاملهای شبکه با یکدیگر همگامسازی میکنند تا درباره خطمشی تصمیمگیری کنند.
اگر دو شبکه بتوانند درخواست معینی را ارائه کنند و امتیاز عددی یکسانی داشته باشند، عملکرد تعریفنشده است.
کلاس NetworkScore
کلاس NetworkScore برای ویژگی انتخاب شبکه ضروری است. این کلاس
شامل میانای برنامهسازی کاربردی و مستندات پرچمهای دردسترس و
روش NetworkScore.Builder.setKeepConnectedReason است.
باید کلاس NetworkScore را بااستفاده از کلاس سازنده آن بسازید و آن را درطول مقداردهی اولیه به
سازنده NetworkAgent ارسال کنید. هرزمان بخواهید میتوانید امتیازهای شبکه را بااستفاده از روش NetworkAgent#sendNetworkScore بهروز کنید.
نمونههای پیادهسازی عامل شبکه
AOSP شامل نمونه پیادهسازیهای عوامل شبکه مختلف است. فهرست زیر پیادهسازیهای نمونه را ارائه میدهد:
TelephonyNetworkAgent: از امتیاز شبکه برای اطلاعرسانی خطمشی برای شبکههای تلفن همراه استفاده میکند.ClientModeImpl.WifiNetworkAgent: از امتیاز شبکه برای اعلام خطمشی شبکههای Wi-Fi استفاده میکند. این پیادهسازی بااستفاده از پرچمPOLICY_EXITING، سازگاری با نسخه قدیمی عدد صحیح برای امتیاز شبکه را فراهم میکند.
دستگاههایی که به Android 12 ارتقا مییابند
تولیدکنندگان دستگاه که دستگاههایشان را به Android 12 ارتقا میدهند باید پیادهسازیهای عامل شبکه خود را برای استفاده از کلاس NetworkScore اصلاح کنند. عدد صحیح قدیمی که در Android 11 یا نسخههای پایینتر استفاده میشد در NetworkScore منتقل میشود اما فقط برای اهداف گزارشگیری و عدم پسرفت در Android 12 استفاده میشود. در Android 12، سازندگان دستگاه باید تغییرات را بااستفاده از پرچمهای NetworkScore بیان کنند. سپس واحد Connectivity Mainline از پرچمها برای تصمیمگیری درباره انتخاب شبکه استفاده میکند. تولیدکنندگان دستگاه که از کد Android 11 یا نسخههای پایینتر استفاده میکنند اما دربرابر پیادهسازی در Android 12 ساختار ایجاد میکنند، میتوانند انتظار خطاهای ساخت داشته باشند زیرا روشهای بهروزرسانی عدد صحیح قدیمی در Android 12 برداشته شده است.
برای کارگزاران شبکهای که از کلاس داخلی NetworkFactory استفاده میکنند، باید فیلتر امتیاز را در یک شیء NetworkScore که نشاندهنده قویترین امتیاز شبکهای است که کارخانه میتواند ایجاد کند بیان کنید. دلیل این امر این است که در Android 12، کلاس NetworkFactory فقط درخواستهایی را که با فیلترهای امتیاز اعلامشده در NetworkFactory مطابقت دارند ارسال میکند، برخلاف Android 11 و نسخههای پایینتر که همه درخواستها را ارسال میکند.
میتوانید فیلتری را بگذرانید تا پیادهسازی را ساده کنید و در مصرف باتری صرفهجویی کنید، که تضمین میکند
NetworkFactory همه درخواستها را پردازش نمیکند. بااینحال، اگر پیادهسازی سفارشی شما مستلزم این است که همه درخواستها به NetworkFactory ارسال شود، میتوانید بهجای روش معمول NetworkFactory.register، NetworkFactory.registerIgnoringScore را ثبت کنید. اگر از این روش استفاده میکنید، فیلتری برای امتیاز عبور دهید که دقیقترین نمایش از بهترین امتیازی باشد که کارخانه میتواند ایجاد کند.
این کار با جلوگیری از ارزیابی درخواستهایی که کارخانه نمیتواند
انجام دهد، در مصرف شارژ باتری صرفهجویی میکند.
اعتبارسنجی
برای درستیسنجی رفتار انتخاب شبکه در دستگاه مجهز به Android، از آزمایشهای زیر استفاده کنید:
- آزمون
NetworkScoreTestCTS -
NetworkRankerآزمون واحد
پیادهسازی نادرست ممکن است منجر به بازگشت شبکههای غیرمنتظره به برنامهها
هنگام استفاده از NetworkCallback شود. این شامل انتخاب شبکه پیشفرض دستگاه (شبکهای که سیستم هنگام استفاده از
بازخوان شبکه به برنامه ارسال میکند، برای مثال با
ConnectivityManager.registerDefaultNetworkCallback) میشود.
مشکل احتمالی دیگر در پیادهسازی نادرست، خالی شدن شدید شارژ باتری است. این اتفاق زمانی رخ میدهد که یک عامل شبکه با امتیازی بالا میآید که به آن اجازه نمیدهد برای هیچ درخواستی واجدشرایط شود و بلافاصله پساز آن ازکار میافتد. اگر عامل بهطور مکرر بالا بیاید و بسته شود، این کار میتواند باتری زیادی مصرف کند.