Wi-fi

O módulo Wi-Fi é atualizável, o que significa que pode receber atualizações de funcionalidades fora do ciclo normal de lançamento do Android. Este módulo contém os seguintes componentes.

Componentes do módulo Wi-Fi

Figura 1. Componentes e arquitetura do módulo Wi-Fi

O módulo Wi-Fi oferece os seguintes benefícios.

  • Os usuários finais obtêm uma experiência Wi-Fi consistente em dispositivos Android e corrige problemas de interoperabilidade por meio de atualizações de módulo.

  • Os desenvolvedores de aplicativos obtêm fragmentação de plataforma reduzida.

  • Os OEMs podem atender aos requisitos da operadora e, ao mesmo tempo, reduzir os custos de personalizações individuais (já que não precisam de diferentes implementações dos mesmos requisitos de maneiras diferentes).

Limite do módulo para Android 12

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (arquivos de frameworks/base/wifi/java )
      • tests/
        • android/net/wifi (arquivos de frameworks/base/wifi/tests )
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (arquivos de frameworks/opt/net/wifi/service/java )
      • tests/
        • com/android/server/wifi (arquivos de frameworks/opt/net/wifi/tests )
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (arquivos de frameworks/base/packages/OsuLogin )
    • ServiceResources/ (novo no Android 12, o manifesto do Overlay APK é armazenado aqui)
      • res/ (novo no Android 11, configurações de Wi-Fi extraídas de frameworks/base/core/res/res )
      • AndroidManifest.xml
      • Android.bp

Os diretórios acima também contêm código que permanece fora do componente modular do sistema e em sua localização atual, por exemplo:

  • wificond interface (classes no pacote android.net.wifi.nl80211 , por exemplo, WifiNl80211Manager )
  • Exemplo de aplicativo de sobreposição de recursos
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Os OEMs podem usar os comandos de exemplo para ajudar a mover seus patches dos diretórios do projeto original para o novo diretório do projeto.

Movendo um patch de frameworks/base/wifi

Gerando o arquivo de patch em root/frameworks/base/wifi

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

Aplicando o arquivo de patch para root/packages/modules/Wifi

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

Movendo um patch de frameworks/opt/net/wifi

Para mover o patch de frameworks/opt/net/wifi , são necessárias etapas complexas porque a hierarquia de diretórios foi alterada durante a migração.

Em frameworks/opt/net/wifi , divida o commit em dois commits, um para service/ e outro para tests/ .

Migrando o commit 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

Gerando dois arquivos de patch de confirmação

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

Aplicando os dois patches a pacotes/módulos/Wifi

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

Esmagando os dois commits de volta em um commit

git rebase -i

Altere a operação do segundo commit para squash .

Edite a mensagem de confirmação conforme apropriado.

Limite do módulo para Android 11

O serviço Wi-Fi continua a ser executado dentro do processo de serviço do sistema. O módulo Wi-Fi inclui todos os códigos em packages/modules/Wifi , incluindo o seguinte.

  • SDK e classes de serviço para WifiService , WifiP2pService , WifiAwareService , WifiScannerService e WifiRttService
  • OsuLogin
  • ServiceWifiResources

O módulo exclui os seguintes componentes, que continuam a fazer parte da compilação AOSP do OEM.

  • componente nativo wificond em system/connectivity/wificond
  • interface wificond (classes no pacote android.net.wifi.nl80211 , por exemplo, WifiNl80211Manager )
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

