El módulo Wi-Fi se puede actualizar, lo que significa que puede recibir actualizaciones de funciones fuera del ciclo normal de lanzamientos de Android. Este módulo contiene los siguientes componentes.
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 corrige los problemas de interoperabilidad mediante 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 implementaciones diferentes de los mismos requisitos de diferentes maneras).
Límite de módulo para Android 12 y Android 13
packages/modules/Wifi
framework
java/
android/net/wifi
(archivos deframeworks/base/wifi/java
)
tests/
android/net/wifi
(archivos deframeworks/base/wifi/tests
)
aidl-export/
api/
Android.bp
service/
java/
com/android/server/wifi
(archivos deframeworks/opt/net/wifi/service/java
)
tests/
com/android/server/wifi
(archivos deframeworks/opt/net/wifi/tests
)
proto/
Android.bp
proguard.flags
wifi.rc
OsuLogin/
(archivos deframeworks/base/packages/OsuLogin
)ServiceResources/
(nuevo en Android 12, el manifiesto del APK superpuesto se almacena aquí)res/
(nuevo en Android 11; parámetros de configuración de Wi-Fi extraídos deframeworks/base/core/res/res
)AndroidManifest.xml
Android.bp
WifiDialog/
(nuevo en la app de Android 13 que permite iniciar diálogos del 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 del sistema modular y en su ubicación actual, por ejemplo:
wificond interface
(clases en el paqueteandroid.net.wifi.nl80211
, por ejemplo,WifiNl80211Manager
)- Ejemplo de app de superposición de recursos
WifiTrackerLib
libwifi_hal
libwifi_system
libwifi_system_iface
Los OEM pueden usar los comandos de muestra para mover los parches de los directorios del proyecto original al nuevo.
Traslada 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
Aplicación del archivo de parche a root/packages/modules/Wifi
git am -p2 --directory=framework/ patch-file.txt
Trasladar un parche de frameworks/opt/net/wifi
Para mover el parche de frameworks/opt/net/wifi
, se necesitan pasos complejos porque la jerarquía de directorios cambió durante la migración.
En frameworks/opt/net/wifi
, divide la confirmación en dos, 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
Aplicación de los dos parches a paquetes, módulos o Wi-Fi
git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt
Cómo combinar los dos commits en uno
git rebase -i
Cambia la operación del segundo commit a squash
.
Edita el mensaje de confirmación según corresponda.
Límite de módulo para Android 11
El servicio de Wi-Fi sigue ejecutándose dentro del proceso del servicio del sistema. El módulo Wi-Fi incluye todo el código en packages/modules/Wifi
, incluido el siguiente.
- SDK y clases de servicio para
WifiService
,WifiP2pService
,WifiAwareService
,WifiScannerService
yWifiRttService
OsuLogin
ServiceWifiResources
El módulo excluye los siguientes componentes, que siguen siendo parte de la compilación de AOSP del OEM.
- Componente nativo
wificond
ensystem/connectivity/wificond
- Interfaz
wificond
(clases en el paqueteandroid.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í. Para reducir el esfuerzo que implica portar 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 extensiones propietarias para usar APIs formales de Android o extensiones de HAL del proveedor para desenredarlos 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 del servicio (
service-wifi.jar
) - APK de OsuLogin (
OsuLoginGoogle.apk
) - APK de recursos (
ServiceWifiResourcesGoogle.apk
) - Certificados de WFA
Dependencias de módulos
El módulo Wi-Fi depende de los siguientes componentes.
- Conectividad
- Telefonía
- Bibliotecas proto
- Otros componentes del sistema
- HAL de Wi-Fi
wificond
bouncycastle
ksoap2
libnanohttpd
Este módulo interactúa con el framework solo con @SystemApi
estable (sin uso de la API de @hide
) y está firmado con una firma de Google en lugar de una firma de la plataforma.
Personalización
El módulo Wi-Fi no admite la personalización directa, pero puedes personalizar la configuración mediante superposiciones de recursos de tiempo de ejecución (RRO) o configuraciones de proveedores.
Figura 2: Personalización del módulo Wi-Fi
- Para realizar personalizaciones pequeñas, habilita o inhabilita la configuración en el
config
de RRO. - Para obtener más control, personaliza los valores de configuración de cualquier clave de configuración del proveedor expuesta como
@SystemAPI
.
Usa superposiciones de recursos en tiempo de ejecución
Puedes personalizar el módulo de Wi-Fi anulando la configuración predeterminada con RRO. Para obtener una lista de configuraciones superpuestas, consulta packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml
.
Para obtener detalles sobre el comportamiento de 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/
.
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 Wi-Fi tiene el nombre de paquete com.google.android.wifi.resources
, debes establecer el APK de superposición targetPackage
en com.google.android.wifi.resources
para superponer las configuraciones de Wi-Fi de forma correcta.
Migrar el formato de almacenamiento de la configuración
El módulo Wi-Fi solo puede analizar el formato de almacenamiento de configuración de Wi-Fi de AOSP. Si anteriormente modificaste el formato de almacenamiento de configuración de Wi-Fi (que incluye la lista de redes guardada del usuario), debes convertir esos datos al formato AOSP cuando actualices un dispositivo a cualquier versión de Android que incluya el módulo Wi-Fi. Los hooks necesarios para esta conversión están en la clase android.net.wifi.WifiMigration
.
Implementa la conversión de formato en los siguientes métodos.
WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)
El módulo Wi-Fi lo invoca para recuperar el contenido del archivo de la tienda compartida de Wi-Fi que se convirtió al formato AOSP.
Anteriormente (en Android 10), estos archivos se almacenaban en la carpeta
/data/misc/wifi
del dispositivo.
WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)
El módulo Wi-Fi lo invoca para recuperar el contenido del archivo de tienda específico del usuario de Wi-Fi que se convirtió al formato AOSP.
Anteriormente, estos archivos (en Android 10) 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) que están anotados con @hide
en el módulo Wi-Fi no forman parte de su plataforma 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 Wi-Fi pueden seguir usando las APIs de Wi-Fi de @hide
siguiendo estos pasos.
Para quitar las restricciones de visibilidad que se aplicaron a
framework-wifi
enpackages/modules/Wifi/framework/Android.bp
, cambia el atributoimpl_library_visibility
a público.java_sdk_library { name: "framework-wifi", ... impl_library_visibility: [ "//visibility:public", // Add this rule and remove others. ], ... }
Cambia la regla de compilación para permitir el acceso de la biblioteca a las APIs de Wi-Fi
@hide
. Por ejemplo, la siguiente es una regla de compilación para unjava_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", ], }
Asegúrate de que
framework-wifi.impl
aparezca antes deframework
en la lista delibs
. El orden de las dependencias en el atributolibs
es significativo.
Accede a las APIs del framework ocultas
El código dentro del módulo Wi-Fi no puede acceder a los símbolos con anotaciones @hide
fuera del módulo Wi-Fi. Los dispositivos que no incluyen el módulo Wi-Fi pueden seguir usando las APIs externas de @hide
(por ejemplo, desde framework.jar
) en service-wifi
si realizan las siguientes modificaciones en frameworks/opt/net/wifi/service/Android.bp
.
En ambos
wifi-service-pre-jarjar
yservice-wifi
, cambia el atributosdk_version
acore_platform
.En ambos,
wifi-service-pre-jarjar
yservice-wifi
, agregaframework
yandroid_system_server_stubs_current
al atributolibs
.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 mediante la ejecución de un conjunto completo de pruebas de CTS en cada versión del módulo. También puedes ejecutar las pruebas que se describen en Cómo probar, depurar y ajustar Wi-Fi.