انتخاب شبکه

این صفحه نحوه انتخاب Android بین شبکه‌های موجود همزمان را شرح می‌دهد. این مکانیسم انتخاب شبکه بر نحوه اجرای درخواست‌های برنامه و شبکه سیستم توسط Android و نحوه انتخاب شبکه پیش‌فرض برای یک برنامه تأثیر می‌گذارد.

رفتار انتخاب شبکه

این بخش رفتار انتخاب شبکه را برای دستگاه‌های دارای Android 12 یا بالاتر و برای دستگاه‌های دارای Android 11 و پایین‌تر توضیح می‌دهد.

اندروید 12

برای دستگاه‌های دارای Android 12 یا بالاتر، Android از کلاس NetworkScore برای انتخاب بین شبکه‌های موجود استفاده می‌کند. این کلاس حاوی تعدادی پرچم است که برای اتخاذ تصمیمات خط مشی لازم است. هر پرچم از نظر معنایی یک ویژگی از یک شبکه را نشان می دهد که برای انتخاب شبکه مهم است.

یک عامل شبکه ( NetworkAgent ) از پرچم POLICY_TRANSPORT_PRIMARY استفاده می کند تا مشخص کند که شبکه در صورت وجود چندین شبکه از یک انتقال، ترجیح داده می شود. یک مثال معمولی از این یک دستگاه دو سیم کارته با سوئیچ در تنظیمات است که به کاربر اجازه می دهد از کدام یک از سیم کارت ها به طور پیش فرض استفاده کند. در یک انتقال مشخص، Android شبکه‌ای با پرچم POLICY_TRANSPORT_PRIMARY را به شبکه‌ای بدون پرچم ترجیح می‌دهد.

یک عامل شبکه از پرچم POLICY_EXITING برای شناسایی شبکه ای که انتظار می رود به زودی قطع شود، استفاده می کند. یک مثال معمولی از این زمانی است که کیفیت شبکه Wi-Fi با خروج کاربر از محدوده شبکه کاهش می یابد. اگر شبکه دیگری بدون این پرچم در دسترس باشد، اندروید از استفاده از شبکه ای با این پرچم اجتناب می کند. هر عامل شبکه می‌تواند تعیین کند که چه زمانی یک شبکه به اندازه‌ای کاهش می‌یابد که خروجی آن در نظر گرفته شود.

کلاس NetworkScore همچنین به یک عامل شبکه اجازه می دهد تا با استفاده از پرچم KEEP_CONNECTED_FOR_HANDOVER و متد NetworkScore.Builder.setKeepConnectedReason اعلام کند که یک شبکه حفظ می شود. این پرچم KEEP_CONNECTED_FOR_HANDOVER برای شبکه‌های احتمالی مفید است که به یک عامل شبکه اجازه می‌دهد تا شبکه‌ای را روی یک Wi-Fi STA ثانویه بدون اینکه آن را به شبکه اصلی تبدیل کند تا زمانی که عملکرد شبکه ارزیابی شود، باز کند. اگر یک عامل شبکه این پرچم را اعلام نکند، قبل از اینکه عامل فرصتی برای ارزیابی عملکرد شبکه داشته باشد، شبکه‌های احتمالی به دلیل عدم سرویس دهی به هیچ درخواستی از بین می‌روند.

اگر دو شبکه بتوانند یک درخواست معین را ارائه دهند و از نقطه نظر خط مشی معادل باشند، انتخاب شبکه ای را ترجیح می دهد که در حال حاضر درخواست را ارائه می دهد. اگر هیچ شبکه‌ای درخواست را ارائه نمی‌کند، یکی از این دو را انتخاب می‌کند، پس از آن این شبکه تا زمانی که پرچم‌های خط‌مشی تغییر نکند، ترجیح داده می‌شود.

پیاده سازی ویژگی انتخاب شبکه در ماژول Connectivity در AOSP است. منطق خط مشی انتخاب شبکه در کلاس NetworkRanker و کلاس های کمکی آن یافت می شود. این بدان معناست که سازندگان دستگاه نمی‌توانند مستقیماً کد انتخاب شبکه را سفارشی کنند، بلکه باید از پرچم‌ها در NetworkScore برای انتقال اطلاعات مورد نیاز در مورد شبکه‌ها استفاده کنند.

اندروید 11

برای دستگاه‌هایی که Android 11 یا پایین‌تر دارند، Android انتخاب شبکه را بر اساس یک عدد صحیح ساده ارسال شده از اجرای یک عامل شبکه ( NetworkAgent ) انجام می‌دهد. برای هر درخواست، اندروید شبکه ای را با بالاترین امتیاز عددی که بتواند درخواست را برآورده کند، انتخاب می کند. این امتیاز عددی از عدد صحیح ارسال شده توسط عامل شبکه به اضافه جوایز یا جریمه های اضافی که بر اساس تعدادی از شرایط مانند اعتبار شبکه یا VPN بودن شبکه داده می شود تشکیل شده است. عوامل شبکه منفرد برای اتخاذ تصمیمات خط مشی با یکدیگر همگام می شوند.

