בחירת רשת

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

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