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 reduzida da plataforma.

  • Os OEMs podem atender aos requisitos das transportadoras e, ao mesmo tempo, reduzir os custos de personalizações individuais (pois 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 aplicativo Android 13 para iniciar diálogos de usuário solicitados pelo serviço é armazenado aqui.)
      • src/
        • com/android/wifi/dialog (contém a atividade a partir da qual as caixas de diálogo são iniciadas)
      • 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 amostra para ajudar a mover seus patches dos diretórios originais do projeto 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 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 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 commit

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 commit conforme apropriado.

Limite do módulo para Android 11

O serviço Wi-Fi continua em execução 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 construçã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 sim. Para reduzir o esforço envolvido na portabilidade de alterações de localização de arquivos, recomendamos upstream tantas alterações quanto possível para AOSP (após portá-las para Android 11 ou refatorar extensões proprietárias para usar APIs formais do Android ou extensões HAL de fornecedores 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 superior. O arquivo APEX inclui os seguintes componentes.

  • Biblioteca 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
  • Protobibliotecas
  • Componentes diversos do sistema
  • HALs WiFi
  • 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 RROs (sobreposições de recursos de tempo de execução) ou configurações de operadora.

Personalização de 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 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 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 de 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 êxito.

Migrando 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 da configuração 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 armazenados anteriormente (no Android 10) 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 Wi-Fi que foi convertido para o formato AOSP.

    • Esses arquivos foram armazenados anteriormente (no Android 10) na pasta /data/misc_ce/<userId>/wifi do 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 APIs @hide Wi-Fi 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 público.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Altere a regra de construção para permitir acesso à biblioteca @hide APIs Wi-Fi. Por exemplo, a seguir está uma regra de construção para 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 construçã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 framework na lista de libs . A ordem das dependências no atributo libs é significativa.

Acessando APIs de estrutura 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 a usar 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 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 .