בדף הזה מוסבר איך מערכת Android בוחרת בין רשתות שזמינות בו-זמנית. מנגנון בחירת הרשת הזה משפיע על האופן שבו Android ממלאת בקשות של אפליקציות ושל המערכת לרשת, ועל האופן שבו נבחרת רשת ברירת המחדל של אפליקציה.
התנהגות בחירת הרשת
בקטע הזה מתוארת התנהגות בחירת הרשת במכשירים עם Android מגרסה 12 ואילך, ובמכשירים עם Android מגרסה 11 ומטה.
12 Android
במכשירים עם Android מגרסה 12 ואילך, מערכת Android משתמשת בכיתה NetworkScore
כדי לבחור בין הרשתות הזמינות. הכיתה הזו מכילה מספר דגלים שנדרשים לקבלת החלטות בנושא מדיניות. כל דגל מייצג באופן סמנטי מאפיין של רשת שחשוב לבחירת הרשת.
סוכן רשת (NetworkAgent
) משתמש בדגל POLICY_TRANSPORT_PRIMARY
כדי לציין שהרשת היא המועדפת כשיש כמה רשתות של אותו סוג תעבורה. דוגמה אופיינית לכך היא מכשיר עם שני כרטיסי SIM עם מתג בהגדרות שמאפשר למשתמש לבחור באיזה כרטיס SIM להשתמש כברירת מחדל. בתוך אמצעי תחבורה נתון, מערכת Android מעדיפה רשת עם הדגל POLICY_TRANSPORT_PRIMARY
על פני רשת ללא הדגל.
סוכן רשת משתמש בדגל POLICY_EXITING
כדי לזהות רשת שצפויה להתנתק בקרוב. דוגמה אופיינית לכך היא כשאיכות רשת ה-Wi-Fi יורדת כשהמשתמש יוצא מטווח הרשת. אם יש רשת אחרת ללא הדגל הזה, מערכת Android תימנע משימוש ברשת עם הדגל הזה. כל סוכן רשת יכול לקבוע מתי הרשת תפגע מספיק כדי להיחשב כיציאה.
באמצעות הכיתה NetworkScore
, סוכני רשת יכולים גם להצהיר על רשת שצריך לשמור עליה באמצעות הדגל KEEP_CONNECTED_FOR_HANDOVER
והשיטה NetworkScore.Builder.setKeepConnectedReason
. הדגל KEEP_CONNECTED_FOR_HANDOVER
שימושי לרשתות פוטנציאליות, ומאפשר לסוכני רשת להפעיל רשת ב-STA משני של Wi-Fi בלי להפוך אותה לרשת הראשית עד להערכת הביצועים של הרשת. אם סוכן רשת לא מצהיר על הדגל הזה, רשתות פוטנציאליות נהרסות כי הן לא מטפלות בבקשות לפני שלסוכן יש הזדמנות להעריך את הביצועים של הרשת.
אם שתי רשתות יכולות להציג בקשה מסוימת והן זהות מבחינת המדיניות, המערכת תעדיף את הרשת שמציגה כרגע את הבקשה. אם אף רשת לא מציגה את הבקשה, המערכת בוחרת אחת משתי הרשתות, ואז הרשת הזו תמשיך להיות המועדפת עד שסמלי המדיניות ישתנו.
ההטמעה של תכונת בחירת הרשת נמצאת במודול הקישוריות ב-AOSP. הלוגיקה של המדיניות לבחירת רשת נמצאת בכיתה NetworkRanker
ובכיתות העזר שלה. המשמעות היא שתעשיות המכשירים לא יכולות להתאים אישית את קוד בחירת הרשת ישירות, אלא צריכות להשתמש בדגלים ב-NetworkScore
כדי להעביר את המידע הנדרש על הרשתות.
Android 11
במכשירים עם Android מגרסה 11 ומטה, מערכת Android בוחרת את הרשת על סמך מספר שלם פשוט שנשלח מההטמעות של סוכן רשת (NetworkAgent
). לכל בקשה, מערכת Android בוחרת את הרשת עם הדירוג המספרי הגבוה ביותר שיכולה לענות על הבקשה. הציון המספרי הזה מורכב ממספר שלם שנשלח על ידי סוכן הרשת, בתוספת בונוסים או קנסות נוספים שמבוססים על מספר תנאים, כמו אם הרשת אומתה או אם היא VPN. סוכני הרשת השונים מסתנכרנים ביניהם כדי לקבל החלטות שקשורות למדיניות.
אם שני רשתות יכולות להציג בקשה מסוימת ויש להן את אותו ציון מספרי, ההתנהגות לא מוגדרת.
הכיתה NetworkScore
הכיתה המרכזית של תכונת בחירת הרשת היא NetworkScore
.
הכיתה הזו מכילה את ה-API ואת המסמכים התיעודיים של הדגלים הזמינים ושל השיטה setKeepConnectedReason
.
צריך ליצור את הכיתה NetworkScore
באמצעות כיתה ה-builder שלה ולהעביר אותה למגדיר 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 ואילך, אבל מבצעים build לפי ההטמעה ב-Android 12, צפויים לראות שגיאות build כי השיטות לעדכון המספר המלא הקודם הוסרו ב-Android 12.
סוכני רשת שמשתמשים בכיתה הפנימית NetworkFactory
חייבים להביע את מסנן הדירוג שלהם באובייקט NetworkScore
שמייצג את הדירוג החזק ביותר של רשת שהמפעל יכול ליצור. הסיבה לכך היא שב-Android 12, הכיתה NetworkFactory
מעבירה רק בקשות שתואמות למסנני הדירוג שהוגדרו ל-NetworkFactory
, במקום את כל הבקשות ב-Android 11 ומטה.
מומלץ להעביר מסנן כדי להקל על ההטמעה ולשמור על חיי הסוללה, כך שלא כל הבקשות יועברו אל NetworkFactory
. עם זאת, אם ההטמעה בהתאמה אישית מחייבת שכל הבקשות יועברו אל NetworkFactory
, אפשר לרשום את השיטה NetworkFactory.registerIgnoringScore
במקום את השיטה הרגילה NetworkFactory.register
. אם משתמשים בשיטה הזו, מומלץ להעביר מסנן ניקוד שמייצג בצורה מדויקת ככל האפשר את הציון הטוב ביותר שהמפעל יכול ליצור, כדי לחסוך בחיי הסוללה על ידי אי הערכה של בקשות שהמפעל לא יכול למלא.
אימות
כדי לבדוק את ההתנהגות של בחירת הרשת במכשיר Android, אפשר להשתמש בבדיקות הבאות:
NetworkScoreTest
בדיקת CTSNetworkRanker
בדיקת יחידה
הטמעה שגויה עלולה לגרום להחזרת רשתות לא צפויות לאפליקציות בתגובה לשימוש שלהן ב-NetworkCallback
, כולל בחירת רשת ברירת המחדל של המכשיר (הרשת שהמערכת שולחת לאפליקציה כשהיא משתמשת בקריאה חוזרת (callback) מהרשת עם ConnectivityManager.registerDefaultNetworkCallback
).
בעיה אפשרית נוספת כתוצאה מהטמעה שגויה היא שחיקה חמורה של הסוללה שנגרמת על ידי סוכן רשת שמופעל עם ציון שלא מאפשר לו לעמוד בדרישות של אף בקשה, ומבוטל מיד לאחר מכן. אם תפעילו את הסוכן ותשביתו אותו שוב ושוב, יכול להיות שתצרכו הרבה סוללה.