Wifi

El módulo Wi-Fi es actualizable, lo que significa que puede recibir actualizaciones de funcionalidad fuera del ciclo de lanzamiento normal de Android. Este módulo contiene los siguientes componentes.

Componentes del módulo Wi-Fi

Figura 1. Arquitectura y componentes del módulo Wi-Fi

El módulo Wi-Fi proporciona los siguientes beneficios.

  • Los usuarios finales obtienen una experiencia Wi-Fi consistente en todos los dispositivos Android y solucionan problemas de interoperabilidad a través de actualizaciones de módulos.

  • Los desarrolladores de aplicaciones obtienen una menor fragmentación de la plataforma.

  • Los OEM pueden cumplir con los requisitos de los operadores y al mismo tiempo reducir los costos de personalizaciones individuales (ya que no necesitan diferentes implementaciones de los mismos requisitos de diferentes maneras).

Límite del módulo para Android 12 y Android 13

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (archivos de frameworks/base/wifi/java )
      • tests/
        • android/net/wifi (archivos de frameworks/base/wifi/tests )
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (archivos de frameworks/opt/net/wifi/service/java )
      • tests/
        • com/android/server/wifi (archivos de frameworks/opt/net/wifi/tests )
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (archivos de frameworks/base/packages/OsuLogin )
    • ServiceResources/ (nuevo en Android 12, el manifiesto APK superpuesto se almacena aquí)
      • res/ (nuevo en Android 11, configuraciones de Wi-Fi extraídas de frameworks/base/core/res/res )
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (lo nuevo en la aplicación de Android 13 para iniciar los diálogos de usuario solicitados por el servicio se almacena aquí).
      • src/
        • com/android/wifi/dialog (Contiene la actividad desde la que se inician los cuadros de diálogo)
      • AndroidManifest.xml
      • Android.bp

Los directorios anteriores también contienen código que permanece fuera del componente del sistema modular y en su ubicación actual, por ejemplo:

  • wificond interface (clases en el paquete android.net.wifi.nl80211 , por ejemplo, WifiNl80211Manager )
  • Aplicación de superposición de recursos de muestra
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Los OEM pueden utilizar los comandos de muestra para ayudar a mover sus parches de los directorios del proyecto original al nuevo directorio del proyecto.

Mover un parche desde frameworks/base/wifi

Generando el archivo de parche en root/frameworks/base/wifi

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

Aplicar el archivo de parche a root/packages/modules/Wifi

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

Mover un parche desde frameworks/opt/net/wifi

Para mover el parche desde frameworks/opt/net/wifi , se necesitan pasos complejos porque la jerarquía de directorios se cambió durante la migración.

En frameworks/opt/net/wifi , divida la confirmación en dos confirmaciones, una para service/ y otra para tests/ .

Migrando el compromiso 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

Generando dos archivos de parche de confirmación

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

Aplicando los dos parches a paquetes/módulos/Wifi

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

Aplastando los dos compromisos nuevamente en un solo compromiso

git rebase -i

Cambie la operación de la segunda confirmación a squash .

Edite el mensaje de confirmación según corresponda.

Límite del módulo para Android 11

El servicio Wi-Fi continúa ejecutándose dentro del proceso de Servicio del sistema. El módulo Wi-Fi incluye todo el código en packages/modules/Wifi incluido lo siguiente.

  • SDK y clases de servicio para WifiService , WifiP2pService , WifiAwareService , WifiScannerService y WifiRttService
  • OsuLogin
  • ServiceWifiResources

