Kernel-Netzwerk-Unittests

Seit Android 5.0 sind für den ordnungsgemäßen Betrieb des Android-Netzwerkstacks auf Linux-Kerneln eine Reihe von Commits erforderlich, die relativ vor Kurzem in den Upstream übernommen wurden oder noch nicht in den Upstream übernommen wurden. Es ist nicht einfach, die erforderlichen Kernelfunktionen manuell zu überprüfen oder die fehlenden Commits zu verfolgen. Deshalb stellt das Android-Team die Tests zur Verfügung, mit denen es dafür sorgt, dass der Kernel wie erwartet funktioniert.

Gründe für die Durchführung der Tests

Für diese Tests gibt es drei Hauptgründe:

  1. Die genaue Version des Linux-Kernels, die auf einem Gerät verwendet wird, ist in der Regel gerätespezifisch. Ohne Tests ist es schwierig zu erkennen, ob ein Kernel ordnungsgemäß funktioniert.
  2. Das Vorwärts- und Rückwärts-Portieren der Kernel-Patches auf verschiedene Kernelversionen oder verschiedene Gerätebäume kann zu subtilen Problemen führen, die ohne Tests nicht erkannt werden können.
  3. Neue Netzwerkfunktionen erfordern möglicherweise neue Kernelfunktionen oder Fehlerkorrekturen für den Kernel.

Wenn die Tests nicht bestanden werden, verhält sich der Netzwerkstack des Geräts falsch und es kommt zu für Nutzer sichtbaren Verbindungsfehlern, z. B. zu Verbindungsabbrüchen bei WLANs. Das Gerät wird wahrscheinlich auch die CTS-Tests (Compatibility Test Suite) von Android nicht bestehen.

Tests verwenden

Bei den Tests wird User-Mode Linux verwendet, um den Kernel als Prozess auf einem Linux-Hostcomputer zu starten. Informationen zu geeigneten Betriebssystemversionen finden Sie unter Build-Umgebung einrichten. Das Unit-Test-Framework startet den Kernel mit einem geeigneten Laufwerk-Image und führt die Tests über das Hostdateisystem aus. Die Tests sind in Python geschrieben und verwenden TAP-Schnittstellen, um das Kernel-Verhalten und die Socket-API zu testen.

Kernel für ARCH=um kompilieren

Damit die Tests ausgeführt werden können, muss der Kernel für ARCH=um SUBARCH=x86_64 kompiliert werden. Diese Architektur wird sowohl im Upstream-Bereich als auch in den gemeinsamen Android-Kernel-Trees (z. B. android-4.4) unterstützt. Manchmal werden Gerätekerne jedoch nicht in diesem Modus kompiliert, da Gerätebäume geräte- oder hardwarespezifischen Code in gemeinsamen Dateien enthalten (z. B. sys/exit.c).

In vielen Fällen reicht es aus, dafür zu sorgen, dass sich hardwarespezifischer Code hinter einer #ifdef befindet. Normalerweise sollte dies ein #ifdef in einer Konfigurationsoption sein, die die für den Code relevante Funktion steuert. Wenn es keine solche Konfigurationsoption gibt, fügen Sie den hardwarespezifischen Code in #ifndef CONFIG_UML-Blöcke ein.

Im Allgemeinen sollte die Behebung dieser Probleme dem Anbieter des Kernel-Baums (z. B. dem Chipsatz- oder SoC-Anbieter) obliegen. Wir arbeiten mit OEMs und Anbietern zusammen, damit aktuelle und zukünftige Kernel ohne Änderungen für ARCH=um SUBARCH=x86_64 kompiliert werden können.

Tests ausführen

Die Tests finden unter kernel/tests/net/test statt. Es wird empfohlen, die Tests über AOSP main auszuführen, da sie am aktuellsten sind. In einigen Fällen sind Kernelfunktionen, die für den ordnungsgemäßen Betrieb in einer bestimmten Android-Version erforderlich sind, in der jeweiligen Version noch nicht vollständig abgedeckt. Informationen zum Ausführen der Tests finden Sie in der README-Datei des Kernel-Netzwerktests. Führen Sie dazu am Anfang des Kernel-Baums Folgendes aus:

ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh

Die Tests bestehen

Die Python-Quelldateien für den Kernel-Netzwerktest enthalten Kommentare, in denen Kernel-Commits angegeben sind, die für das Bestehen der Tests erforderlich sind. Die Tests sollten in den gemeinsamen Kernel-Trees – allen gemeinsamen Kernel-Branches ab android-4.4 – im Projekt kernel/common in AOSP bestehen. Daher besteht das Bestehen der Tests für einen Kernel einfach darin, kontinuierlich aus dem entsprechenden gemeinsamen Kernel-Branch zusammenzuführen.

Beiträge

Probleme melden

Melden Sie alle Probleme mit den Kernel-Netzwerktests im Android-Issue-Tracker mit dem Label Component-Networking.

Commits dokumentieren und Tests hinzufügen

Melden Sie Probleme wie oben beschrieben und laden Sie nach Möglichkeit eine Änderung hoch, um das Problem zu beheben, wenn:

  • Die Tests werden in den gemeinsamen Kernel-Bäumen nicht bestanden.
  • Sie finden einen erforderlichen Commit, der in den Quellkommentaren nicht erwähnt wird.
  • Um die Tests für Upstream-Kernels zu bestehen, sind umfangreiche Änderungen erforderlich
  • Sie sind der Meinung, dass die Tests zu spezifisch sind oder dass der Test bei zukünftigen Kerneln fehlschlägt.
  • Sie möchten vorhandenen Tests weitere Tests oder eine größere Abdeckung hinzufügen.