Kernel-Networking-Unit-Tests

Seit Android 5.0 erfordert der ordnungsgemäße Betrieb des Android-Netzwerkstapels auf Linux-Kerneln eine Reihe von Commits, die vor relativ kurzer Zeit hochgeladen wurden oder noch nicht in den Upstream aufgenommen wurden. Es ist nicht einfach, die erforderliche Kernel-Funktionalität manuell zu überprüfen oder die fehlenden Commits nachzuverfolgen, daher teilt das Android-Team die Tests, die es verwendet, um sicherzustellen, dass sich der Kernel wie erwartet verhält.

Warum die Tests durchführen?

Diese Tests gibt es aus drei Hauptgründen:

  1. Die genaue Version des Linux-Kernels, die auf einem Gerät verwendet wird, ist normalerweise gerätespezifisch, und es ist schwierig zu wissen, ob ein Kernel ordnungsgemäß funktioniert, ohne die Tests auszuführen.
  2. Die Vorwärts- und Rückportierung der Kernel-Patches auf verschiedene Kernel-Versionen oder unterschiedliche Gerätebäume kann zu subtilen Problemen führen, die ohne die Durchführung der Tests möglicherweise nicht erkannt werden können.
  3. Neue Netzwerkfunktionen erfordern möglicherweise neue Kernel-Funktionen oder Kernel-Fehlerbehebungen.

Wenn die Tests nicht bestanden werden, verhält sich der Netzwerkstapel des Geräts falsch, was zu für den Benutzer sichtbaren Verbindungsfehlern führt (z. B. zum Ausfall von Wi-Fi-Netzwerken). Das Gerät wird wahrscheinlich auch die CTS-Tests (Android Compatibility Test Suite) nicht bestehen.

Verwendung der Tests

Die Tests verwenden Linux im Benutzermodus, um den Kernel als Prozess auf einem Linux-Hostcomputer zu starten. Geeignete Betriebssystemversionen finden Sie unter Einrichten einer Build-Umgebung . Das Unit-Test-Framework startet den Kernel mit einem geeigneten Disk-Image und führt die Tests vom Host-Dateisystem aus. Die Tests sind in Python geschrieben und nutzen TAP-Schnittstellen, um das Kernel-Verhalten und die Socket-API zu testen.

Kompilieren des Kernels für ARCH=um

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

In vielen Fällen reicht es aus, sicherzustellen, dass sich hinter einem #ifdef hardwarespezifischer Code befindet. Normalerweise sollte dies ein #ifdef für eine Konfigurationsoption sein, die die spezifische Funktion steuert, 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 Kernel-Baum-Anbieters (z. B. des Chipsatz- oder SoC-Anbieters) liegen. 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.

Ausführen der Tests

Die Tests finden Sie unter kernel/tests/net/test . Es wird empfohlen, die Tests vom AOSP-Hauptserver aus auszuführen, da sie am aktuellsten sind. In einigen Fällen verfügen Kernelfunktionen, die für den ordnungsgemäßen Betrieb in einer bestimmten Android-Version erforderlich sind, in der jeweiligen Version noch nicht über eine vollständige Testabdeckung. Informationen zum Ausführen der Tests finden Sie in der README-Datei zum Kernel-Netzwerktest . Führen Sie im Grunde von oben in Ihrem Kernelbaum Folgendes aus:

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

Bestehen der Prüfungen

Die Python-Quelldateien für Kernel-Netzwerktests enthalten Kommentare, die Kernel-Commits angeben, die bekanntermaßen zum Bestehen der Tests erforderlich sind. Die Tests sollten in den Common-Kernel-Bäumen – allen Common-Kernel-Zweigen android-4.4 und höher – im kernel/common Projekt in AOSP bestanden werden. Daher ist das Bestehen der Tests an einem Kernel lediglich eine Frage der kontinuierlichen Zusammenführung aus dem entsprechenden gemeinsamen Kernelzweig.

Mitwirken

Probleme melden

Bitte melden Sie alle Probleme mit den Kernel-Netzwerktests im Android Issue Tracker mit der Bezeichnung Component-Networking .

Commits dokumentieren und Tests hinzufügen

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

  • Die Tests geben die gängigen Kernelbäume nicht weiter
  • Sie finden einen notwendigen Commit, der in den Quellkommentaren nicht erwähnt wird,
  • Um die Tests an Upstream-Kernel weitergeben zu können, sind große Änderungen erforderlich
  • Sie glauben, dass die Tests überspezifiziert sind oder dass der Test auf zukünftigen Kerneln fehlschlägt
  • Sie möchten weitere Tests oder mehr Abdeckung zu bestehenden Tests hinzufügen.