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. Componentes y arquitectura del módulo Wi-Fi

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

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

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

  • Los OEM pueden cumplir con los requisitos de los transportistas 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

  • 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 de APK superpuesto se almacena aquí)
      • res/ (nuevo en Android 11, configuraciones Wi-Fi extraídas de frameworks/base/core/res/res )
      • 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 usar los comandos de muestra para ayudar a mover sus parches desde 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 raíz/paquetes/módulos/Wifi

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

Mover un parche desde frameworks/opt/net/wifi

Para mover el parche de 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/ .

Migración de 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

Generación de 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

Aplastar las dos confirmaciones de nuevo en una confirmación

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 podrían hacerlo. Para reducir el esfuerzo involucrado en la migración de cambios de ubicación de archivos, recomendamos realizar la mayor cantidad posible de cambios en AOSP (después de transferirlos a Android 11 o refactorizar las extensiones propietarias para usar API de Android formales o extensiones HAL del proveedor para desenredarlos del código AOSP).

Formato del módulo

El módulo Wi-Fi ( com.google.android.wifi.apex ) 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
  • Bibliotecas de prototipos
  • Componentes misceláneos 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 de operador.

personalización wifi

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

  • Para pequeñas personalizaciones, active o desactive 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 .

Uso de superposiciones de recursos de 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 , debe establecer el paquete de destino de targetPackage de superposición en com.google.android.wifi.resources para superponer las configuraciones de Wi-Fi correctamente.

Migración del 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 modificó previamente el formato de almacenamiento de la configuración Wi-Fi (que incluye la lista de redes guardada del usuario), debe convertir esos datos al formato AOSP cuando actualice un dispositivo a cualquier versión de Android que incluya el módulo Wi-Fi. Los ganchos necesarios para esta conversión están en la clase android.net.wifi.WifiMigration .

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

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Invocado por el módulo de Wi-Fi para recuperar el contenido del archivo de la tienda compartida de 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 de Wi-Fi para recuperar el contenido del archivo de almacenamiento específico del usuario de Wi-Fi que se ha convertido al formato AOSP.

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

Acceder a las API 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 en 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 colocadas 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. 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 de framework en la lista de libs . El orden de las dependencias en el atributo libs es significativo.

Acceder a API de marco ocultas

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 seguir usando las API externas @hide (por ejemplo, de framework.jar ) en service-wifi al realizar 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 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",
        ],
    }
    

Pruebas

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