Wi-Fi

El módulo de Wi-Fi se puede actualizar, lo que significa que puede recibir actualizaciones de capacidades fuera del ciclo normal de lanzamientos de Android. Este módulo contiene los siguientes componentes.

Componentes del módulo Wi-Fi

Figura 1: Componentes y arquitectura del módulo Wi-Fi

El módulo Wi-Fi ofrece los siguientes beneficios:

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

  • Los desarrolladores de apps 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 las 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, aquí se almacena el manifiesto del APK de superposición)
      • res/ (nuevo en Android 11, configuraciones de Wi-Fi extraídas de frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (nuevo en Android 13: aquí se almacena la app para iniciar diálogos del usuario solicitados por el servicio).
      • src/
        • com/android/wifi/dialog (contiene la actividad desde la que se inician los diálogos)
      • 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)
  • App de ejemplo de superposición de recursos
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

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

Cómo mover un parche de frameworks/base/wifi

Cómo generar el archivo de parche en root/frameworks/base/wifi

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

Cómo aplicar el archivo de parche a root/packages/modules/Wifi

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

Mueve un parche de frameworks/opt/net/wifi

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

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

Cómo migrar la confirmación 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

Cómo generar 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

Cómo aplicar los dos parches a packages/modules/Wifi

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

Cómo reducir los dos commits a uno

git rebase -i

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

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

Límite del módulo para Android 11

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

  • Clases de SDK y 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 del 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 es posible que las versiones futuras sí lo hagan. Para reducir el esfuerzo que implica portar los cambios de ubicación de archivos, recomendamos enviar la mayor cantidad posible de cambios al AOSP (después de portarlos a Android 11 o refactorizar las extensiones propietarias para usar APIs formales de Android o extensiones de HAL del proveedor para separarlas del código del AOSP.

Formato del módulo

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

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

Dependencias de módulos

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

  • Conectividad
  • Telefonía
  • Bibliotecas de .proto
  • Componentes varios del sistema
  • HALs de Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Este módulo interactúa con el framework solo con @SystemApi estables (no se usa la API de @hide) y se firma con una firma de Google en lugar de una firma de plataforma.

Personalización

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

Personalización de Wi-Fi

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

  • Para personalizaciones pequeñas, habilita o inhabilita parámetros de configuración en el RRO config.
  • Para tener más control, personaliza los valores de configuración de cualquier clave de configuración de la empresa de transporte expuesta como @SystemAPI.

Usa superposiciones de recursos en tiempo de ejecución

Puedes personalizar el módulo Wi-Fi anulando las configuraciones predeterminadas con RRO. Para obtener una lista de las configuraciones que se pueden superponer, consulta packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. Para obtener detalles sobre el comportamiento de la configuración, consulta packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. Para ver una app de superposición de ejemplo, consulta device/google/coral/rro_overlays/WifiOverlay/.

Dado que el archivo device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml establece el atributo targetPackage en com.android.wifi.resources y el APK de recursos que entrega el módulo de Wi-Fi tiene el nombre de paquete com.google.android.wifi.resources, debes establecer el targetPackage de los APKs de superposición en com.google.android.wifi.resources para superponer correctamente la configuración de Wi-Fi.

Migra el formato de almacenamiento de la configuración

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

Implementa la conversión de formato en los siguientes métodos.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • El módulo de Wi-Fi invoca este método para recuperar el contenido del archivo de almacenamiento compartido de Wi-Fi que se convirtió al formato de AOSP.

    • Anteriormente (en Android 10), estos archivos se almacenaban en la carpeta /data/misc/wifi del dispositivo.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • El módulo de Wi-Fi lo invoca para recuperar el contenido del archivo de la tienda específico del usuario de Wi-Fi que se convirtió al formato de AOSP.

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

Accede a las APIs de Wi-Fi ocultas

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

  1. Quita las restricciones de visibilidad que se aplican 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. Cambia la regla de compilación para permitir el acceso a las APIs de Wi-Fi de la biblioteca @hide. Por ejemplo, la siguiente es una regla de compilación para un 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, cambia la regla de compilación de la siguiente manera:

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

Cómo acceder a las APIs ocultas del framework

El código dentro del módulo de Wi-Fi no puede acceder a los símbolos anotados con @hide fuera del módulo de Wi-Fi. Los dispositivos que no incluyen el módulo de Wi-Fi pueden seguir usando las APIs externas de @hide (por ejemplo, de framework.jar) en service-wifi si realizan las siguientes modificaciones en frameworks/opt/net/wifi/service/Android.bp.

  1. En wifi-service-pre-jarjar y service-wifi, cambia el atributo sdk_version a core_platform.

  2. En ambos wifi-service-pre-jarjar y service-wifi, agrega framework y android_system_server_stubs_current al atributo libs.

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

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

Prueba

El Conjunto de pruebas de compatibilidad (CTS) de Android verifica las capacidades del módulo Wi-Fi ejecutando un conjunto integral de pruebas de CTS en cada versión del módulo. También puedes ejecutar las pruebas que se describen en Prueba, depura y ajusta la conexión Wi-Fi.