Wi-Fi

O módulo Wi-Fi é atualizável, ou seja, ele pode receber atualizações de recursos fora do ciclo normal de lançamento do Android. Este módulo contém os componentes a seguir.

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 do Wi-Fi em dispositivos Android e correções de problemas de interoperabilidade com atualizações de módulos.

  • Os desenvolvedores de apps têm uma fragmentação de plataforma reduzida.

  • Os OEMs podem atender aos requisitos da operadora e 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 o Android 12 e o 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 do 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, o app para iniciar diálogos do usuário solicitados pelo serviço é armazenado aqui.)
      • src/
        • com/android/wifi/dialog: contém a atividade de onde 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 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

Como aplicar o arquivo de patch a root/packages/modules/Wi-Fi

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

Como migrar o HEAD commit

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

Como gerar 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

Aplicação dos dois patches a pacotes/módulos/Wi-Fi

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

Como mesclar dois commits em um

git rebase -i

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

Edite a mensagem de confirmação conforme apropriado.

Limite do módulo para o Android 11

O serviço de Wi-Fi continua sendo executado dentro do processo do serviço do sistema. O módulo Wi-Fi inclui todo o código 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 fazendo parte do build 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 as versões futuras podem. Para reduzir o esforço envolvido na portabilidade de mudanças de local de arquivos, recomendamos fazer o máximo possível de mudanças no AOSP depois da portabilidade para o Android 11 ou da refatoração de extensões próprias para usar APIs formais do Android ou extensões HAL do fornecedor para desembaraçar o 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 o 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 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
  • Outros componentes do sistema
  • HALs de Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Esse módulo interage com o framework usando apenas @SystemApi estável (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 oferece suporte à personalização direta, mas é possível personalizar a configuração usando sobreposições de recursos de execução (RROs, na sigla em inglês) ou configurações de 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 config do RRO.
  • 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 conferir uma lista de configurações sobrepostas, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. Para detalhes sobre o comportamento de configuração, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. Para conferir 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 recurso entregue pelo módulo Wi-Fi tem o nome de pacote com.google.android.wifi.resources, é necessário definir o APK de sobreposição targetPackage como com.google.android.wifi.resources para sobrepor as configurações do Wi-Fi.

Migrar o formato de armazenamento da configuração

O módulo Wi-Fi só pode analisar o formato de armazenamento de configuração Wi-Fi do AOSP. Se você já tiver modificado o formato de armazenamento de 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 métodos a seguir.

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

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

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

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

    • Esses arquivos eram armazenados anteriormente (no Android 10) 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 de 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. Os dispositivos que não incluem o módulo Wi-Fi podem continuar usando as APIs Wi-Fi @hide seguindo as etapas abaixo.

  1. Remova as restrições de visibilidade aplicadas a 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 que a biblioteca acesse as APIs Wi-Fi @hide. Por exemplo, confira a seguir 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 forma:

    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 é significativa.

Acessar APIs de framework ocultas

Os símbolos anotados com @hide fora do módulo Wi-Fi não podem ser acessados por código no módulo Wi-Fi. Os dispositivos que não incluem o módulo Wi-Fi podem continuar usando APIs externas @hide (por exemplo, do 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 conjunto de teste de compatibilidade do Android (CTS) verifica os recursos do módulo Wi-Fi executando um conjunto abrangente de testes do CTS em cada versão do módulo. Você também pode executar os testes descritos em Testar, depurar e ajustar o Wi-Fi.