בחירת רשת

בדף הזה מוסבר איך מערכת 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 constructor בזמן האתחול. אפשר לעדכן את הציונים של הרשתות בכל שלב באמצעות השיטה NetworkAgent#sendNetworkScore.

דוגמאות להטמעה של סוכן רשת

AOSP כולל הטמעות לדוגמה של סוכני רשת שונים. הטמעות לדוגמה:

  • TelephonyNetworkAgent: שימוש בציון הרשת כדי להעביר את המדיניות לגבי רשתות סלולריות
  • ClientModeImpl.WifiNetworkAgent: נעשה שימוש בציון הרשת כדי להעביר את המדיניות לגבי רשתות Wi-Fi. ההטמעה הזו כוללת תאימות לאחור למספר שלם מדור קודם של ציון הרשת באמצעות הדגל POLICY_EXITING.

מכשירי Android שמשדרגים ל-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, צריך להשתמש בבדיקות הבאות:

הטמעה שגויה עלולה לגרום להחזרת רשתות לא צפויות לאפליקציות בתגובה לשימוש שלהן ב-NetworkCallback, כולל בחירת רשת ברירת המחדל של המכשיר (הרשת שהמערכת שולחת לאפליקציה כשהיא משתמשת בקריאה חוזרת (callback) מהרשת עם ConnectivityManager.registerDefaultNetworkCallback).

בעיה אפשרית נוספת כתוצאה מהטמעה שגויה היא שחיקה חמורה של הסוללה שנגרמת על ידי סוכני רשת שמתחילים לפעול עם ציון שלא מאפשר להם לעמוד בדרישות של אף בקשה, ומפורקים מיד לאחר מכן. אם תפעילו את הסוכן ותשביתו אותו שוב ושוב, יכול להיות שתצרכו הרבה סוללה.