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