A partir de Android 5.0, el funcionamiento correcto de la pila de redes de Android en los kernels de Linux requiere una serie de confirmaciones que se enviaron a la fuente hace poco o que aún no se enviaron. No es fácil verificar manualmente la funcionalidad requerida del kernel ni hacer un seguimiento de los confirmaciones faltantes, por lo que el equipo de Android comparte las pruebas que usa para garantizar que el kernel se comporte como se espera.
Motivos para ejecutar las pruebas
Estas pruebas existen por tres razones principales:
- Por lo general, la versión exacta del kernel de Linux que se usa en un dispositivo es específica del dispositivo, y es difícil saber si un kernel funciona correctamente sin ejecutar las pruebas.
- La portabilidad hacia adelante y hacia atrás de los parches del kernel a diferentes versiones del kernel o a diferentes árboles de dispositivos puede generar problemas sutiles que pueden ser imposibles de detectar sin ejecutar las pruebas.
- Es posible que las nuevas funciones de red requieran nuevas funciones del kernel o correcciones de errores del kernel.
Si las pruebas no se aprueban, la pila de red del dispositivo se comporta de forma incorrecta, lo que genera errores de conectividad visibles para el usuario (como la desconexión de redes Wi-Fi). Es probable que el dispositivo también falle en las pruebas del conjunto de pruebas de compatibilidad (CTS) de Android.
Usa las pruebas
Las pruebas usan Linux en modo de usuario para iniciar el kernel como un proceso en una máquina host de Linux. Consulta Cómo establecer un entorno de compilación para ver las versiones adecuadas del sistema operativo. El framework de pruebas de unidades inicia el kernel con una imagen de disco adecuada y ejecuta las pruebas desde el sistema de archivos del host. Las pruebas están escritas en Python y usan interfaces TAP para probar el comportamiento del kernel y la API de socket.
Compila el kernel para ARCH=um
Para que se ejecuten las pruebas, el kernel debe compilarse para ARCH=um SUBARCH=x86_64
. Esta es una arquitectura compatible tanto upstream como en los árboles de kernel de Android comunes (como android-4.4
). Sin embargo, a veces, los kernels del dispositivo no se compilan en este modo porque los árboles de dispositivos contienen código específico del dispositivo o del hardware en archivos comunes (por ejemplo, sys/exit.c
).
En muchos casos, es suficiente con garantizar que el código específico del hardware esté detrás de un #ifdef
. Por lo general, debe ser un #ifdef
en una opción de configuración que controle la función específica relevante para el código. Si no hay una opción de configuración de este tipo, coloca el código específico del hardware dentro de los bloques #ifndef CONFIG_UML
.
En general, la responsabilidad de corregir este problema es del proveedor del árbol de kernel (como el proveedor del chipset o SoC). Estamos trabajando con OEMs y proveedores para garantizar que los kernels actuales y futuros se compilen para ARCH=um
SUBARCH=x86_64
sin necesidad de realizar ningún cambio.
Ejecuta las pruebas
Las pruebas se encuentran en kernel/tests/net/test
.
Se recomienda que las pruebas se ejecuten desde AOSP principal porque son las más actualizadas. En algunos casos, las funciones del kernel que son necesarias para el funcionamiento correcto en una versión determinada de Android aún no tienen una cobertura de prueba completa en esa versión. Para obtener información sobre cómo ejecutar las pruebas, consulta el archivo README de la prueba de red del kernel. Básicamente, desde la parte superior del árbol del kernel, ejecuta lo siguiente:
ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh
Aprobar las pruebas
Los archivos fuente de Python de la prueba de red del kernel contienen comentarios que especifican las confirmaciones del kernel que se sabe que son necesarias para aprobar las pruebas. Las pruebas deben aprobarse en los árboles de kernel comunes (todas las ramas de kernel comunes android-4.4
y superiores) en el proyecto kernel/common
de AOSP. Por lo tanto, aprobar las pruebas en un kernel es simplemente una cuestión de realizar una combinación continua desde la rama de kernel común correspondiente.
Contribuciones
Informar problemas
Informa cualquier problema con las pruebas de red del kernel en el registro de problemas de Android con la etiqueta Component-Networking.
Documenta las confirmaciones y agrega pruebas
Informa los problemas como se describió anteriormente y, si es posible, sube un cambio para solucionarlos en los siguientes casos:
- Las pruebas no se pasan en los árboles de kernel comunes.
- Encontraste una confirmación necesaria que no se menciona en los comentarios de la fuente.
- Para que las pruebas se aprueben en los kernels upstream, se requieren cambios importantes.
- Crees que las pruebas están sobreespecificadas o que fallan en kernels futuros.
- Quieres agregar más pruebas o más cobertura a las pruebas existentes.