מאז Android 5.0, כדי שמערך הרשת של Android יפעל בצורה תקינה בקרנלים של Linux, נדרשות כמה התחייבויות שנוספו לאחרונה או שעדיין לא נוספו. קשה לאמת באופן ידני את הפונקציונליות הנדרשת של ליבת המערכת או לעקוב אחרי הקומיטים החסרים, ולכן צוות Android משתף את הבדיקות שבהן הוא משתמש כדי לוודא שהליבה מתנהגת כמצופה.
סיבות להרצת הבדיקות
הבדיקות האלה קיימות משלוש סיבות עיקריות:
- הגרסה המדויקת של ליבת Linux שמשמשת במכשיר היא בדרך כלל ספציפית למכשיר, וקשה לדעת אם ליבה כלשהי פועלת בצורה תקינה בלי להריץ את הבדיקות.
- העברה של תיקוני ליבה לגרסאות ליבה שונות או לעצי מכשירים שונים עשויה לגרום לבעיות קלות שאי אפשר לזהות בלי להריץ את הבדיקות.
- יכול להיות שתכונות חדשות ברשת ידרשו פונקציונליות חדשה בליבה או תיקוני באגים בליבה.
אם הבדיקות לא עוברות, מחסנית הרשת של המכשיר מתנהגת בצורה לא תקינה, וגורמת לבאגים בקישוריות שגלויים למשתמשים (למשל, ניתוק מרשתות Wi-Fi). סביר להניח שהמכשיר ייכשל גם בבדיקות של חבילת בדיקות התאימות של Android (CTS).
שימוש בבדיקות
בבדיקות נעשה שימוש ב-User-Mode Linux כדי להפעיל את ליבת המערכת כתהליך במכונת מארח של Linux. במאמר הקמת סביבת build מפורטות גרסאות מתאימות של מערכות הפעלה. מסגרת הבדיקה של היחידה מאתחלת את הליבה עם קובץ אימג' מתאים של הדיסק ומריצה את הבדיקות ממערכת הקבצים של המארח. הבדיקות נכתבות ב-Python ומשתמשות בממשקי TAP כדי לבדוק את התנהגות הליבה ואת Socket API.
קומפילציה של ליבת ARCH=um
כדי שהבדיקות יפעלו, צריך לקמפל את ליבת המערכת עבור ARCH=um SUBARCH=x86_64. זו ארכיטקטורה נתמכת גם במעלה הזרם וגם בעצי ליבת Android הנפוצים (כמו android-4.4). אבל לפעמים ליבות המכשיר לא עוברות קומפילציה במצב הזה כי עצי המכשיר מכילים קוד ספציפי למכשיר או לחומרה בקבצים נפוצים (לדוגמה sys/exit.c).
במקרים רבים, מספיק לוודא שהקוד הספציפי לחומרה נמצא מאחורי #ifdef. בדרך כלל, צריך להגדיר את האפשרות הזו כ-#ifdef באפשרות הגדרה ששולטת בתכונה הספציפית שרלוונטית לקוד. אם אין אפשרות כזו להגדרה, צריך להוסיף קוד ספציפי לחומרה בתוך בלוקים של #ifndef CONFIG_UML.
באופן כללי, האחריות לתיקון הבעיה הזו מוטלת על ספק עץ הליבה (כמו ספק ערכת השבבים או ה-SoC). אנחנו עובדים עם יצרני ציוד מקורי וספקים כדי לוודא שניתן לקמפל את ליבות המערכת הנוכחיות והעתידיות עבור ARCH=um
SUBARCH=x86_64 בלי לבצע שינויים.
הרצת הבדיקות
הבדיקות נמצאות בכתובת kernel/tests/net/test.
מומלץ להריץ את הבדיקות מ-AOSP main כי הן הכי עדכניות. במקרים מסוימים, לתכונות של ליבת המערכת שנדרשות לפעולה תקינה בגרסת Android מסוימת עדיין אין כיסוי בדיקה מלא בגרסה הזו. הוראות להרצת הבדיקות מופיעות בקובץ ה-README של בדיקת הרשת של ליבת המערכת. בעצם, מריצים את הפקודה הבאה מהחלק העליון של עץ הליבה:
ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh
עוברים את הבדיקות
קבצי המקור של Python לבדיקת רשת הליבה מכילים הערות שמציינות קומיטים של ליבה שנדרשים כדי שהבדיקות יעברו. הבדיקות צריכות לעבור בעצי ליבת המערכת הנפוצים – כל הענפים הנפוצים של ליבת המערכת android-4.4 ומעלה – בפרויקט kernel/common ב-AOSP. לכן, כדי לעבור את הבדיקות בקרנל, צריך פשוט למזג באופן רציף מהענף המשותף המתאים של הקרנל.
תרומות
דיווח על בעיות
אפשר לדווח על בעיות בבדיקות של רשת ליבת המערכת במעקב אחר בעיות ב-Android באמצעות התווית Component-Networking.
תיעוד של פעולות Commit והוספת בדיקות
לדווח על בעיות כמו שמתואר למעלה, ואם אפשר להעלות שינוי כדי לפתור את הבעיה, אם:
- הבדיקות לא עוברות בעצי ליבה נפוצים
- מצאתם קומיט נדרש שלא מוזכר בתגובות המקוריות,
- כדי שהבדיקות יעברו בקרנלים במעלה הזרם, צריך לבצע שינויים משמעותיים
- נראה לך שהבדיקות מפורטות מדי, או שהבדיקה נכשלת בגרסאות ליבה עתידיות
- אתם רוצים להוסיף עוד בדיקות או להרחיב את הכיסוי של בדיקות קיימות.