اگر دو شبکه بتوانند یک درخواست معین را ارائه دهند و دارای امتیاز عددی یکسانی باشند، رفتار تعریف نشده است.

کلاس NetworkScore

کلاس مرکزی ویژگی انتخاب شبکه NetworkScore است. این کلاس حاوی API و مستندات پرچم های موجود و متد setKeepConnectedReason است.

کلاس NetworkScore باید از طریق کلاس سازنده خود ساخته شود و پس از مقداردهی اولیه به سازنده NetworkAgent ارسال شود. امتیازات شبکه را می توان در هر زمان با استفاده از روش NetworkAgent#sendNetworkScore به روز کرد.

نمونه های پیاده سازی عامل شبکه

AOSP شامل پیاده سازی های نمونه ای از عوامل شبکه مختلف است. موارد زیر نمونه ای از پیاده سازی ها هستند:

  • TelephonyNetworkAgent : از امتیاز شبکه برای برقراری ارتباط خط مشی برای شبکه های تلفن همراه استفاده می کند
  • ClientModeImpl.WifiNetworkAgent : از امتیاز شبکه برای برقراری ارتباط با خط مشی شبکه های Wi-Fi استفاده می کند. این پیاده‌سازی با استفاده از پرچم POLICY_EXITING با عدد صحیح قدیمی برای امتیاز شبکه سازگاری دارد.

ارتقاء دستگاه ها به اندروید 12

سازندگان دستگاه‌هایی که دستگاه‌های خود را به Android 12 ارتقا می‌دهند باید پیاده‌سازی عامل شبکه خود را برای استفاده از کلاس NetworkScore تغییر دهند. عدد صحیح قدیمی که در Android 11 یا پایین‌تر استفاده می‌شود، در NetworkScore ارسال می‌شود، اما فقط برای اهداف گزارش‌گیری و غیر رگرسیون در Android 12 استفاده می‌شود. در Android 12، سازندگان دستگاه باید تغییرات مورد نظر را با استفاده از پرچم‌های NetworkScore بیان کنند. سپس ماژول Connectivity Mainline از پرچم ها برای تصمیم گیری انتخاب شبکه استفاده می کند. سازندگان دستگاه‌هایی که از کدهایی برای اندروید 11 یا پایین‌تر استفاده می‌کنند، اما در مقابل اجرای آن در اندروید 12 استفاده می‌کنند، می‌توانند منتظر خطاهای ساخت باشند زیرا روش‌های به‌روزرسانی عدد صحیح قدیمی در اندروید 12 حذف شده است.

برای عوامل شبکه که از کلاس NetworkFactory داخلی استفاده می کنند، باید فیلتر امتیاز خود را در یک شی NetworkScore بیان کنند که نشان دهنده قوی ترین امتیاز شبکه ای است که کارخانه می تواند ایجاد کند. دلیل آن این است که در Android 12 کلاس NetworkFactory فقط درخواست هایی را ارسال می کند که با فیلترهای امتیازی اعلام شده به NetworkFactory به جای همه درخواست های Android 11 و پایین تر مطابقت دارند.

توصیه می‌کنیم برای پیاده‌سازی آسان‌تر و صرفه‌جویی در باتری، فیلتری را عبور دهید تا همه درخواست‌ها به NetworkFactory ارسال نشود. با این حال، اگر پیاده سازی سفارشی شما مستلزم ارسال تمام درخواست ها به NetworkFactory باشد، می توانید NetworkFactory.registerIgnoringScore به جای روش معمولی NetworkFactory.register ثبت کنید. اگر از این روش استفاده می‌کنید، توصیه می‌کنیم از فیلتر امتیازی عبور کنید که نشان‌دهنده بهترین امتیازی است که کارخانه می‌تواند ایجاد کند تا با ارزیابی نکردن درخواست‌هایی که کارخانه قادر به انجام آن‌ها نیست، باتری را ذخیره کند.

اعتبار سنجی

برای تأیید رفتار انتخاب شبکه در دستگاه Android، از آزمایش‌های زیر استفاده کنید:

اجرای نادرست ممکن است منجر به بازگشت شبکه‌های غیرمنتظره به برنامه‌ها در پاسخ به استفاده آن‌ها از NetworkCallback شود، از جمله انتخاب شبکه پیش‌فرض دستگاه (شبکه‌ای که سیستم هنگام استفاده از تماس شبکه با ConnectivityManager.registerDefaultNetworkCallback به برنامه ارسال می‌کند).

یکی دیگر از مشکلات احتمالی در اجرای نادرست، تخلیه شدید باتری است که توسط عامل شبکه با امتیازی مطرح می‌شود که اجازه نمی‌دهد برای هیچ درخواستی واجد شرایط باشد و بلافاصله بعد از آن از بین می‌رود. اگر عامل به طور مکرر بالا آورده و پاره شود، ممکن است باتری زیادی مصرف شود.