Wi-fi

O módulo Wi-Fi é atualizável, o que significa que pode receber atualizações de funcionalidade 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 corrigem problemas de interoperabilidade por meio de atualizações de módulos.

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

  • Os OEMs podem atender aos requisitos da transportadora 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 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 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 App para iniciar diálogos de usuário solicitados pelo serviço é armazenado aqui.)
      • src/
        • com/android/wifi/dialog (contém a atividade da qual os diálogos são iniciados)
      • AndroidManifest.xml
      • Android.bp

Os diretórios acima também contêm código que permanece fora do componente do sistema modular 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 amostra 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 patch em root/frameworks/base/wifi

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

Aplicando o arquivo patch em 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 do diretório 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

Comprimindo 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 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 permanecem 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 AOSP (depois de portá-las para o Android 11 ou refatorar extensões proprietárias para usar APIs formais do Android ou extensões HAL de fornecedor para desembaraçá-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 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 do sistema diversos
  • WiFi HAL
  • 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.

Personalizando

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 wi-fi

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

  • Para pequenas personalizações, ative ou desative as configurações na config do RRO.
  • Para obter mais controle, personalize os valores de configuração para qualquer chave de configuração de 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 do comportamento de configuração, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml . Para obter um exemplo de aplicativo de sobreposição, 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 fornecido pelo módulo Wi-Fi tem o nome do pacote com.google.android.wifi.resources , você deve definir o APKS 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), você deve 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>)

    • Chamado 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 armazenados anteriormente (no Android 10) na pasta /data/misc/wifi no dispositivo.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Chamado 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 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 a usar @hide Wi-Fi APIs usando 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, o seguinte é uma regra de construção para um java_library .

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

    Para permitir 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 de framework na lista de libs . A ordem das dependências no atributo libs é significativa.

Acessando APIs de estrutura oculta

Os 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. Dispositivos que não incluem o módulo Wi-Fi podem continuar usando @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 .