Mit dem Tool ota_from_target_files
in build/make/tools/releasetools
können Sie vollständige und inkrementelle OTA-Pakete für Geräte erstellen, die A/B-Systemupdates oder Nicht-A/B-Systemupdates verwenden. Das Tool verwendet die vom Android-Build-System erstellte Datei target-files.zip
als Eingabe.
Für Geräte mit Android 11 oder höher können Sie ein OTA-Paket für mehrere Geräte mit unterschiedlichen SKUs erstellen. Dazu müssen die Zielgeräte für die Verwendung dynamischer Fingerabdrücke konfiguriert und die OTA-Metadaten aktualisiert werden, damit der Gerätename und der Fingerabdruck in den Pre- und Postcondition-Einträgen enthalten sind.
Bei Android 8.0 wurden dateibasierte OTA-Pakete für Geräte ohne A/B-Partitionen eingestellt. Stattdessen müssen blockbasierte OTA-Pakete verwendet werden. Wenn Sie blockbasierte OTA-Pakete für Geräte mit Android 7.x oder niedriger generieren möchten, übergeben Sie die Option --block
an den Parameter ota_from_target_files
.
Vollständige Updates erstellen
Ein vollständiges Update ist ein OTA-Paket, das den gesamten endgültigen Zustand des Geräts (System-, Boot- und Wiederherstellungspartitionen) enthält. Solange das Gerät das Paket empfangen und anwenden kann, kann das Paket den Build unabhängig vom aktuellen Status des Geräts installieren. Die folgenden Befehle verwenden beispielsweise Release-Tools, um das target-files.zip
-Archiv für das tardis
-Gerät zu erstellen.
. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output
make dist
erstellt ein vollständiges OTA-Paket (in $OUT
). Die resultierende Datei .zip
enthält alles, was zum Erstellen von OTA-Paketen für das Gerät tardis
erforderlich ist.
Sie können ota_from_target_files
auch als Python-Binärdatei erstellen und aufrufen, um vollständige oder inkrementelle Pakete zu erstellen.
ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip
Der Pfad ota_from_target_files
wird in $PATH
eingerichtet und das resultierende Python-Binärprogramm befindet sich im Verzeichnis out/
.
ota_update.zip
kann jetzt an Testgeräte gesendet werden. Alles ist mit dem Testschlüssel signiert. Generieren und verwenden Sie für Nutzergeräte Ihre eigenen privaten Schlüssel, wie unter Builds für die Veröffentlichung signieren beschrieben.
Inkrementelle Updates erstellen
Ein inkrementelles Update ist ein OTA-Paket, das binäre Patches für Daten enthält, die sich bereits auf dem Gerät befinden. Pakete mit inkrementellen Updates sind in der Regel kleiner, da sie keine unveränderten Dateien enthalten müssen. Da sich geänderte Dateien oft nur geringfügig von ihren vorherigen Versionen unterscheiden, muss das Paket nur eine Codierung der Unterschiede zwischen den beiden Dateien enthalten.
Sie können ein inkrementelles Updatepaket nur auf Geräten installieren, auf denen der Quell-Build verwendet wird, der zum Erstellen des Pakets verwendet wurde. Um ein inkrementelles Update zu erstellen, benötigen Sie die Datei target_files.zip
aus dem vorherigen Build (dem Build, den Sie aktualisieren möchten) sowie die Datei target_files.zip
aus dem neuen Build. In den folgenden Befehlen werden beispielsweise Release-Tools verwendet, um ein inkrementelles Update für das Gerät tardis
zu erstellen.
ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip
Dieser Build ähnelt dem vorherigen Build sehr und das inkrementelle Updatepaket (incremental_ota_update.zip
) ist viel kleiner als das entsprechende vollständige Update (etwa 1 MB statt 60 MB).
Verteilen Sie ein inkrementelles Paket nur auf Geräte, auf denen genau derselbe vorherige Build ausgeführt wird, der als Ausgangspunkt für das inkrementelle Paket verwendet wurde. Sie müssen die Images in PREVIOUS-tardis-target_files.zip
oder PREVIOUS-tardis-img.zip
flashen (beide mit make dist
erstellt und mit fastboot update
zu flashen) und nicht die im Verzeichnis PRODUCT_OUT
(mit make
erstellt und mit fastboot flashall
zu flashen). Wenn Sie versuchen, das inkrementelle Paket auf einem Gerät mit einem anderen Build zu installieren, führt dies zu einem Installationsfehler. Wenn die Installation fehlschlägt, bleibt das Gerät im selben Arbeitszustand (mit dem alten System). Das Paket prüft den vorherigen Zustand aller Dateien, die es aktualisiert, bevor es sie ändert. Das Gerät bleibt also nicht in einem halb aktualisierten Zustand.
Für eine optimale Nutzererfahrung sollten Sie alle drei bis vier inkrementellen Updates ein vollständiges Update anbieten. So können Nutzer die aktuelle Version schneller nutzen und müssen nicht eine lange Installationssequenz mit inkrementellen Updates durchlaufen.
OTA-Pakete für mehrere SKUs erstellen
In Android 11 oder höher kann ein einzelnes OTA-Paket für mehrere Geräte mit unterschiedlichen SKUs verwendet werden. Dazu müssen Sie die Zielgeräte für die Verwendung dynamischer Fingerabdrücke konfigurieren und die OTA-Metadaten (mit OTA-Tools) aktualisieren, damit der Gerätename und der Fingerabdruck in den Einträgen für die Vor- und Nachbedingungen enthalten sind.
SKUs
Das Format einer Artikelnummer ist eine Kombination von Build-Parameter-Werten und in der Regel eine nicht deklarierte Teilmenge der aktuellen build_fingerprint
-Parameter.
OEMs können für eine SKU eine beliebige Kombination von CDD-genehmigten Build-Parametern verwenden und gleichzeitig ein einzelnes Image für diese SKUs nutzen. Die folgende Artikelnummer hat beispielsweise mehrere Varianten:
SKU = <product><device><modifierA><modifierB><modifierC>
modifierA
ist die Geräteebene (z. B. Pro, Premium oder Plus).modifierB
ist die Hardware-Variante (z. B. Funkmodul).modifierC
ist die Region, die allgemein (z. B. NA, EMEA oder CHN) oder länder- oder sprachspezifisch (z. B. JPN, ENG oder CHN) sein kann.
Viele OEMs verwenden ein einzelnes Image für mehrere SKUs und leiten den endgültigen Produktnamen und Geräte-Fingerabdruck zur Laufzeit nach dem Start des Geräts ab. Dieser Prozess vereinfacht die Entwicklung der Plattform und ermöglicht es, dass Geräte mit geringfügigen Anpassungen, aber unterschiedlichen Produktnamen gemeinsame Images (z. B. tardis
und tardispro
) verwenden.
Dynamische Fingerabdrücke verwenden
Ein Fingerabdruck ist eine definierte Verkettung von Build-Parametern wie ro.product.brand
, ro.product.name
und ro.product.device
. Der Fingerprint eines Geräts wird aus dem Fingerprint der Systempartition abgeleitet und als eindeutige Kennung der auf dem Gerät ausgeführten Images (und Bytes) verwendet. Um einen dynamischen Fingerabdruck zu erstellen, verwenden Sie dynamische Logik in der build.prop
-Datei des Geräts, um den Wert von Bootloader-Variablen beim Starten des Geräts abzurufen. Verwenden Sie diese Daten dann, um einen dynamischen Fingerabdruck für das Gerät zu erstellen.
Wenn Sie beispielsweise dynamische Fingerabdrücke für tardis
- und tardispro
-Geräte verwenden möchten, aktualisieren Sie die folgenden Dateien wie unten gezeigt.
Aktualisieren Sie die Datei
odm/etc/build_std.prop
mit der folgenden Zeile.ro.odm.product.device=tardis
Aktualisieren Sie die Datei
odm/etc/build_pro.prop
mit der folgenden Zeile.ro.odm.product.device=tardispro
Aktualisieren Sie die Datei
odm/etc/build.prop
so, dass sie die folgenden Zeilen enthält.ro.odm.product.device=tardis import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
In diesen Zeilen werden der Gerätename, der Fingerabdruck und die ro.build.fingerprint
-Werte dynamisch auf Grundlage des Werts der Bootloader-Property ro.boot.product.hardware.sku
(die schreibgeschützt ist) festgelegt.
OTA-Paketmetadaten aktualisieren
Ein OTA-Paket enthält eine Metadatendatei (META-INF/com/android/metadata
), die das Paket beschreibt, einschließlich der Vor- und Nachbedingungen des OTA-Pakets. Der folgende Code ist beispielsweise die Metadatendatei für ein OTA-Paket, das auf das Gerät tardis
ausgerichtet ist.
post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis
Die Werte für pre-device
, pre-build-incremental
und pre-build
definieren den Zustand, den ein Gerät haben muss, bevor das OTA-Paket installiert werden kann. Die Werte post-build-incremental
und post-build
definieren den Zustand, den ein Gerät nach der Installation des OTA-Pakets haben soll. Die Werte der Felder pre-
und post-
werden aus den folgenden entsprechenden Build-Properties abgeleitet.
- Der
pre-device
-Wert wird aus dem Build-Attributro.product.device
abgeleitet. - Die Werte
pre-build-incremental
undpost-build-incremental
werden aus dem Build-Attributro.build.version.incremental
abgeleitet. - Die Werte
pre-build
undpost-build
werden aus dem Build-Attributro.build.fingerprint
abgeleitet.
Auf Geräten mit Android 11 oder höher können Sie mit dem Flag --boot_variable_file
in OTA-Tools einen Pfad zu einer Datei angeben, die die Werte der Laufzeitvariablen enthält, die zum Erstellen des dynamischen Fingerabdrucks des Geräts verwendet werden. Die Daten werden dann verwendet, um die OTA-Metadaten zu aktualisieren und den Gerätenamen und den Fingerabdruck in die Bedingungen pre-
und post-
aufzunehmen (mit dem Pipe-Zeichen | als Trennzeichen). Das Flag --boot_variable_file
hat die folgende Syntax und Beschreibung.
- Syntax:
--boot_variable_file <path>
- Beschreibung: Gibt einen Pfad zu einer Datei an, die die möglichen Werte von
ro.boot.*
-Attributen enthält. Wird verwendet, um die möglichen Laufzeit-Fingerprints zu berechnen, wenn einigero.product.*
-Attribute durch die Importanweisung überschrieben werden. Die Datei erwartet ein Attribut pro Zeile. Jede Zeile muss das folgende Format haben:prop_name=value1,value2
.
Wenn die Property beispielsweise ro.boot.product.hardware.sku=std,pro
ist, sehen die OTA-Metadaten für tardis
- und tardispro
-Geräte so aus:
post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro
Informationen zur Unterstützung dieser Funktion auf Geräten mit Android 10 finden Sie in der Referenzimplementierung.
In dieser Änderungsliste werden die import
-Anweisungen in der Datei build.prop
bedingt geparst, sodass Attributüberschreibungen erkannt und in den endgültigen OTA-Metadaten berücksichtigt werden können.