Linux-stabile Merges

Jeden Tag werden zahlreiche Änderungen am Upstream-Linux-Kernel vorgenommen. Diese Änderungen werden im Allgemeinen nicht auf Auswirkungen auf die Sicherheit untersucht, viele von ihnen können sich jedoch möglicherweise auf die Sicherheit des Kernels auswirken. Die Bewertung jeder dieser Änderungen hinsichtlich ihrer Auswirkungen auf die Sicherheit ist ein kostspieliger und wahrscheinlich nicht durchführbarer Vorgang. Ein nachhaltigerer und wartbarerer Ansatz besteht stattdessen darin, Änderungen regelmäßig mit dem Upstream-Linux-Kernel zu synchronisieren.

Es wird empfohlen, Geräte regelmäßig mit neueren Long Term Supported (LTS)-Kerneln zu aktualisieren. Regelmäßige LTS-Updates können dazu beitragen, potenzielle unerkannte Sicherheitslücken zu schließen, wie beispielsweise diesen Project Zero-Bericht von Anfang 2019, bevor sie öffentlich bekannt gegeben oder von böswilligen Akteuren entdeckt werden.

Voraussetzungen

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

Zusammenführung mit LTS-Änderungen

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

Die folgenden Schritte beschreiben die typischen Schritte für eine LTS-Zusammenführung.

  • Führen Sie den Release-Zweig des Zielkernels wieder mit dem Staging-Zweig -LTS zusammen
  • Führen Sie linux-stable oder Android common lokal in den Staging-Zweig -LTS ein
  • Zusammenführungskonflikte lösen (bei Bedarf Bereichs-/Codeeigentümer konsultieren)
  • Lokal erstellen und Sanity-/Unit-Tests durchführen (siehe Testabschnitt unten)
  • Laden Sie allgemeine Android-Änderungen in den LTS-Staging-Zweig hoch und führen Sie sie zusammen
  • Testen Sie gründlich mit dem -LTS-Staging-Zweig (siehe Testabschnitt unten).
  • Überprüfen Sie die Testergebnisse
  • Behandeln Sie alle Regressionen und halbieren Sie die Zusammenführung nach Bedarf
  • Führen Sie den -LTS-Staging-Zweig in den Kernel-Release-Zweig des Hauptgeräts ein
  • Erstellen Sie einen neuen Android-Build für Ihre Geräte, der den Staging-LTS-Kernel enthält
  • Kompilieren Sie den Release-Build/ROM mit dem neuen Kernel

Beispiel für die Fusion mit LTS.

Führen Sie Android-4.9 in den Hauptzweig (über LTS-Staging) und den Checkout- und Synchronisierungs-LTS-Staging-Zweig ein:

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 diesem Punkt ist es am besten, die Rückzusammenführung auf die Quellfernbedienung zu übertragen, bevor Sie fortfahren. Anschließend führen Sie Android Common in das LTS-Staging ein.

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

Zusammenführungskonflikte lösen

In den meisten Fällen kommt es zu Konflikten zwischen dem gemeinsamen Android-Kernel und dem -LTS-Staging-Zweig. Das Lösen von Zusammenführungskonflikten während LTS-Zusammenführungen kann eine Herausforderung sein. Nachfolgend finden Sie einige hilfreiche Tipps zu deren Behebung.

Inkrementelles Zusammenführen

Wenn seit der Aktualisierung eines Gerätekernels mit LTS viel Zeit vergangen ist, besteht eine gute Chance, dass es seit der Veröffentlichung des letzten zusammengeführten Updates viele (>50) stabile Versionen gegeben hat. Der beste Weg, dieses Problem anzugehen, besteht darin, langsam aufzuholen, indem eine kleinere Anzahl von Versionen gleichzeitig (<= 5 Nebenversionen) zusammengeführt und bei jedem Schritt des Weges getestet wird.

Wenn beispielsweise die Unterebene der Gerätekernelversion 4.14.100 und die stabile Upstream-Unterebene 4.14.155 ist, ist es am besten, sie in kleinen Schritten zusammenzuführen, um sicherzustellen, dass eine angemessene Menge an Änderungen angemessen überprüft und getestet werden kann.

Im Allgemeinen haben wir festgestellt, dass die schrittweise Arbeit in Stapeln von <= 5 Nebenversionen pro Zusammenführung eine besser verwaltbare Menge an Patches gewährleistet.

Testen

Schneller Boottest

Um einen Schnellstarttest durchzuführen, müssen Sie zunächst LTS-Änderungen lokal zusammenführen und den Kernel erstellen.
Die folgenden Schritte erläutern den Schnellstarttestvorgang.

Verbinden Sie das Zielgerät über ein USB-Kabel mit Ihrem Computer und übertragen Sie .ko mithilfe der Android Debug Bridge (ADB) auf 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 von der Seite.

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

Überprüfen Sie das /dev/kmsg-Protokoll auf Fehler.

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

Android-Tests

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

Überprüfen Sie /dev/kmsg auf Fehler und stellen Sie sicher, dass keine vorhanden sind, bevor Sie fortfahren. Testen Sie die folgenden Dinge, um sicherzustellen, dass sich alles wie erwartet verhält.

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

Automatisierte Testsuiten

Die abschließende Überprüfung, um sicherzustellen, dass sich das Produktbild nicht verschlechtert, erfolgt mithilfe der Testsuiten, die über die Vendor Test Suite (VTS) verfügbar sind, und automatisierten Stabilitätsstresstests.