O Android 11 não move arquivos, mas versões futuras podem. Para reduzir o esforço envolvido na portabilidade de alterações de local de arquivo, recomendamos upstream o máximo possível de alterações para o AOSP (depois de transferi-las para o Android 11 ou refatorar extensões proprietárias para usar APIs formais do Android ou extensões HAL do fornecedor para separá-las do código AOSP.

Formato do módulo

O módulo Wi-Fi ( com.google.android.wifi.apex ) está no formato APEX e está disponível para dispositivos com Android 11 ou superior. O arquivo APEX inclui os seguintes componentes.

  • Biblioteca SDK ( framework-wifi.jar )
  • Biblioteca de serviços ( service-wifi.jar )
  • OsuLogin APK ( OsuLoginGoogle.apk )
  • APK de recursos ( ServiceWifiResourcesGoogle.apk )
  • Certificados WFA

Dependências do módulo

O módulo Wi-Fi depende dos seguintes componentes.

  • Conectividade
  • Telefonia
  • Proto-bibliotecas
  • Componentes diversos do sistema
  • HALs de Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Este módulo interage com a estrutura usando apenas @SystemApi estável (sem uso de API @hide ) e é assinado com uma assinatura do Google em vez de uma assinatura de plataforma.

Personalização

O módulo Wi-Fi não oferece suporte à personalização direta, mas você pode personalizar a configuração usando sobreposições de recursos de tempo de execução (RROs) ou configurações de operadora.

Personalização de Wi-Fi

Figura 2. Personalização do módulo Wi-Fi

  • Para pequenas personalizações, habilite ou desabilite as configurações na config do RRO.
  • Para obter mais controle, personalize os valores de configuração para qualquer chave de configuração da operadora exposta como @SystemAPI .

Usando sobreposições de recursos de tempo de execução

Você pode personalizar o módulo Wi-Fi substituindo as configurações padrão usando RROs. Para obter uma lista de configurações sobrepostas, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml . Para obter detalhes sobre o comportamento de configuração, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml . Para um aplicativo de sobreposição de amostra, consulte device/google/coral/rro_overlays/WifiOverlay/ .

Porque o arquivo device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml define o atributo targetPackage como com.android.wifi.resources e o APK de recurso entregue pelo módulo Wi-Fi tem o nome do pacote com.google.android.wifi.resources , você deve definir o destino do targetPackage de sobreposição como com.google.android.wifi.resources para sobrepor as configurações de Wi-Fi com sucesso.

Migrando o formato de armazenamento de configuração

O módulo Wi-Fi pode analisar apenas o formato de armazenamento de configuração Wi-Fi AOSP. Se você modificou anteriormente o formato de armazenamento de configuração de Wi-Fi (que inclui a lista de redes salvas do usuário), deverá converter esses dados para o formato AOSP ao atualizar um dispositivo para qualquer versão do Android que inclua o módulo Wi-Fi. Os ganchos necessários para esta conversão estão na classe android.net.wifi.WifiMigration .

Implemente a conversão de formato nos métodos a seguir.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Invocado pelo módulo Wi-Fi para recuperar o conteúdo do arquivo de armazenamento compartilhado Wi-Fi que foi convertido para o formato AOSP.

    • Esses arquivos foram anteriormente (no Android 10) armazenados na pasta /data/misc/wifi no dispositivo.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Invocado pelo módulo Wi-Fi para recuperar o conteúdo do arquivo de armazenamento específico do usuário Wi-Fi que foi convertido para o formato AOSP.

    • Esses arquivos foram armazenados anteriormente (no Android 10) na pasta /data/misc_ce/<userId>/wifi no dispositivo.

Acessando APIs Wi-Fi ocultas

Símbolos (classes, métodos, campos etc.) anotados com @hide no módulo Wi-Fi não fazem parte de sua superfície de API pública e não podem ser acessados ​​em dispositivos com o módulo instalado. Os dispositivos que não incluem o módulo Wi-Fi podem continuar usando @hide Wi-Fi APIs seguindo as etapas a seguir.

  1. Remova as restrições de visibilidade colocadas no framework-wifi em packages/modules/Wifi/framework/Android.bp alterando o atributo impl_library_visibility para public.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Altere a regra de compilação para permitir o acesso à biblioteca @hide Wi-Fi APIs. Por exemplo, a seguir está uma regra de construção para um java_library .

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

    Para permitir o acesso à biblioteca para foo-lib , altere a regra de compilação conforme mostrado abaixo.

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Certifique-se de que framework-wifi.impl apareça antes do framework na lista de libs . A ordem das dependências no atributo libs é significativa.

Acessando APIs de estrutura oculta

Símbolos anotados com @hide fora do módulo Wi-Fi não podem ser acessados ​​por código dentro do módulo Wi-Fi. Os dispositivos que não incluem o módulo Wi-Fi podem continuar a usar @hide APIs externas (por exemplo, de framework.jar ) em service-wifi fazendo as seguintes modificações em frameworks/opt/net/wifi/service/Android.bp .

  1. Em wifi-service-pre-jarjar e service-wifi , altere o atributo sdk_version para core_platform .

  2. Em wifi-service-pre-jarjar e service-wifi , adicione framework e android_system_server_stubs_current ao atributo libs .

  3. Verifique se o resultado é semelhante ao exemplo de código a seguir.

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

Teste

O Android Compatibility Test Suite (CTS) verifica a funcionalidade do módulo Wi-Fi executando um conjunto abrangente de testes CTS em cada versão do módulo. Você também pode executar os testes descritos em Teste, depuração e ajuste de Wi-Fi .