Начиная с 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 .
Документирование коммитов и добавление тестов
Сообщите о проблемах, как описано выше, и, если возможно, загрузите изменение для устранения проблемы, если:
- Тесты не проходят на общих деревьях ядра.
- Вы находите необходимый коммит, который не упомянут в исходных комментариях,
- Для успешного прохождения тестов на ядрах верхнего уровня требуются серьезные изменения
- Вы считаете, что тесты слишком специфичны или тест не пройдёт на будущих ядрах
- Вы хотели бы добавить больше тестов или расширить охват существующих тестов.