Wi-Fi

Moduł Wi-Fi można aktualizować, co oznacza, że ​​może otrzymywać aktualizacje funkcjonalności poza normalnym cyklem wydawniczym Androida. Moduł ten 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ójne działanie Wi-Fi na urządzeniach z Androidem i poprawki problemów ze współdziałaniem poprzez aktualizacje modułów.

  • Twórcy aplikacji uzyskują zmniejszoną fragmentację platformy.

  • Producenci OEM mogą spełniać 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 nakładki 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 na Androida 13 do uruchamiania okien dialogowych użytkownika żądanych przez usługę jest przechowywana tutaj).
      • src/
        • com/android/wifi/dialog (zawiera aktywność, z której uruchamiane są okna dialogowe)
      • AndroidManifest.xml
      • Android.bp

Powyższe katalogi zawierają także kod, który pozostaje poza modułowym komponentem systemu i w jego aktualnej 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ą skorzystać z przykładowych poleceń, aby pomóc w przenoszeniu poprawek z oryginalnych katalogów projektu do nowego katalogu projektu.

Przenoszenie łatki z frameworków/base/wifi

Generowanie pliku łatki w katalogu root/frameworks/base/wifi

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

Zastosowanie pliku łatki do katalogu głównego/pakietów/modułów/Wifi

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

Przenoszenie łatki z frameworks/opt/net/wifi

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

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 łatek zatwierdzeń

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

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

Zgniatanie dwóch zatwierdzeń z powrotem w jedno zatwierdzenie

git rebase -i

Zmień operację drugiego zatwierdzenia na squash .

Edytuj odpowiednio 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 poniższe.

  • 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.

  • Komponent natywny 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ą to zrobić. Aby zmniejszyć wysiłek związany z przenoszeniem zmian lokalizacji plików, zalecamy przesłanie jak największej liczby zmian do 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 komponenty.

  • Biblioteka SDK ( framework-wifi.jar )
  • Biblioteka usług ( service-wifi.jar )
  • APK OsuLogin ( OsuLoginGoogle.apk )
  • Zasób APK ( 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

Moduł ten współdziała z frameworkiem przy użyciu wyłącznie stabilnego @SystemApi (bez użycia API @hide ) i jest podpisany podpisem Google zamiast podpisem platformy.

Dostosowywanie

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

Personalizacja 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 konfiguracyjnego operatora widocznego 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. Listę konfiguracji, które można nakładać, znajdziesz w packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml . Aby uzyskać szczegółowe informacje na temat zachowania konfiguracji, zobacz packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml . Aby zapoznać się z przykładową aplikacją nakładki, zobacz 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 plik APK zasobu dostarczany 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.

Migrowanie 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 do formatu AOSP podczas aktualizacji urządzenia do dowolnej wersji Androida zawierającej moduł Wi-Fi. Haki potrzebne do tej konwersji znajdują się w klasie android.net.wifi.WifiMigration .

Zaimplementuj konwersję formatu za pomocą następujących metod.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

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

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

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

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

    • Pliki te 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.) oznaczone @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 @hide Wi-Fi, wykonując poniższe kroki.

  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 umożliwić bibliotekom dostęp do interfejsów API @hide Wi-Fi. Na przykład poniżej znajduje się reguła 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

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

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

  2. Zarówno w wifi-service-pre-jarjar , jak 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

Pakiet testów zgodności systemu Android (CTS) weryfikuje funkcjonalność modułu Wi-Fi, uruchamiając kompleksowy zestaw testów CTS w każdej wersji modułu. Można także uruchomić testy opisane w części Testowanie, debugowanie i strojenie sieci Wi-Fi .