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 de Wi-Fi

El módulo de Wi-Fi proporciona los siguientes beneficios:

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

  • Los desarrolladores de apps obtienen una fragmentación de la plataforma reducida.

  • Los OEMs 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/ (novedad en Android 12, el manifiesto de APK de superposición se almacena aquí)
      • res/ (novedad en Android 11, las configuraciones de Wi-Fi se extrajeron de frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (novedad en Android 13, la app 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 diálogos)
      • AndroidManifest.xml
      • Android.bp

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

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

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

Mueve un parche de frameworks/base/wifi

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

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

Aplica 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 porque se cambió la jerarquía de directorios durante la migración.

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

Migra 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

Genera 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

Aplica los dos parches a packages/modules/Wifi

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

Combina las dos confirmaciones en una

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 continúa 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 formando parte de la compilación de 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 lo hagan. Para reducir el esfuerzo que implica la portabilidad de cambios de ubicación de archivos, te recomendamos que envíes tantos cambios como sea posible a AOSP (después de portarlos a Android 11 o refactorizar las extensiones propietarias para usar las APIs formales de Android o las extensiones HAL del proveedor para separarlas del código de 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 del módulo

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

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

Este módulo interactúa con el framework usando solo @SystemApi estable (sin uso de 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 en tiempo de ejecución (RROs) o configuraciones del operador.

Personalización de Wi-Fi

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

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

Usa superposiciones de recursos en tiempo de ejecución

Puedes personalizar el módulo de Wi-Fi anulando las configuraciones predeterminadas con RROs. Para obtener una lista de configuraciones superponibles, 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 obtener una app de superposición de muestra, consulta device/google/coral/rro_overlays/WifiOverlay/.

Debido a 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 APKS de superposición en com.google.android.wifi.resources para superponer las configuraciones de Wi-Fi correctamente.

Migra el formato de almacenamiento de configuración

El módulo de Wi-Fi solo puede analizar el formato de almacenamiento de configuración de Wi-Fi de AOSP. Si modificaste anteriormente el formato de almacenamiento de configuración de Wi-Fi (que incluye la lista de redes guardadas del usuario), debes convertir esos datos al formato 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 lo invoca para recuperar el contenido del archivo de almacenamiento compartido de Wi-Fi que se convirtió al formato AOSP.

    • Estos archivos se almacenaban anteriormente (en Android 10) 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 almacenamiento específico del usuario de Wi-Fi que se convirtió al formato AOSP.

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

Accede a las APIs de Wi-Fi ocultas

Los símbolos (clases, métodos, campos, etc.) 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 Wi-Fi @hide con los siguientes pasos.

  1. Quita las restricciones de visibilidad que se colocaron en 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 @hide de la biblioteca. Por ejemplo, la siguiente es una regla de compilación para una 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.

Accede a las APIs de framework ocultas

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 @hide (por ejemplo, de framework.jar) en service-wifi si realizan las siguientes modificaciones en frameworks/opt/net/wifi/service/Android.bp.

  1. En ambos 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 a la siguiente muestra 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 de Wi-Fi ejecutando un conjunto completo de pruebas de CTS en cada lanzamiento del módulo. También puedes ejecutar las pruebas que se describen en Prueba, depuración y ajuste de Wi-Fi.