El módulo excluye los siguientes componentes, que siguen siendo parte de la compilación AOSP del OEM.

  • Componente nativo wificond en system/connectivity/wificond
  • interfaz wificond (clases en el paquete android.net.wifi.nl80211 , por ejemplo, WifiNl80211Manager )
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11 no mueve archivos, pero las versiones futuras sí podrían hacerlo. Para reducir el esfuerzo que implica transferir los cambios de ubicación de archivos, recomendamos actualizar tantos cambios como sea posible a AOSP (después de transferirlos a Android 11 o refactorizar extensiones propietarias para usar API formales de Android o extensiones HAL de proveedores para desenredarlos del código AOSP.

Formato del módulo

El módulo Wi-Fi ( com.android.wifi ) está en formato APEX y está disponible para dispositivos con Android 11 o superior. El archivo APEX incluye los siguientes componentes.

  • Biblioteca SDK ( framework-wifi.jar )
  • Biblioteca de servicios ( service-wifi.jar )
  • OsuLogin APK ( OsuLoginGoogle.apk )
  • APK de recursos ( ServiceWifiResourcesGoogle.apk )
  • certificados WFA

Dependencias del módulo

El módulo Wi-Fi depende de los siguientes componentes.

  • Conectividad
  • Telefonía
  • Protobibliotecas
  • Componentes varios del sistema
  • HAL WiFi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Este módulo interactúa con el marco utilizando solo @SystemApi estable (sin uso de API @hide ) y está firmado con una firma de Google en lugar de una firma de plataforma.

Personalización

El módulo Wi-Fi no admite la personalización directa, pero puede personalizar la configuración mediante superposiciones de recursos de tiempo de ejecución (RRO) o configuraciones del operador.

Personalización de wifi

Figura 2. Personalización del módulo Wi-Fi

  • Para pequeñas personalizaciones, habilite o deshabilite la configuración en la config de RRO.
  • Para obtener más control, personalice los valores de configuración para cualquier clave de configuración del operador expuesta como @SystemAPI .

Usar superposiciones de recursos en tiempo de ejecución

Puede personalizar el módulo Wi-Fi anulando las configuraciones predeterminadas mediante RRO. Para obtener una lista de configuraciones superpuestas, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml . Para obtener detalles sobre el comportamiento de la configuración, consulte packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml . Para ver una aplicación de superposición de muestra, consulte device/google/coral/rro_overlays/WifiOverlay/ .

Porque el archivo device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml establece el atributo targetPackage en com.android.wifi.resources y el APK de recursos entregado por el módulo Wi-Fi tiene el nombre de paquete com.google.android.wifi.resources , debes configurar el targetPackage de APKS superpuesto en com.google.android.wifi.resources para superponer las configuraciones de Wi-Fi correctamente.

Migrar el formato de almacenamiento de configuración

El módulo Wi-Fi solo puede analizar el formato de almacenamiento de configuración Wi-Fi AOSP. Si modificó previamente el formato de almacenamiento de la configuración de Wi-Fi (que incluye la lista de redes guardadas del usuario), debe convertir esos datos al formato AOSP al actualizar un dispositivo a cualquier versión de Android que incluya el módulo Wi-Fi. Los enlaces necesarios para esta conversión se encuentran en la clase android.net.wifi.WifiMigration .

Implemente la conversión de formato con los siguientes métodos.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Invocado por el módulo Wi-Fi para recuperar el contenido del archivo de la tienda compartida Wi-Fi que se ha convertido al formato AOSP.

    • Estos archivos se almacenaban anteriormente (en Android 10) en la carpeta /data/misc/wifi del dispositivo.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Invocado por el módulo Wi-Fi para recuperar el contenido del archivo de tienda específico del usuario Wi-Fi que se ha convertido al formato AOSP.

    • Estos archivos se almacenaban anteriormente (en Android 10) en la carpeta /data/misc_ce/<userId>/wifi del dispositivo.

Acceder a API de Wi-Fi ocultas

Los símbolos (clases, métodos, campos, etc.) anotados con @hide en el módulo Wi-Fi no forman parte de su superficie API pública y no se puede acceder a ellos desde dispositivos con el módulo instalado. Los dispositivos que no incluyen el módulo Wi-Fi pueden continuar usando las API @hide Wi-Fi siguiendo los siguientes pasos.

  1. Elimine las restricciones de visibilidad impuestas a framework-wifi en packages/modules/Wifi/framework/Android.bp cambiando el atributo impl_library_visibility a público.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Cambie la regla de compilación para permitir el acceso a la biblioteca @hide Wi-Fi API. Por ejemplo, la siguiente es una regla de compilación para java_library .

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

    Para permitir el acceso a la biblioteca para foo-lib , cambie la regla de compilación como se muestra a continuación.

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Asegúrese de que framework-wifi.impl aparezca antes framework en la lista de libs . El orden de las dependencias en el atributo libs es significativo.

Acceder a las API del marco oculto

No se puede acceder a los símbolos anotados con @hide fuera del módulo Wi-Fi mediante código dentro del módulo Wi-Fi. Los dispositivos que no incluyen el módulo Wi-Fi pueden continuar usando las API externas @hide (por ejemplo, desde framework.jar ) en service-wifi realizando las siguientes modificaciones en frameworks/opt/net/wifi/service/Android.bp .

  1. Tanto en wifi-service-pre-jarjar como service-wifi , cambie el atributo sdk_version a core_platform .

  2. Tanto en wifi-service-pre-jarjar como service-wifi , agregue framework y android_system_server_stubs_current al atributo libs .

  3. Verifique que el resultado sea similar al siguiente código de ejemplo.

    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",
        ],
    }
    

Pruebas

El conjunto de pruebas de compatibilidad de Android (CTS) verifica la funcionalidad del módulo Wi-Fi ejecutando un conjunto completo de pruebas CTS en cada versión del módulo. También puede ejecutar las pruebas descritas en Pruebas, depuración y ajuste de Wi-Fi .