Wi-Fi

O módulo Wi-Fi pode ser atualizado, ou seja, ele pode receber atualizações de recursos fora do ciclo normal de versões 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 têm uma experiência consistente de Wi-Fi em dispositivos Android e correções para problemas de interoperabilidade com atualizações de módulo.

  • Os desenvolvedores de apps têm menos fragmentação da plataforma.

  • Os OEMs podem atender aos requisitos das operadoras e reduzir os custos de personalizações individuais, já que não precisam de implementações diferentes dos mesmos requisitos de maneiras diferentes.

Limite do módulo para Android 12 e Android 13

  • 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 APK de sobreposição é armazenado aqui)
      • res/ (novo no Android 11, configurações de Wi-Fi extraídas de frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (novo no Android 13. Os diálogos do usuário iniciados pelo app e solicitados pelo serviço são armazenados aqui.)
      • src/
        • com/android/wifi/dialog (contém a atividade em que as caixas de diálogo são iniciadas)
      • AndroidManifest.xml
      • Android.bp

Os diretórios anteriores também contêm código que permanece fora do componente do sistema modular e no local atual, por exemplo:

  • wificond interface (classes no pacote android.net.wifi.nl80211, por exemplo, WifiNl80211Manager)
  • Exemplo de app 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 os patches dos diretórios de projeto originais para o novo diretório de projeto.

Mover um patch de frameworks/base/wifi

Como gerar o arquivo de patch em root/frameworks/base/wifi

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

Aplicar o arquivo de patch a root/packages/modules/Wifi

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

Mover 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, um para service/ e outro para tests/.

Migrar 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

Gerar dois arquivos de patch de commit

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

Aplicar os dois patches a packages/modules/Wifi

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

Unindo os dois commits em um só

git rebase -i

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

Edite a mensagem de commit conforme necessário.

Limite do módulo para o Android 11

O serviço de Wi-Fi continua sendo executado no processo de serviço do sistema. O módulo Wi-Fi inclui todo o código em packages/modules/Wifi, incluindo o seguinte.

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

O módulo exclui os seguintes componentes, que continuam fazendo parte do build do 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 fazer isso. Para reduzir o esforço envolvido na migração de mudanças de localização de arquivos, recomendamos o envio de upstream de quantas mudanças forem possíveis para o AOSP (depois de migrá-las para o Android 11 ou refatorar extensões proprietárias para usar APIs Android formais ou extensões HAL do fornecedor para separá-las do código AOSP.

Formato do módulo

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

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

Dependências do módulo

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

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

Esse módulo interage com o framework usando apenas @SystemApi estáveis (sem uso da API @hide) e é assinado com uma assinatura do Google em vez de uma assinatura da plataforma.

Personalização

O módulo Wi-Fi não aceita personalização direta, mas é possível personalizar a configuração usando substituições de recursos de tempo de execução (RROs, na sigla em inglês) ou configurações da operadora.

Personalização do Wi-Fi

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

  • Para pequenas personalizações, ative ou desative as configurações no RRO config.
  • Para ter mais controle, personalize os valores de configuração de qualquer chave de configuração de operadora exposta como @SystemAPI.

Usar sobreposições de recursos no momento da execução

É possível personalizar o módulo Wi-Fi substituindo as configurações padrão usando RROs. Para uma lista de configurações sobreponíveis, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. Para detalhes sobre o comportamento da configuração, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. Para um exemplo de app de sobreposição, consulte device/google/coral/rro_overlays/WifiOverlay/.

Como o arquivo device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml define o atributo targetPackage como com.android.wifi.resources e o APK de recursos entregue pelo módulo Wi-Fi tem o nome do pacote com.google.android.wifi.resources, defina o targetPackage dos APKS de sobreposição como com.google.android.wifi.resources para sobrepor as configurações de Wi-Fi com êxito.

Migrar o formato de armazenamento da configuração

O módulo Wi-Fi só pode analisar o formato de armazenamento de configuração do Wi-Fi do AOSP. Se você já tiver modificado o formato de armazenamento da configuração de Wi-Fi (que inclui a lista de redes salvas do usuário), será necessário converter esses dados para o formato AOSP ao fazer upgrade de um dispositivo para qualquer versão do Android que inclua o módulo Wi-Fi. Os hooks necessários para essa conversão estão na classe android.net.wifi.WifiMigration.

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

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

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

    • Antes (no Android 10), esses arquivos eram armazenados na pasta /data/misc/wifi do dispositivo.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

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

    • Antes (no Android 10), esses arquivos eram armazenados na pasta /data/misc_ce/<userId>/wifi do dispositivo.

Acessar APIs Wi-Fi ocultas

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

  1. Remova as restrições de visibilidade colocadas em framework-wifi em packages/modules/Wifi/framework/Android.bp mudando o atributo impl_library_visibility para público.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Mude a regra de build para permitir o acesso à biblioteca @hide APIs Wi-Fi. Por exemplo, esta é uma regra de build 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, mude a regra de build da seguinte maneira:

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Verifique se framework-wifi.impl aparece antes de framework na lista de libs. A ordem das dependências no atributo libs é importante.

Acessar APIs de framework ocultas

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 usando APIs externas @hide (por exemplo, de framework.jar) em service-wifi fazendo as seguintes modificações em frameworks/opt/net/wifi/service/Android.bp.

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

  2. Em ambos 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 Teste de compatibilidade do Android (CTS) verifica os recursos do módulo Wi-Fi executando um conjunto abrangente de testes do CTS em todas as versões do módulo. Você também pode executar os testes descritos em Testar, depurar e ajustar o Wi-Fi.