Wi-Fi

Moduł Wi-Fi można aktualizować, co oznacza, że ​​może otrzymywać aktualizacje funkcji poza normalnym cyklem wydawniczym Androida. Ten moduł zawiera następujące komponenty.

Elementy modułu Wi-Fi

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

Moduł Wi-Fi zapewnia następujące korzyści.

  • Użytkownicy końcowi uzyskują spójną jakość Wi-Fi na wszystkich urządzeniach z systemem Android oraz poprawki problemów z interoperacyjnością dzięki aktualizacjom modułów.

  • Deweloperzy aplikacji uzyskują mniejszą fragmentację platformy.

  • Producenci OEM mogą spełnić wymagania przewoźników, jednocześnie zmniejszając koszty indywidualnych dostosowań (ponieważ nie potrzebują różnych implementacji tych samych wymagań na różne sposoby).

Granica modułu dla Androida 12 i Androida 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 przechowywany jest manifest Overlay APK)
      • res/ (nowość w Androidzie 11, konfiguracje Wi-Fi wyodrębnione z frameworks/base/core/res/res )
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (nowość w aplikacji Android 13 do uruchamiania okien dialogowych użytkownika żądanych przez usługę jest przechowywana tutaj).
      • src/
        • com/android/wifi/dialog (zawiera działanie, z którego uruchamiane są okna dialogowe)
      • AndroidManifest.xml
      • Android.bp

Powyższe katalogi zawierają również kod, który pozostaje poza komponentem systemu modułowego iw swojej bieżącej lokalizacji, np.:

  • wificond interface (klasy w pakiecie android.net.wifi.nl80211 , na przykład WifiNl80211Manager )
  • Przykładowa aplikacja do nakładania zasobów
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Producenci OEM mogą korzystać z przykładowych poleceń, aby ułatwić sobie przenoszenie poprawek z oryginalnych katalogów projektu do nowego katalogu projektu.

Przenoszenie łatki z frameworków/base/wifi

Generowanie pliku poprawki w katalogu głównym/frameworks/base/wifi

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

Stosowanie pliku łaty do katalogu głównego/packages/modules/Wifi

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

Przenoszenie poprawki z frameworks/opt/net/wifi

Aby przenieść łatkę z frameworks/opt/net/wifi , potrzebne są złożone kroki, ponieważ hierarchia katalogów została zmieniona podczas migracji.

W frameworks/opt/net/wifi podziel zatwierdzenie na dwa zatwierdzenia, jedno dla service/ i jedno 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 zatwierdzenia

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

Zastosowanie dwóch poprawek do pakietów/modułów/Wifi

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

Zgniecenie dwóch zatwierdzeń z powrotem w jedno zatwierdzenie

git rebase -i

Zmień operację drugiego zatwierdzenia na squash .

Odpowiednio zmodyfikuj komunikat zatwierdzenia.

Granica modułu dla Androida 11

Usługa Wi-Fi nadal działa w ramach procesu usługi systemowej. Moduł Wi-Fi zawiera cały kod w packages/modules/Wifi , w tym następujące.

  • SDK i klasy usług dla WifiService , WifiP2pService , WifiAwareService , WifiScannerService i WifiRttService
  • OsuLogin
  • ServiceWifiResources

