Wi-Fi

Moduł Wi-Fi można aktualizować, co oznacza, że może otrzymywać aktualizacje funkcji poza normalnym cyklem publikowania wersji Androida. Ten moduł zawiera te komponenty:

Komponenty modułu Wi-Fi

Rysunek 1. Komponenty i architektura modułu Wi-Fi

Moduł Wi-Fi ma następujące zalety.

  • Użytkownicy mają dostęp do spójnego Wi-Fi na różnych urządzeniach z Androidem, a poprzez aktualizacje modułów mogą rozwiązywać problemy z współpracą.

  • Deweloperzy aplikacji mają zmniejszoną fragmentację platformy

  • Producenci OEM mogą spełniać wymagania operatorów, a także obniżać koszty związane z indywidualnym dostosowywaniem (ponieważ nie muszą stosować różnych implementacji tych samych wymagań na różne sposoby).

Granica modułu w Androidzie 12 i 13

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (pliki z frameworks/base/wifi/java)
      • tests/
        • android/net/wifi (pliki z frameworks/base/wifi/tests)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (pliki z frameworks/opt/net/wifi/service/java)
      • tests/
        • com/android/server/wifi (pliki z: frameworks/opt/net/wifi/tests)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (pliki z frameworks/base/packages/OsuLogin)
    • ServiceResources/ (nowość w Androidzie 12, tutaj jest przechowywany plik manifestu APK)
      • res/ (nowość w Androidzie 11, konfiguracje Wi-Fi wyodrębnione z: frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (nowość w Androidzie 13 – tutaj są przechowywane dane dotyczące inicjowania przez usługę dialogów z użytkownikiem)
      • src/
        • com/android/wifi/dialog (zawiera aktywność, z której uruchamiane są okna dialogowe)
      • AndroidManifest.xml
      • Android.bp

Powyższe katalogi zawierają też kod, który pozostaje poza modułowym składnikiem systemu i znajduje się w jego bieżącej lokalizacji, na przykład:

  • wificond interface (np. klasy w pakiecie android.net.wifi.nl80211, WifiNl80211Manager)
  • Przykładowa aplikacja z nakładką zasobów
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Producenci OEM mogą używać przykładowych poleceń, aby przenieść swoje poprawki z katalogów pierwotnych projektów do katalogu nowego projektu.

Przenieś poprawkę z platformy/platformy podstawowej/Wi-Fi

Generowanie pliku poprawki w katalogu root/frameworks/base/wifi

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

Stosowanie pliku poprawki w folderze root/packages/modules/Wifi

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

Przenoszenie poprawki z frameworks/opt/net/wifi

Przeniesienie poprawki z frameworks/opt/net/wifi wymaga złożonych kroków, ponieważ hierarchia katalogów została zmieniona podczas migracji.

W frameworks/opt/net/wifi podziel zatwierdzenie na 2 zatwierdzenia: jedno dla service/, a drugie dla tests/.

Migracja zatwierdzenia 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

Generowanie dwóch plików poprawek po zatwierdzeniu

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

Stosowanie dwóch poprawek w pakietach, modułach i Wi-Fi

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

Skrócenie 2 komitów do jednego

git rebase -i

Zmień operację drugiego zatwierdzenia na squash.

W razie potrzeby zmień wiadomość zatwierdzania.

Granica modułu w Androidzie 11

Usługa Wi-Fi nadal działa w ramach procesu System Service. Moduł Wi-Fi zawiera cały kod z packages/modules/Wifi, w tym:

  • Pakiet SDK i klasy usługi dla systemów WifiService, WifiP2pService, WifiAwareService, WifiScannerService i WifiRttService
  • OsuLogin
  • ServiceWifiResources

Moduł wyklucza te komponenty, które pozostają częścią kompilacji AOSP OEM.

  • Komponent natywny wificondsystem/connectivity/wificond
  • Interfejs wificond (klasy w pakiecie android.net.wifi.nl80211, na przykład WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11 nie przenosi plików, ale być może w kolejnych wersjach. Aby ograniczyć wysiłek związany z przenoszeniem zmian lokalizacji plików, zalecamy przekazywanie jak największej liczby zmian w AOSP (po przeniesieniu ich na Androida 11 lub refaktoryzacji zastrzeżonych rozszerzeń w celu użycia oficjalnych interfejsów API Androida lub rozszerzeń HAL dostawców w celu odłączenia ich od kodu AOSP.

Format modułu

Moduł Wi-Fi (com.android.wifi) jest w formacie APEX i jest dostępny na urządzeniach z Androidem 11 lub nowszym. Plik APEX zawiera poniższe komponenty.

  • Biblioteka pakietu SDK (framework-wifi.jar)
  • Biblioteka usługi (service-wifi.jar)
  • Plik APK OsuLogin (OsuLoginGoogle.apk)
  • Plik APK zasobu (ServiceWifiResourcesGoogle.apk)
  • certyfikaty WFA,

Zależności modułu

Moduł Wi-Fi zależy od tych komponentów.

  • Łączność
  • Połączenia telefoniczne
  • Biblioteki prototypowe
  • Inne komponenty systemu
  • Interfejsy HAL Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Ten moduł współpracuje z ramami wyłącznie przy użyciu stabilnego interfejsu @SystemApi (bez używania interfejsu @hide) i jest podpisany podpisem Google zamiast podpisu platformy.

Dostosowywanie

Moduł Wi-Fi nie obsługuje bezpośredniego dostosowywania, ale możesz dostosować konfigurację za pomocą nakładek zasobów w czasie wykonywania (RRO) lub konfiguracji operatora.

Personalizacja Wi-Fi

Rysunek 2. Dostosowanie modułu Wi-Fi

  • Aby wprowadzić drobne zmiany, włącz lub wyłącz ustawienia w menu config.
  • Aby mieć większą kontrolę, dostosuj wartości konfiguracji dla dowolnego klucza konfiguracji operatora, który jest udostępniany jako @SystemAPI.

Używanie nakładek zasobów środowiska wykonawczego

Moduł Wi-Fi możesz dostosować, zastępując domyślne konfiguracje za pomocą RRO. Listę konfiguracji, które można nakładać, znajdziesz w sekcji packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. Szczegółowe informacje o zachowaniu konfiguracji znajdziesz w artykule packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. Przykładową aplikację nakładową znajdziesz w artykule device/google/coral/rro_overlays/WifiOverlay/.

Plik device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml ustawia atrybut targetPackage na com.android.wifi.resources, a plik APK zasobu dostarczany przez moduł Wi-Fi ma nazwę pakietu com.google.android.wifi.resources. Aby nakładać konfiguracje Wi-Fi, musisz ustawić wartości atrybutów targetPackage w pliku APK nakładki na com.google.android.wifi.resources.

Migracja formatu miejsca na dane konfiguracji

Moduł Wi-Fi może analizować tylko format pamięci konfiguracji Wi-Fi AOSP. Jeśli format pamięci konfiguracji Wi-Fi został wcześniej zmodyfikowany (w tym lista zapisanych sieci użytkownika), przed aktualizacją urządzenia do dowolnej wersji Androida zawierającej moduł Wi-Fi musisz przekonwertować te dane na format AOSP. Elementy wywołujące potrzebne do wykonania tej konwersji znajdują się w klasie android.net.wifi.WifiMigration.

Konwersję formatu można zaimplementować na 2 sposoby:

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Wywoływany przez moduł Wi-Fi w celu pobrania treści pliku z wspólnego magazynu Wi-Fi, który został przekonwertowany do formatu AOSP.

    • Wcześniej (w Androidzie 10) te pliki były przechowywane w folderze /data/misc/wifina urządzeniu.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Wywoływana przez moduł Wi-Fi w celu pobrania zawartości pliku magazynu dla określonego użytkownika Wi-Fi, która została przekonwertowana na format AOSP.

    • Te pliki były wcześniej (w Androidzie 10) przechowywane w folderze /data/misc_ce/<userId>/wifi na urządzeniu.

Dostęp do ukrytych interfejsów API Wi-Fi

Symbole (klasy, metody, pola itp.) opatrzone adnotacją @hide w module Wi-Fi nie są częścią publicznego interfejsu API i nie można ich używać na urządzeniach z zainstalowanym modułem. Urządzenia, które nie mają modułu Wi-Fi, mogą nadal korzystać z interfejsów API Wi-Fi @hide, wykonując te czynności.

  1. Usuń ograniczenia widoczności zastosowane do framework-wifi na stronie packages/modules/Wifi/framework/Android.bp, zmieniając atrybut impl_library_visibility na publiczny.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Zmień regułę kompilacji, aby zezwolić na dostęp do biblioteki @hideinterfejsów API Wi-Fi. Poniżej znajdziesz przykład reguły kompilacji dla java_library.

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

    Aby zezwolić usłudze foo-lib na dostęp do biblioteki, zmień regułę kompilacji w ten sposób:

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Upewnij się, że na liście libs element framework-wifi.impl znajduje się przed elementem framework. Kolejność zależności w atrybucie libs ma znaczenie.

Dostęp do ukrytych interfejsów API platformy

Kod w module Wi-Fi nie ma dostępu do symboli oznaczonych @hide poza modułem Wi-Fi. Urządzenia, które nie mają modułu Wi-Fi, mogą nadal korzystać z @hide zewnętrznych interfejsów API (np. z framework.jar) w service-wifi, wprowadzając te zmiany w frameworks/opt/net/wifi/service/Android.bp:

  1. W zarówno wifi-service-pre-jarjar, jak i service-wifi zmień atrybut sdk_version na core_platform.

  2. Do atrybutu libs w obu tagach wifi-service-pre-jarjar i service-wifi dodaj wartości framework i android_system_server_stubs_current.

  3. Sprawdź, czy wynik jest podobny do tego przykładowego kodu.

    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",
        ],
    }
    

Testowanie

Pakiet Android Compatibility Test Suite (CTS) sprawdza możliwości modułu Wi-Fi, przeprowadzając kompleksowy zestaw testów CTS każdej jego wersji. Możesz też przeprowadzić testy opisane w artykule Testowanie, debugowanie i optymalizowanie Wi-Fi.