Linux-stabile Zusammenstellungen

Jeden Tag werden eine erhebliche Anzahl von Änderungen am Upstream-Linux-Kernel vorgenommen. Diese Änderungen werden in der Regel nicht auf ihre Sicherheitsauswirkungen geprüft, aber viele von ihnen können sich auf die Sicherheit des Kernels auswirken. Die Auswirkungen jeder dieser Änderungen auf die Sicherheit zu bewerten, ist teuer und wahrscheinlich nicht realisierbar. Stattdessen ist es nachhaltiger und wartungsfreundlicher, Änderungen regelmäßig mit dem Upstream-Linux-Kernel zu synchronisieren.

Es wird empfohlen, Geräte regelmäßig mit neueren LTS-Kerneln (Long Term Support) zu aktualisieren. Regelmäßige LTS-Updates können dazu beitragen, potenzielle nicht erkannte Sicherheitslücken wie diesen Bericht von Project Zero aus dem Frühjahr 2019 vor der öffentlichen Offenlegung oder Entdeckung durch böswillige Akteure zu beheben.

Voraussetzungen

  • Android Common Kernel-Branch (von AOSP)
  • Ein LTS-Merge-Staging-Branch für den Kernel des Zielgeräts
  • Release-Zweig des Gerätekernels
  • Git-Repository
  • Toolchain für den Kernel-Build

Mit LTS-Änderungen zusammenführen

LTS-Änderungen zusammenführen
Abbildung 1: LTS-Änderungen zusammenführen

In den folgenden Schritten werden die typischen Schritte für die Zusammenführung von „Langzeitsupport“ beschrieben.

  • Ziel-Kernel-Release-Zweig wieder mit dem LTS-Staging-Zweig zusammenführen
  • Führen Sie "linux-stable" oder "Android Common" lokal mit dem Staging-Zweig "-LTS" zusammen.
  • Zusammenführungskonflikte lösen (bei Bedarf die Gebiets-/Codeinhaber konsultieren)
  • Erstellen Sie lokal und führen Sie Integritäts-/Einheitentests durch (siehe Testabschnitt unten).
  • Gemeinsame Android-Änderungen in den Staging-Zweig der LTS-Version hochladen und zusammenführen
  • Ausführliche Tests mit dem Staging-Branch „-LTS“ durchführen (siehe Abschnitt „Tests“ unten)
  • Testergebnisse prüfen
  • Beheben Sie alle Regressionen und führen Sie bei Bedarf einen Bisect-Merge durch.
  • -LTS-Staging-Zweig mit Haupt-Release-Zweig des Geräte-Kernels zusammenführen
  • Neuen Android-Build für Ihre Geräte erstellen, der den LTS-Kernel für die Staging-Umgebung enthält
  • Release-Build/ROM mit neuem Kernel kompilieren

Beispiel für die Zusammenführung mit der Version „Langzeitsupport“

Führe Android 4.9 über das LTS-Staging in die Hauptversion und den Bezahlvorgang für den LTS-Staging-Zweig zusammen:

repo init -b <Device kernel LTS staging branch>  # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch>         # back-merge
git commit

An dieser Stelle ist es am besten, den Back-Merge auf Ihr Remote-Quellverzeichnis zu übertragen, bevor Sie fortfahren. Danach führst du Android Common mit dem LTS-Staging zusammen.

git merge -X patience android-4.9-q            # LTS merge

Zusammenführungskonflikte lösen

In den meisten Fällen gibt es Konflikte zwischen dem Android Common Kernel und dem Staging-Zweig „-LTS“. Die Lösung von Zusammenführungskonflikten bei Zusammenführungen mit Langzeitsupport kann eine Herausforderung sein. Nachfolgend finden Sie einige hilfreiche Tipps dazu.

Inkrementelle Zusammenführung

Wenn seit der Aktualisierung des Gerätekernels mit LTS eine beträchtliche Zeit vergangen ist, ist die Wahrscheinlichkeit hoch, dass es seit der letzten Zusammenführungsaktualisierung viele (mehr als 50) stabile Releases gab. Am besten schließen Sie die Lücke langsam, indem Sie jeweils eine kleinere Anzahl von Releases zusammenführen (maximal fünf Minor-Versionen) und dabei jeden Schritt testen.

Wenn die Unterebene der Gerätekernelversion beispielsweise 4.14.100 und die stabile Upstream-Unterebene 4.14.155 ist, sollten Sie die Änderungen in kleinen Schritten zusammenführen, damit eine angemessene Anzahl von Änderungen angemessen geprüft und getestet werden kann.

Im Allgemeinen haben wir festgestellt, dass eine inkrementelle Arbeit in Batches von maximal fünf Minor-Releases pro Zusammenführung für eine überschaubarere Anzahl von Patches sorgt.

Testen

Schnellstarttest

Wenn Sie einen schnellen Boot-Test durchführen möchten, müssen Sie zuerst die LTS-Änderungen lokal zusammenführen und den Kernel erstellen. In den folgenden Schritten wird der Schnellstarttest beschrieben.

Verbinden Sie das Zielgerät über ein USB-Kabel mit Ihrem Computer und übertragen Sie „.ko“ mithilfe von Android Debug Bridge (ADB) an das Gerät.

adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)
adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader

Starten Sie dtbo und laden Sie das Kernel-Image per Sideload herunter.

fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)

Prüfen Sie das Protokoll /dev/kmsg auf Fehler.

adb shell
su
cat /dev/kmsg (inspect kernel log for obvious new errors)

Android-Tests

Erstellen Sie zuerst das -userdebug-Image lokal mit dem neuen LTS-Kernel und den neuen LTS-Modulen.

Prüfen Sie /dev/kmsg auf Fehler und vergewissern Sie sich, dass keine vorhanden sind, bevor Sie fortfahren. Testen Sie die folgenden Dinge, um sicherzustellen, dass alles wie erwartet funktioniert.

  • WLAN-Geschwindigkeit
  • Chrome-Browser
  • Bild- und Videoaufnahme mit der Kamera-App
  • YouTube-Videowiedergabe über integrierte Lautsprecher und Bluetooth-Headset
  • Anrufe über das Mobilfunknetz
  • Videoanruf über WLAN

Automatisierte Test-Suites

Die abschließende Überprüfung, ob das Produktbild nicht zurückgegangen ist, erfolgt mithilfe der Testsuiten, die über die Anbietertestsuite (VTS) verfügbar sind, und automatisierten Stabilitätsstresstests.