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 (כיתות בחבילה 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

החלת שני התיקונים על חבילות/מודולים/Wi-Fi

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

איך מאחדים את שני השמירות לשמירה אחת

git rebase -i

שינוי פעולת השמירה השנייה ל-squash.

עורכים את הודעת ה-commit לפי הצורך.

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

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

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

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

  • רכיב מקורי של wificond ב-system/connectivity/wificond
  • ממשק wificond (כיתות בחבילה 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 לא מעבירה קבצים, אבל יכול להיות שגרסאות עתידיות. כדי לצמצם את המאמץ שכרוך בניוד שינויים במיקום הקבצים, אנחנו ממליצים לבצע כמה שיותר שינויים ב-upstream ל-AOSP (אחרי לנייד אותם ל-Android 11 או ארגון מחדש של תוספים קנייניים כך שישתמשו בממשקי API רשמיים ל-Android או בתוספי HAL של ספקים כדי לנתק אותם מקוד AOSP.

פורמט המודול

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

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

יחסי תלות של מודולים

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

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

המודול הזה מקיים אינטראקציה עם ה-framework באמצעות שימוש יציב בלבד ב-@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 מוסתרים

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

  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. משנים את כלל ה-build כדי לאפשר גישה לספרייה @hide Wi-Fi APIs. לדוגמה, הקוד הבא הוא כלל build ל-java_library.

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

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

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

גישה לממשקי API מוסתרים של מסגרות

לא ניתן לגשת לסמלים עם הערה @hide מחוץ למודול ה-Wi-Fi באמצעות קוד בתוך מודול ה-Wi-Fi. במכשירים שלא כוללים את מודול ה-Wi-Fi אפשר להמשיך להשתמש ב-@hide ממשקי API חיצוניים (לדוגמה, מ-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",
        ],
    }
    

בדיקה

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