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 o seguinte componentes de solução.

Componentes do módulo Wi-Fi

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

Veja a seguir os benefícios do módulo Wi-Fi.

  • 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 menos fragmentação de plataforma.

  • 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 do 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/ (novidade no Android 12, sobreposição o manifesto do APK é armazenado aqui.
      • res/ (novidade no Android 11, configurações de Wi-Fi) extraído de frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (novo no app Android 13 para iniciar caixas de diálogo do usuário solicitadas pelo serviço é armazenada aqui.)
      • src/
        • com/android/wifi/dialog (contém a atividade que as caixas de diálogo estão iniciado)
      • AndroidManifest.xml
      • Android.bp

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

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

Os OEMs podem usar os exemplos de comandos para ajudar a mover os patches dos diretórios do projeto original para o novo diretório do 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 do diretório 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

Como aplicar os dois patches a pacotes/módulos/Wi-Fi

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

Comprimir as duas confirmações em uma só

git rebase -i

Altere a operação da segunda confirmação para squash.

Edite a mensagem de confirmação conforme necessário.

Limite do módulo para o Android 11

O serviço de Wi-Fi continua sendo executado dentro do processo de serviço do sistema. O 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 sendo parte da série build do AOSP.

  • 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 transferência de mudanças de localização de arquivos, recomendamos fazer upstream de quantas mudanças for possível 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 do AOSP.

Formato do módulo

O módulo de Wi-Fi (com.android.wifi) está ativado no formato APEX e está disponível para dispositivos com o Android 11 ou mais recente. O arquivo APEX inclui componentes a seguir.

  • Biblioteca do SDK (framework-wifi.jar)
  • Biblioteca de serviços (service-wifi.jar)
  • APK OsuLogin (OsuLoginGoogle.apk)
  • APK de recurso (ServiceWifiResourcesGoogle.apk)
  • Certificados 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

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

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 ambiente de execução

Você pode personalizar o módulo Wi-Fi substituindo as configurações padrão usando RROs. Para uma lista de configurações de sobreposição, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml: Para detalhes do 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 device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml define o atributo targetPackage como com.android.wifi.resources e o O APK de recursos fornecido pelo módulo Wi-Fi tem um nome de pacote. com.google.android.wifi.resources, é preciso definir os APKs de sobreposição De targetPackage para com.google.android.wifi.resources para sobrepor o Wi-Fi com sucesso.

Migrar o formato de armazenamento de configuração

O módulo de Wi-Fi pode analisar apenas o formato de armazenamento de configuração de Wi-Fi do AOSP. Se você já tiver modificado o formato de armazenamento da configuração de Wi-Fi (que incluir a lista de redes salvas do usuário), será necessário converter esses dados para o arquivo ao atualizar um dispositivo para qualquer versão do Android que inclua a rede Wi-Fi mais tarde neste módulo. 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 de Wi-Fi para recuperar o conteúdo do arquivo de armazenamento compartilhado por Wi-Fi que foram convertidos 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 recuperar o conteúdo do arquivo de armazenamento específico do usuário de Wi-Fi que foram convertidos para o formato AOSP.

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

Acessar APIs de Wi-Fi ocultas

Símbolos (classes, métodos, campos etc.) com a anotação @hide no Wi-Fi módulo não fazem parte da plataforma de API pública e não pode ser acessado no dispositivos com o módulo instalado. Dispositivos que não têm Wi-Fi pode continuar usando as APIs de Wi-Fi do @hide seguindo as etapas abaixo.

  1. Remova as restrições de visibilidade aplicadas a framework-wifi às packages/modules/Wifi/framework/Android.bp alterando o impl_library_visibility para o público.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Mudar a regra de build para permitir o acesso à biblioteca das APIs Wi-Fi @hide. Para exemplo, confira abaixo 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 é significativa.

Acessar APIs de framework ocultas

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

  1. Nos dois wifi-service-pre-jarjar e service-wifi, mude a 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.