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/Wi-Fi

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

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

  • רכיב מקורי של 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 יציב בלבד (לא @hide שימוש ב-API) והוא חתום בחתימת 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 יכול לנתח רק את פורמט האחסון של הגדרות ה-AOSP של Wi-Fi. אם המיקום ששינית בעבר את פורמט האחסון של תצורת 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

סמלים (כיתות, שיטות, שדות וכו') עם הערות עם ההערה @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 של framework נסתר

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