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