Moduł nie obejmuje następujących komponentów, które pozostają częścią kompilacji AOSP producenta OEM.

  • natywny komponent wificond w system/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 przyszłe wersje mogą. Aby zmniejszyć wysiłek związany z przenoszeniem zmian lokalizacji plików, zalecamy jak najwięcej zmian w AOSP (po przeniesieniu ich do Androida 11 lub refaktoryzacji zastrzeżonych rozszerzeń w celu użycia formalnych interfejsów API Androida lub rozszerzeń HAL dostawcy w celu oddzielenia ich od kodu AOSP.

Format modułu

Moduł Wi-Fi ( com.android.wifi ) jest w formacie APEX i jest dostępny dla urządzeń z systemem Android 11 lub nowszym. Plik APEX zawiera następujące składniki.

  • Biblioteka SDK ( framework-wifi.jar )
  • Biblioteka usług ( service-wifi.jar )
  • OsuLogin APK ( OsuLoginGoogle.apk )
  • Plik APK zasobu ( ServiceWifiResourcesGoogle.apk )
  • Certyfikaty WFA

Zależności modułów

Moduł Wi-Fi zależy od następujących komponentów.

  • Łączność
  • Telefonia
  • Biblioteki proto
  • Różne elementy systemu
  • Wi-Fi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Ten moduł współdziała z frameworkiem, używając tylko stabilnego @SystemApi (bez użycia @hide API) i jest podpisany podpisem Google zamiast podpisu platformy.

Dostosowywanie

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

Dostosowanie Wi-Fi

Rysunek 2. Personalizacja modułu Wi-Fi

  • W przypadku drobnych dostosowań włącz lub wyłącz ustawienia w config RRO .
  • Aby uzyskać większą kontrolę, dostosuj wartości konfiguracyjne dla dowolnego klucza konfiguracji przewoźnika, który jest widoczny jako @SystemAPI .

Korzystanie z nakładek zasobów środowiska wykonawczego

Możesz dostosować moduł Wi-Fi, zastępując domyślne konfiguracje za pomocą RRO. Aby uzyskać listę konfiguracji, które można nakładać, zapoznaj się z packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml . Aby uzyskać szczegółowe informacje dotyczące zachowania konfiguracji, zapoznaj się z packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml . Przykładową aplikację nakładki znajdziesz na device/google/coral/rro_overlays/WifiOverlay/ .

Ponieważ plik device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml ustawia atrybut targetPackage na com.android.wifi.resources , a zasób APK dostarczony przez moduł Wi-Fi ma nazwę pakietu com.google.android.wifi.resources , musisz ustawić nakładkę APKS targetPackage na com.google.android.wifi.resources , aby pomyślnie nałożyć konfiguracje Wi-Fi.

Migracja formatu przechowywania konfiguracji

Moduł Wi-Fi może analizować tylko format przechowywania konfiguracji Wi-Fi AOSP. Jeśli wcześniej zmodyfikowałeś format przechowywania konfiguracji Wi-Fi (który obejmuje zapisaną listę sieci użytkownika), musisz przekonwertować te dane na format AOSP podczas uaktualniania urządzenia do dowolnej wersji Androida, która zawiera moduł Wi-Fi. Haczyki potrzebne do tej konwersji znajdują się w klasie android.net.wifi.WifiMigration .

Zaimplementuj konwersję formatu w następujących metodach.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Wywoływany przez moduł Wi-Fi w celu pobrania zawartości udostępnionego pliku magazynu Wi-Fi, który został przekonwertowany na format AOSP.

    • Te pliki były wcześniej (w systemie Android 10) przechowywane w folderze /data/misc/wifi na urządzeniu.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Wywoływany przez moduł Wi-Fi w celu pobrania zawartości pliku magazynu specyficznego dla użytkownika Wi-Fi, który został przekonwertowany na format AOSP.

    • Te pliki były wcześniej (w systemie Android 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ą jego publicznej powierzchni API i nie można uzyskać do nich dostępu na urządzeniach z zainstalowanym modułem. Urządzenia, które nie zawierają modułu Wi-Fi, mogą nadal korzystać z interfejsów API Wi-Fi @hide , wykonując poniższe czynności.

  1. Usuń ograniczenia widoczności nałożone na framework-wifi w packages/modules/Wifi/framework/Android.bp , zmieniając atrybut impl_library_visibility na public.

    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 bibliotek @hide Wi-Fi API. Na przykład poniżej przedstawiono regułę kompilacji dla java_library .

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

    Aby zezwolić na dostęp do biblioteki dla foo-lib , zmień regułę kompilacji, jak pokazano poniżej.

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Upewnij się, że framework-wifi.impl pojawia się przed framework na liście libs . Kolejność zależności w atrybucie libs jest znacząca.

Dostęp do ukrytych interfejsów API frameworka

Symboli z adnotacją @hide poza modułem Wi-Fi nie można uzyskać za pomocą kodu w module Wi-Fi. Urządzenia, które nie zawierają modułu Wi-Fi, mogą nadal używać @hide zewnętrznych interfejsów API (na przykład z framework.jar ) w service-wifi , wprowadzając następujące modyfikacje do frameworks/opt/net/wifi/service/Android.bp .

  1. Zarówno w wifi-service-pre-jarjar i service-wifi zmień atrybut sdk_version na core_platform .

  2. Zarówno w wifi-service-pre-jarjar i service-wifi dodaj framework i android_system_server_stubs_current do atrybutu libs .

  3. Sprawdź, czy wynik jest podobny do poniższego 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

Android Compatibility Test Suite (CTS) weryfikuje funkcjonalność modułu Wi-Fi, przeprowadzając kompleksowy zestaw testów CTS w każdej wersji modułu. Możesz także uruchomić testy opisane w artykule Testowanie, debugowanie i dostrajanie sieci Wi-Fi .