Kernel-Netzwerk-Unittests

Seit Android 5.0 erfordert der ordnungsgemäße Betrieb des Android-Netzwerk-Stacks auf Linux-Kerneln eine Reihe von Commits, die relativ neu upstreamed wurden oder noch nicht upstreamed wurden. Es ist nicht einfach, die erforderliche Kernelfunktionalität manuell zu überprüfen oder die fehlenden Commits zu verfolgen. Daher stellt das Android-Team die Tests zur Verfügung, die es verwendet, um sicherzustellen, dass sich der Kernel wie erwartet verhält.

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

Diese Tests gibt es aus drei Hauptgründen:

  1. Die genaue Version des Linux-Kernels, die auf einem Gerät verwendet wird, ist in der Regel gerätespezifisch. Es ist schwierig, ohne Ausführung der Tests festzustellen, ob ein Kernel richtig funktioniert.
  2. Durch das Forward-Porting und Back-Porting der Kernel-Patches auf verschiedene Kernel-Versionen oder verschiedene Gerätebäume können subtile Probleme entstehen, die ohne Ausführung der Tests nicht erkennbar sind.
  3. Für neue Netzwerkfunktionen sind möglicherweise neue Kernelfunktionen oder Kernel-Fehlerkorrekturen erforderlich.

Wenn die Tests nicht bestanden werden, verhält sich der Netzwerk-Stack des Geräts nicht korrekt, was zu für Nutzer sichtbaren Verbindungsfehlern führt, z. B. zum Trennen von WLAN-Netzwerken. Das Gerät wird wahrscheinlich auch die Tests der Android Compatibility Test Suite (CTS) 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 Datenträger-Image und führt die Tests über das Host-Dateisystem aus. Die Tests sind in Python geschrieben und verwenden TAP-Schnittstellen, um das Kernelverhalten und die Socket API zu testen.

Kompilieren Sie den Kernel für ARCH=um.

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

In vielen Fällen reicht es aus, dafür zu sorgen, dass hardwarespezifischer Code hinter einem #ifdef steht. Normalerweise sollte es sich dabei um ein #ifdef für eine Konfigurationsoption handeln, mit der die spezifische Funktion gesteuert wird, die für den Code relevant ist. Wenn es keine solche Konfigurationsoption gibt, fügen Sie hardwarespezifischen Code in #ifndef CONFIG_UML-Blöcke ein.

Im Allgemeinen sollte die Behebung dieses Problems in der Verantwortung des Kernelbaum-Anbieters liegen, z. B. des Chipset- oder SoC-Anbieters. Wir arbeiten mit OEMs und Anbietern zusammen, um sicherzustellen, dass aktuelle und zukünftige Kernel für ARCH=um SUBARCH=x86_64 kompiliert werden können, ohne dass Änderungen erforderlich sind.

Tests ausführen

Die Tests befinden sich unter kernel/tests/net/test. Es wird empfohlen, die Tests über AOSP-Main auszuführen, da sie am aktuellsten sind. In einigen Fällen sind für Kernel-Funktionen, die für den ordnungsgemäßen Betrieb in einer bestimmten Android-Version erforderlich sind, in der jeweiligen Version noch keine vollständigen Tests verfügbar. Informationen zum Ausführen der Tests finden Sie in der README-Datei für Kernel-Netzwerktests. Führen Sie im Grunde im Stammverzeichnis Ihres Kernel-Baums Folgendes aus:

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

Tests bestehen

Die Python-Quelldateien für den Kernel-Netzwerktest enthalten Kommentare, in denen Kernel-Commits angegeben sind, die zum Bestehen der Tests erforderlich sind. Die Tests sollten in den gemeinsamen Kernel-Trees – allen gemeinsamen Kernel-Branches android-4.4 und höher – im Projekt kernel/common in AOSP bestanden werden. Daher ist das Bestehen der Tests für einen Kernel einfach eine Frage des kontinuierlichen Mergens aus dem entsprechenden gemeinsamen Kernel-Branch.

Beiträge

Probleme melden

Melden Sie alle Probleme mit den Kernel-Netzwerktests im Android-Problemtracker 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 für die allgemeinen Kernel-Trees nicht bestanden.
  • Sie finden einen erforderlichen Commit, der in den Quellkommentaren nicht erwähnt wird.
  • Damit die Tests für Upstream-Kernel bestanden werden, sind größere Änderungen erforderlich.
  • Sie sind der Meinung, dass die Tests zu detailliert sind oder dass der Test bei zukünftigen Kernels fehlschlägt.
  • Sie möchten vorhandenen Tests weitere Tests oder eine höhere Abdeckung hinzufügen.