Начиная с Android 5.0, для корректной работы сетевого стека Android на ядрах Linux требуется ряд изменений, которые были внесены в основную ветку относительно недавно или еще не попали туда. Проверить вручную необходимую функциональность ядра или отследить отсутствующие изменения непросто, поэтому команда Android делится используемыми тестами, чтобы убедиться, что ядро работает должным образом.
Причины для проведения тестов
Эти тесты существуют по трем основным причинам:
- Точная версия ядра Linux, используемого на устройстве, обычно зависит от конкретного устройства, и сложно определить, работает ли какое-либо ядро должным образом без проведения тестов.
- Перенос и перенос патчей ядра на разные версии ядра или разные деревья устройств может привести к появлению скрытых проблем, которые невозможно обнаружить без проведения тестов.
- Для внедрения новых сетевых функций может потребоваться обновление функциональности ядра или исправление ошибок в ядре.
Если тесты не пройдут, сетевой стек устройства будет работать некорректно, вызывая видимые пользователю ошибки подключения (например, отключение от сетей Wi-Fi). Устройство, скорее всего, также не пройдет тесты Android Compatibility Test Suite (CTS).
Используйте тесты
В тестах используется пользовательский режим Linux для загрузки ядра в качестве процесса на хост-машине Linux. См. раздел «Создание среды сборки» для получения информации о подходящих версиях операционных систем. Фреймворк модульного тестирования загружает ядро с соответствующим образом диска и запускает тесты из файловой системы хоста. Тесты написаны на Python и используют интерфейсы TAP для проверки поведения ядра и API сокетов.
Скомпилируйте ядро для ARCH=um
Для запуска тестов ядро должно быть скомпилировано для ARCH=um SUBARCH=x86_64 . Это поддерживаемая архитектура как в исходном коде, так и в стандартных репозиториях ядра Android (например, android-4.4 ). Однако иногда ядра устройств не компилируются в этом режиме, поскольку в стандартных репозиториях устройств содержится код, специфичный для устройства или оборудования, в общих файлах (например, sys/exit.c ).
Во многих случаях достаточно убедиться, что код, специфичный для оборудования, находится за директивой #ifdef . Как правило, это должна быть директива #ifdef для параметра конфигурации, управляющего конкретной функцией, относящейся к коду. Если такого параметра конфигурации нет, поместите код, специфичный для оборудования, в блоки #ifndef CONFIG_UML .
В целом, исправление этой проблемы должно быть обязанностью поставщика дерева ядра (например, производителя чипсета или SoC). Мы работаем с OEM-производителями и поставщиками, чтобы гарантировать, что текущие и будущие ядра будут компилироваться для ARCH=um SUBARCH=x86_64 без необходимости каких-либо изменений.
Запустите тесты
Тесты находятся в папке kernel/tests/net/test . Рекомендуется запускать тесты из основной директории AOSP, поскольку она содержит самые актуальные версии; в некоторых случаях функции ядра, необходимые для корректной работы в конкретной версии Android, еще не имеют полного тестового покрытия в данной версии. Информацию о том, как запустить тесты, см. в файле README для сетевых тестов ядра . В основном, из корневой директории ядра выполните:
ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh
Сдайте тесты
Исходные файлы Python для тестирования сети ядра содержат комментарии, указывающие на необходимые для прохождения тестов коммиты ядра. Тесты должны проходить в общих ветках ядра — всех общих ветках ядра android-4.4 и выше — в проекте kernel/common в AOSP. Таким образом, прохождение тестов в ядре сводится к непрерывному слиянию изменений из соответствующей общей ветки ядра.
Взносы
Сообщить о проблемах
О любых проблемах с сетевыми тестами ядра сообщайте в систему отслеживания ошибок Android с меткой Component-Networking .
Документирование коммитов и добавление тестов.
Сообщайте о проблемах, как описано выше, и, если возможно, загрузите изменения для их исправления, если:
- Тесты не проходят на общих деревьях ядра.
- Вы обнаруживаете необходимый коммит, который не упомянут в комментариях к исходному коду.
- Для того чтобы тесты проходили в ядрах, принадлежащих разработчикам, требуются серьёзные изменения.
- Вы считаете, что тесты слишком детализированы, или что тесты не будут работать в будущих версиях ядра.
- Вы хотели бы добавить больше тестов или расширить покрытие кода к существующим тестам.