Wi-Fi

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

רכיבים של מודול Wi-Fi

איור 1. רכיבים וארכיטקטורה של מודול Wi-Fi

מודול ה-Wi-Fi מספק את היתרונות הבאים.

  • משתמשי קצה מקבלים חוויית Wi-Fi עקבית במכשירי Android, ועדכוני מודולים פותרים בעיות של פעולה הדדית.

  • מפתחי אפליקציות נהנים מפיצול פלטפורמה מופחת.

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

גבולות המודולים ב-Android 12 וב-Android 13

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (קבצים מ-frameworks/base/wifi/java)
      • tests/
        • android/net/wifi (קבצים מ-frameworks/base/wifi/tests)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (קבצים מ-frameworks/opt/net/wifi/service/java)
      • tests/
        • com/android/server/wifi (קבצים מ-frameworks/opt/net/wifi/tests)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (קבצים מ-frameworks/base/packages/OsuLogin)
    • ServiceResources/ (חדש ב-Android 12, מניפסט ה-APK של שכבת-העל מאוחסן כאן)
      • res/ (חדש ב-Android 11, הגדרות Wi-Fi שחולצו מתוך frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (חדש ב-Android 13: האפליקציה להפעלת תיבות דו-שיח לבקשת המשתמש מאוחסנת כאן).
      • src/
        • com/android/wifi/dialog (מכיל את הפעילות שממנה נפתחות תיבות הדו-שיח)
      • AndroidManifest.xml
      • Android.bp

הספריות שלמעלה מכילות גם קוד שנשאר מחוץ לרכיב המערכת המודולרי ובמיקום הנוכחי שלו, למשל:

  • wificond interface (classes in package android.net.wifi.nl80211, לדוגמה, WifiNl80211Manager)
  • דוגמה לאפליקציית שכבת-על של משאבים
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

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

העברת תיקון מ-frameworks/base/wifi

יצירת קובץ התיקון ב-root/frameworks/base/wifi

git format-patch -1 commit --stdout > patch-file.txt

החלת קובץ התיקון על root/packages/modules/Wifi

git am -p2 --directory=framework/ patch-file.txt

העברת תיקון מ-frameworks/opt/net/wifi

כדי להעביר את התיקון מ-frameworks/opt/net/wifi, צריך לבצע שלבים מורכבים כי ההיררכיה של הספריות השתנתה במהלך ההעברה.

ב-frameworks/opt/net/wifi, מפצלים את הקומיט לשני קומיטים, אחד ל-service/ ואחד ל-tests/.

העברת הקומיט של HEAD

git reset HEAD^
git add service/
git commit # Enter your commit message. Call this commit service-commit
git add tests/
git commit # Enter your commit message. Call this commit test-commit

יצירת שני קובצי תיקון של קומיט

git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt

החלת שני התיקונים על packages/modules/Wifi

git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt

איחוד שתי ההתחייבויות להתחייבות אחת

git rebase -i

משנים את הפעולה של הקומיט השני ל-squash.

עורכים את הודעת הקומיט לפי הצורך.

גבולות המודולים ב-Android 11

שירות ה-Wi-Fi ממשיך לפעול בתהליך של שירות המערכת. מודול ה-Wi-Fi כולל את כל הקוד ב-packages/modules/Wifi, כולל הקודים הבאים.

  • ‫SDK וסיווגים של שירותים ל-WifiService,‏ WifiP2pService,‏ WifiAwareService,‏ WifiScannerService ו-WifiRttService
  • OsuLogin
  • ServiceWifiResources

המודול לא כולל את הרכיבים הבאים, שנשארים חלק מהגרסה של AOSP של יצרן ה-OEM.

  • רכיב מקורי ב-system/connectivity/wificondwificond
  • ממשק wificond (classes בחבילה android.net.wifi.nl80211, לדוגמה, WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

ב-Android 11, הקבצים לא מועברים, אבל יכול להיות שבגרסאות עתידיות הם כן יועברו. כדי לצמצם את המאמץ שנדרש לניוד שינויים במיקום הקובץ, מומלץ להעביר כמה שיותר שינויים ל-AOSP (אחרי ניוד שלהם ל-Android 11 או אחרי שינוי המבנה של תוספים קנייניים כדי להשתמש בממשקי API רשמיים של Android או בתוספי HAL של ספקים כדי להפריד אותם מקוד AOSP).

פורמט המודול

מודול ה-Wi-Fi‏ (com.android.wifi) הוא בפורמט APEX והוא זמין למכשירים עם Android גרסה 11 ואילך. קובץ ה-APEX כולל את הרכיבים הבאים.

  • ספריית SDK‏ (framework-wifi.jar)
  • ספריית שירותים (service-wifi.jar)
  • קובץ APK של OsuLogin ‏ (OsuLoginGoogle.apk)
  • קובץ APK של משאבים (ServiceWifiResourcesGoogle.apk)
  • אישורי WFA

יחסי תלות בין מודולים

מודול ה-Wi-Fi תלוי ברכיבים הבאים.

  • קישוריות
  • טלפוניה
  • ספריות Proto
  • רכיבים שונים של המערכת
  • Wi-Fi HALs
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

המודול הזה מתקשר עם המסגרת באמצעות @SystemApi יציבים בלבד (ללא שימוש ב-API‏ @hide) והוא חתום בחתימה של Google במקום בחתימה של הפלטפורמה.

התאמה אישית

מודול ה-Wi-Fi לא תומך בהתאמה אישית ישירה, אבל אפשר להתאים אישית את ההגדרה באמצעות שכבות-על של משאבי זמן ריצה (RRO) או הגדרות של ספקי סלולר.

התאמה אישית של Wi-Fi

איור 2. התאמה אישית של מודול ה-Wi-Fi

  • כדי לבצע התאמות אישיות קטנות, מפעילים או משביתים הגדרות ב-RRO config.
  • כדי לקבל שליטה רבה יותר, אפשר להתאים אישית את ערכי ההגדרות לכל מפתח הגדרה של ספק שמוצג כ-@SystemAPI.

שימוש בשכבות-על של משאבים בזמן ריצה

אפשר להתאים אישית את מודול ה-Wi-Fi על ידי שינוי הגדרות ברירת המחדל באמצעות RRO. רשימה של הגדרות שאפשר להוסיף להן שכבת-על מופיעה במאמר packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. לפרטים על התנהגות ההגדרה, אפשר לעיין במאמר packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. דוגמה לאפליקציית שכבת-על זמינה בכתובת device/google/coral/rro_overlays/WifiOverlay/.

כי קובץ device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml מגדיר את המאפיין targetPackage לערך com.android.wifi.resources, ול-APK של המשאב שמועבר על ידי מודול ה-Wi-Fi יש שם חבילה com.google.android.wifi.resources, לכן צריך להגדיר את ה-APK של שכבת העל targetPackage לערך com.google.android.wifi.resources כדי להוסיף שכבת על להגדרות ה-Wi-Fi בהצלחה.

העברת פורמט אחסון ההגדרות

מודול ה-Wi-Fi יכול לנתח רק את פורמט האחסון של הגדרות ה-Wi-Fi ב-AOSP. אם שיניתם בעבר את פורמט האחסון של הגדרות ה-Wi-Fi (שכולל את רשימת הרשתות השמורות של המשתמש), אתם צריכים להמיר את הנתונים האלה לפורמט AOSP כשמשדרגים מכשיר לכל גרסת Android שכוללת את מודול ה-Wi-Fi. ה-hooks שנדרשים להמרה הזו נמצאים במחלקה android.net.wifi.WifiMigration.

מטמיעים את המרת הפורמט בשיטות הבאות.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • מופעל על ידי מודול ה-Wi-Fi כדי לאחזר את התוכן של קובץ האחסון המשותף של ה-Wi-Fi שהומר לפורמט AOSP.

    • בעבר (ב-Android 10) הקבצים האלה אוחסנו בתיקייה /data/misc/wifiבמכשיר.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • מופעל על ידי מודול ה-Wi-Fi כדי לאחזר את התוכן של קובץ החנות שספציפי למשתמש ה-Wi-Fi, שהומר לפורמט AOSP.

    • בעבר (ב-Android 10) הקבצים האלה אוחסנו בתיקייה /data/misc_ce/<userId>/wifi במכשיר.

גישה לממשקי API נסתרים של Wi-Fi

סמלים (classes, methods, fields וכו') שמסומנים בהערה @hide במודול Wi-Fi לא נכללים בממשק ה-API הציבורי שלו, ואי אפשר לגשת אליהם במכשירים שבהם המודול מותקן. במכשירים שלא כוללים את מודול ה-Wi-Fi, אפשר להמשיך להשתמש ב-@hide Wi-Fi APIs באמצעות השלבים הבאים.

  1. כדי להסיר את הגבלות החשיפה שהוגדרו לframework-wifi בשעה packages/modules/Wifi/framework/Android.bp, צריך לשנות את מאפיין impl_library_visibility ל'גלוי לכולם'.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. משנים את כלל הבנייה כדי לאפשר גישה לספריית @hide Wi-Fi APIs. לדוגמה, הכלל הבא הוא כלל build עבור java_library.

    java_library {
        name: "foo-lib",
    
        // no sdk_version attribute defined
    
        libs: [
            "dependency1",
            "dependency2",
        ],
    }
    

    כדי לאפשר גישה לספרייה עבור foo-lib, משנים את כלל הבנייה באופן הבא:

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. מוודאים ש-framework-wifi.impl מופיע לפני framework ברשימה של libs. סדר התלויות במאפיין libs חשוב.

גישה ל-APIs מוסתרים של Framework

לא ניתן לגשת לסמלים שמסומנים ב-@hide מחוץ למודול ה-Wi-Fi באמצעות קוד בתוך מודול ה-Wi-Fi. במכשירים שלא כוללים את מודול ה-Wi-Fi, אפשר להמשיך להשתמש ב-API חיצוניים של @hide (לדוגמה, מ-framework.jar) ב-service-wifi על ידי ביצוע השינויים הבאים ב-frameworks/opt/net/wifi/service/Android.bp.

  1. בשני הפידים, wifi-service-pre-jarjar וservice-wifi, משנים את המאפיין sdk_version לערך core_platform.

  2. בשני המקרים, wifi-service-pre-jarjar וservice-wifi, מוסיפים את framework ואת android_system_server_stubs_current למאפיין libs.

  3. מוודאים שהתוצאה דומה לדוגמת הקוד הבאה.

    java_library {
        name: "wifi-service-pre-jarjar",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    ...
    java_library {
        name: "service-wifi",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    

בדיקה

חבילת בדיקות התאימות (CTS) של Android מאמתת את היכולות של מודול ה-Wi-Fi על ידי הפעלת קבוצה מקיפה של בדיקות CTS בכל מהדורה של מודול. אפשר גם להריץ את הבדיקות שמתוארות במאמר בדיקה, ניפוי באגים וכוונון של Wi-Fi.