Desde Android 5.0, el funcionamiento adecuado de la pila de redes de Android en los kernels de Linux requiere una serie de confirmaciones que se enviaron recientemente o que aún no se enviaron. No es fácil verificar manualmente la funcionalidad del kernel requerida ni hacer un seguimiento de las 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 motivos 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 algún kernel funciona correctamente sin ejecutar las pruebas.
- El reenvío y el retroceso de los parches del kernel a diferentes versiones del kernel o a diferentes árboles de dispositivos pueden introducir problemas sutiles que pueden ser imposibles de detectar sin ejecutar las pruebas.
- Es posible que las nuevas funciones de redes requieran una nueva funcionalidad 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 provoca errores de conectividad visibles para el usuario (como la desconexión de redes Wi-Fi). Es probable que el dispositivo tampoco apruebe 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 anfitrión de Linux. Consulta Cómo establecer un entorno de compilación para obtener información sobre 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 host. Las pruebas se escriben en Python y usan interfaces TAP para ejercer 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 en sentido ascendente como en los árboles de kernel comunes de Android (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 asegurarse de 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 pertinente al código. Si no existe esa opción de configuración, coloca el código específico del hardware dentro de los bloques #ifndef CONFIG_UML.
En general, la corrección de este problema debe ser responsabilidad del proveedor del árbol del kernel (como el proveedor del chipset o del SoC). Trabajamos con OEMs y proveedores para garantizar
que los kernels actuales y futuros se compilen para ARCH=um
SUBARCH=x86_64 sin requerir ningún cambio.
Ejecuta las pruebas
Las pruebas se encuentran en kernel/tests/net/test.
Se recomienda que las pruebas se ejecuten desde la rama principal de AOSP porque son las más actualizadas. En algunos casos, las funciones del kernel que son necesarias para el funcionamiento adecuado 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 versiones posteriores) en el
kernel/common
proyecto de AOSP. Por lo tanto, aprobar las pruebas en un kernel es simplemente una cuestión de combinar continuamente 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 errores de Android con la etiqueta Component-Networking.
Documentar confirmaciones y agregar pruebas
Informa los problemas como se describió anteriormente y, si es posible, sube un cambio para corregir el problema en los siguientes casos:
- Las pruebas no se aprueban en los árboles de kernel comunes.
- Encuentras una confirmación necesaria que no se menciona en los comentarios de la fuente.
- Para que las pruebas se aprueben en los kernels ascendentes, se requieren cambios importantes.
- Crees que las pruebas están demasiado especificadas o que fallarán en kernels futuros.
- Te gustaría agregar más pruebas o más cobertura a las pruebas existentes.