בחירת רשת

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

התנהגות של בחירת רשת

בקטע הזה מתואר אופן הפעולה של בחירת הרשת במכשירים עם Android מגרסה 12 ואילך, ובמכשירים עם Android מגרסה 11 (רמת API 30) ומטה.

12 ‏Android

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

סוכן רשת (NetworkAgent) משתמש בדגל POLICY_TRANSPORT_PRIMARY כדי לציין שמערכת Android מעדיפה את הרשת אם קיימות כמה רשתות מאותו סוג של העברה. לדוגמה, במכשיר עם שני כרטיסי SIM יש מתג בהגדרות שמאפשר לבחור באיזה כרטיס SIM להשתמש כברירת מחדל. בפרוטוקול תחבורה נתון, מערכת Android מעדיפה רשת עם הדגל POLICY_TRANSPORT_PRIMARY על פני רשת ללא הדגל.

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

המחלקות NetworkScore מאפשרות גם לסוכן רשת להצהיר שמערכת Android שומרת על רשת מחוברת באמצעות הדגל KEEP_CONNECTED_FOR_HANDOVER והשיטה NetworkScore.Builder.setKeepConnectedReason. הדגל הזה KEEP_CONNECTED_FOR_HANDOVER עוזר לרשתות פוטנציאליות. הדגל הזה מאפשר לסוכן רשת להפעיל רשת ב-STA משני של Wi-Fi בלי להפוך אותה לרשת הראשית, עד שמערכת Android תעריך את הביצועים של הרשת. אם נציג רשת לא מציין את הדגל הזה, מערכת Android מנתקת רשתות פוטנציאליות כי הן לא מטפלות באף בקשה לפני שהנציג מעריך את הביצועים של הרשת.

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

תכונת בחירת הרשת מיושמת במודול הקישוריות בפרויקט קוד פתוח של Android ‏ (AOSP). הלוגיקה של המדיניות לבחירת רשת נמצאת במחלקה NetworkRanker ובמחלקות העזר שלה. כלומר, יצרני מכשירים לא יכולים להתאים אישית ישירות את קוד בחירת הרשת. במקום זאת, הם צריכים להשתמש בדגלים ב-NetworkScore כדי להעביר מידע על רשתות.

Android 11

במכשירים עם Android בגרסה 11 ומטה, מערכת Android בוחרת את הרשת על סמך מספר שלם שנשלח מסוכן רשת (NetworkAgent). לכל בקשה, מערכת Android בוחרת את הרשת עם הניקוד המספרי הכי גבוה שיכול לענות על הבקשה. הציון המספרי הזה מורכב מהמספר השלם שסוכן הרשת שולח, בתוספת בונוסים או קנסות נוספים. מערכת Android מחילה את הבונוסים או העונשים האלה בהתאם לתנאים, למשל, אם הרשת מאומתת או אם מדובר ב-VPN. סוכני הרשת מסתנכרנים ביניהם כדי לקבל החלטות לגבי מדיניות.

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

מחלקת NetworkScore

הסיווג NetworkScore הוא מרכזי לתכונת בחירת הערוצים. המחלקות האלה מכילות את ה-API ואת התיעוד של הדגלים הזמינים ושל ה-method‏ NetworkScore.Builder.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 ומטה, אבל יוצרים קוד בהתאם להטמעה ב-Android 12, צפויים לקבל שגיאות בבנייה כי השיטות לעדכון המספר השלם מדור קודם הוסרו ב-Android 12.

עבור סוכני רשת שמשתמשים במחלקה הפנימית NetworkFactory, צריך להגדיר את מסנן הניקוד באובייקט NetworkScore שמייצג את הניקוד הכי גבוה של רשת שהמפעל יכול ליצור. הסיבה לכך היא שב-Android 12, המחלקה NetworkFactory מעבירה רק בקשות שתואמות למסנני הניקוד שהוגדרו ל-NetworkFactory, בניגוד ל-Android 11 ומטה, שבהן היא מעבירה את כל הבקשות.

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

אימות

כדי לאמת את אופן הפעולה של בחירת הרשת במכשיר עם Android, אפשר להשתמש בבדיקות הבאות:

  • NetworkScoreTest בדיקת CTS
  • בדיקת יחידה (unit test)NetworkRanker

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

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