Auf dieser Seite werden die Änderungen beschrieben, die zu AOSP hinzugefügt wurden, um unnötige Dateiänderungen zwischen Builds zu reduzieren. Geräteimplementierungen, die ihre eigenen Build-Systeme unterhalten, können diese Informationen als Leitfaden verwenden. zur Reduzierung der Größe ihrer OTA-Updates.
Android-OTA-Updates enthalten gelegentlich geänderte Dateien, die keinen Codeänderungen entsprechen. Tatsächlich sind sie Systemartefakte. Dies kann vorkommen, wenn derselbe Code, aus verschiedenen Verzeichnissen oder auf verschiedenen Rechnern eine große Anzahl an geänderten Dateien. Solche überschüssigen Dateien erhöhen die Größe eines OTA-Patches und erschweren die Bestimmung welcher Code sich geändert hat.
Um den Inhalt eines OTA transparenter zu machen, umfasst der AOSP Build-Systemänderungen, um die Größe von OTA-Patches zu reduzieren. Unnötige Dateiänderungen zwischen Builds wurden vorgenommen entfernt und nur patch-bezogene Dateien sind in OTA-Updates enthalten. AOSP umfasst auch eine build diff-Tool, das allgemeine build-bezogene Funktionen herausfiltert. Änderungen an der Datei, um einen saubereren Build-Dateiunterschied bereitzustellen, und einen Tool zum Ordnen von Blockierungen, mit dem Sie die Blockierungen einheitlich sind.
Ein Build-System kann auf verschiedene Weise unnötig große Patches erstellen. Um dies zu vermeiden, Unter Android 8.0 und höher wurden neue Funktionen implementiert, um die Patchgröße für jedes Gerät zu reduzieren. Dateiunterschied Zu den Verbesserungen, die die Größe des OTA-Update-Pakets reduziert haben, gehören folgende Verbesserungen:
-
Die Nutzung von ZSTD, einem allgemeinen, verlustfreien Komprimierungsalgorithmus für vollständige
Bilder auf anderen Geräten als A/B-Updates. ZSTD kann für höhere
Komprimierungsverhältnisse durch Erhöhen des Komprimierungsgrads. Die Komprimierungsstufe wird während des OTA-Updates eingestellt
Erstellungszeit und kann festgelegt werden, indem das -Flag
--vabc_compression_param=zstd,$COMPRESSION_LEVEL
-
Die Größe des Komprimierungsfensters für das OTA-Update wird erhöht. Die maximale Größe des Komprimierungsfensters
Sie können ihn festlegen, indem Sie den Build-Parameter in der Datei
.mk
eines Geräts anpassen. Dieses Variable ist aufPRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 262144
<ph type="x-smartling-placeholder"> - Verwendung der Puffin-Komprimierung, einem deterministischen Patching-Tool zum Deflate Streams, die die Komprimierungs- und Diff-Funktionen für die Generierung von A/B-OTA-Updates verarbeiten.
-
Änderungen an der Verwendung des Tools zur Deltagenerierung, z. B. die Art und Weise,
bsdiff
wird zur Komprimierung von Patches verwendet. Unter Android 9 und höherbsdiff
-Tool den Komprimierungsalgorithmus auswählt, die besten Komprimierungsergebnisse für einen Patch. -
Verbesserungen am
update_engine
führte zu einem geringeren Arbeitsspeicherverbrauch, wenn Patches für A/B-Geräteupdates angewendet werden.
In den folgenden Abschnitten werden verschiedene Probleme, die sich auf die Größe von OTA-Updates auswirken, und Beispiele für die Implementierung in AOSP.
Dateireihenfolge
Problem: Dateisysteme garantieren nicht die Reihenfolge der Dateien, wenn sie nach einer Liste von Dateien gefragt werden.
in einem Verzeichnis gespeichert, auch wenn dies für denselben Bezahlvorgang in der Regel identisch ist. Tools wie
ls
sortiert die Ergebnisse standardmäßig, aber die Platzhalterfunktion für Befehle wie
da find
und make
nicht sortiert werden. Bevor Sie diese Tools verwenden können, müssen Sie
die Ausgaben.
Lösung: Wenn Sie Tools wie find
und
make
mit der Platzhalterfunktion die Ausgabe dieser Befehle, bevor Sie
. Bei Verwendung von $(wildcard)
oder $(shell find)
in
Android.mk
Dateien ebenfalls sortiert. Einige Tools, wie z. B. Java, sortieren Eingaben, sodass
bevor Sie die Dateien sortieren, vergewissern Sie sich, dass das von Ihnen verwendete Tool dies nicht bereits getan hat.
Beispiele: Viele Instanzen wurden im Core-Build-System mithilfe der Funktion
integriertes all-*-files-under
-Makro, das Folgendes beinhaltet:
all-cpp-files-under
(da mehrere Definitionen in anderen Makefiles verteilt waren).
Weitere Informationen:
- https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f
- https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410
- https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653
- https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c
Build-Verzeichnis
Problem:Wenn Sie das Verzeichnis ändern, in dem die Elemente erstellt werden, kann das dazu führen,
dass die Binärdateien unterschiedlich sind. Die meisten Pfade im Android-Build
sind relative Pfade, sodass
__FILE__
in C/C++ ist kein Problem. Mit den Debug-Symbolen wird jedoch
Pfadname standardmäßig und der .note.gnu.build-id
wird durch das Hashen der
vorab entfernte Binärdatei, sodass sie sich ändert,
wenn sich die Symbole zum Debuggen ändern.
Lösung:AOSP macht Debug-Pfade jetzt relativ. Weitere Informationen finden Sie im CL: https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02
Zeitstempel
Problem:Zeitstempel in der Build-Ausgabe führen zu unnötigen Dateiänderungen. Das passiert wahrscheinlich an folgenden Orten:
__DATE__/__TIME__/__TIMESTAMP__
-Makros in C- oder C++-Code.- In ZIP-basierte Archive eingebettete Zeitstempel
Lösungen/Beispiele: Um Zeitstempel aus der Build-Ausgabe zu entfernen, verwenden Sie die Methode finden Sie weiter unten im __DATE__/__TIME__/__TIMESTAMP__ in C/C++. und Eingebettete Zeitstempel in Archiven:
__DATE__/__TIME__/__TIMESTAMP__ in C/C++
Diese Makros erzeugen immer unterschiedliche Ausgaben für verschiedene Builds und sollten daher nicht verwendet werden. Hier können Sie diese Makros mit folgenden Optionen entfernen:
- Bitte entfernen Sie sie. Ein Beispiel finden Sie unter https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f.
- Um die laufende Binärdatei eindeutig zu identifizieren, lesen Sie die Build-ID aus dem ELF-Header.
-
Informationen dazu, wann das Betriebssystem erstellt wurde, finden Sie im
ro.build.date
(dies funktioniert für alles außer inkrementelle Builds, die dieses Datum möglicherweise nicht aktualisieren). Ein Beispiel finden Sie bis https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84
Eingebettete Zeitstempel in Archiven (ZIP, JAR)
In Android 7.0 wurde das Problem mit eingebetteten Zeitstempeln in ZIP-Archiven behoben, indem
-X
für alle Verwendungen des Befehls zip
. Dadurch wurde die UID/GID der
und den erweiterten Unix-Zeitstempel aus der ZIP-Datei.
Das neue Tool ziptime
(in
/platform/build/+/main/tools/ziptime/
) setzt die normalen Zeitstempel in den ZIP-Headern zurück. Weitere Informationen finden Sie in der
README-Datei.
Das signapk
-Tool legt Zeitstempel für die APK-Dateien fest. Diese können je nach
Zeitzone des Servers. Weitere Informationen finden Sie im CL.
<ph type="x-smartling-placeholder"></ph>
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028
Das signapk
-Tool legt Zeitstempel für die APK-Dateien fest. Diese können je nach
Zeitzone des Servers. Weitere Informationen finden Sie im CL.
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028.
Versionsstrings
Problem:An APK-Versionsstrings war oft das BUILD_NUMBER
angehängt.
ihre hartcodierten Versionen. Selbst wenn sich folglich nichts anderes in einem APK geändert hat,
immer noch anders sein.
Lösung:Entfernen Sie die Build-Nummer aus dem APK-Versionsstring.
Beispiele:
- https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27
- https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c
Verifizierung der Integrität auf dem Gerät aktivieren
Wenn dm-verity aktiviert ist, übernehmen die OTA-Tools automatisch deine Versionskonfiguration und die On-Device-Zuverlässigkeitsberechnung zu aktivieren. Dadurch können Prüfungsblöcke unter Android berechnet werden und werden nicht als Rohbyte im OTA-Paket gespeichert. Verity-Blöcke können ca. 16 MB für eine 2-GB-Partition.
Allerdings kann die Computing-Zuverlässigkeit auf dem Gerät sehr lange dauern. Die Forward API
Der Fehlerkorrekturcode kann sehr lange dauern. Auf Pixel-Geräten dauert dies in der Regel bis zu 10
Minuten. Auf Low-End-Geräten kann es länger dauern. Wenn Sie die On-Device-Version deaktivieren möchten
und dm-verity dennoch aktivieren, können Sie dies tun, indem Sie
--disable_fec_computation
an das ota_from_target_files
-Tool, wenn
das Generieren eines OTA-Updates. Dieses Flag deaktiviert die On-Device-Berechnung der Version während OTA-Updates.
Dadurch wird die OTA-Installationszeit verringert, aber die Größe des OTA-Pakets erhöht. Wenn Ihr Gerät nicht
dm-verity aktiviert haben, hat das Übergeben dieses Flags keine Auswirkungen.
Einheitliche Build-Tools
Problem:Tools, die installierte Dateien generieren, müssen einheitlich sein (eine bestimmte Eingabe immer dieselbe Ausgabe erzeugen).
Lösungen/Beispiele:An den folgenden Build-Tools waren Änderungen erforderlich:
- NOTICE-Dateiersteller. Der Ersteller der NOTICE-Datei wurde geändert und erstellt reproduzierbare NOTICE-Sammlungen. Siehe Änderungsprotokoll: https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64
- Java Android Compiler Kit (Jack) Die Jack-Toolchain erforderte eine Aktualisierung auf verarbeiten gelegentliche Änderungen in der Reihenfolge der generierten Konstruktoren. Deterministische Zugriffsfunktionen für Der Toolchain wurden Konstruktoren hinzugefügt: https://android.googlesource.com/tooltip/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b
- ART AOT-Compiler (dex2oat). Die ART-Compiler-Binärdatei hat ein Update erhalten, das Eine Option zum Erstellen eines deterministischen Bilds wurde hinzugefügt: https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9
-
Die Datei libpac.so (V8) Mit jedem Build wird ein
/system/lib/libpac.so
-Datei, da sich der V8-Snapshot für jeden Build ändert. Die den Snapshot zu entfernen: https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29 - Pre-Dexopt-Dateien (.odex) der Anwendung. Pre-Dexopt-Dateien (ODEX) nicht initialisiertes Padding auf 64-Bit-Systemen. Folgendes wurde korrigiert: https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029
Tool „Build diff“ verwenden
In Fällen, in denen es nicht möglich ist, build-bezogene Dateiänderungen zu eliminieren, enthält AOSP eine
„build diff“-Tool,
target_files_diff.py
zum Vergleich von zwei Dateipaketen. Dieses Tool führt eine rekursive Differenz zwischen zwei
Builds erstellt werden. Hiervon ausgenommen sind allgemeine
Build-bezogene Dateiänderungen wie
- Erwartete Änderungen in der Build-Ausgabe (z. B. aufgrund einer Änderung der Build-Nummer)
- Änderungen aufgrund bekannter Probleme im aktuellen Build-System.
Führen Sie den folgenden Befehl aus, um das Tool „build diff“ zu verwenden:
target_files_diff.py dir1 dir2
dir1
und dir2
sind Basisverzeichnisse, die das extrahierte Ziel enthalten
für jeden Build.
Blockierungen einheitlich zuweisen
Auch wenn der Inhalt einer bestimmten Datei bei zwei Builds gleich bleibt, werden die die die Daten enthalten, haben sich möglicherweise geändert. Der Updater muss daher unnötige E/A-Vorgänge ausführen. um die Blöcke für ein OTA-Update zu verschieben.
Bei einem Virtual A/B OTA-Update können unnötige E/A-Vorgänge den erforderlichen Speicherplatz erheblich erhöhen. um den Copy-on-Write-Snapshot zu speichern. Bei einem Nicht-A/B-OTA-Update wird das Verschieben der Blöcke für eine OTA-Updates tragen zur Aktualisierungszeit bei, da aufgrund von Blockverschiebungen mehr E/A-Vorgänge stattfinden.
Um dieses Problem zu beheben, hat Google in Android 7.0 das make_ext4fs
-Tool für
damit die Blockzuweisung über alle Builds hinweg konsistent ist. Das make_ext4fs
-Tool akzeptiert
Ein optionales -d base_fs
-Flag, das versucht, Dateien denselben Blöcken zuzuweisen
wenn ein ext4
-Bild generiert wird. Sie können die Blockzuordnungsdateien (z. B.
base_fs
-Zuordnungsdateien) aus den Zieldateien eines vorherigen Builds ZIP-Datei. Für jede
Partition ext4
befindet sich die Datei .map
im
IMAGES
-Verzeichnis (z. B. entspricht IMAGES/system.map
dem
system
). Diese base_fs
Dateien können dann eingecheckt werden und
wie in diesem Beispiel über PRODUCT_<partition>_BASE_FS_PATH
angegeben:
PRODUCT_SYSTEM_BASE_FS_PATH := path/to/base_fs_files/base_system.map PRODUCT_SYSTEM_EXT_BASE_FS_PATH := path/to/base_fs_files/base_system_ext.map PRODUCT_VENDOR_BASE_FS_PATH := path/to/base_fs_files/base_vendor.map PRODUCT_PRODUCT_BASE_FS_PATH := path/to/base_fs_files/base_product.map PRODUCT_ODM_BASE_FS_PATH := path/to/base_fs_files/base_odm.map
Dies reduziert zwar nicht die Gesamtgröße des OTA-Pakets, verbessert aber die OTA-Aktualisierung. indem Sie den E/A-Aufwand reduzieren. Bei virtuellen A/B-Updates wird die wie viel Speicherplatz zum Anwenden des OTA-Speichers erforderlich ist.
App-Updates vermeiden
Sie können nicht nur Build-Unterschiede minimieren, sondern auch die Größe von OTA-Updates reduzieren, indem Sie Updates ausschließen. für Apps, die Updates über App-Shops erhalten. APKs machen häufig einen erheblichen Teil verschiedene Partitionen auf einem Gerät. Einschließlich der neuesten App-Versionen, die von der App aktualisiert werden bei einem OTA-Update große Auswirkungen auf die Größe des OTA-Pakets haben und profitieren. Wenn die Nutzer ein OTA-Paket erhalten haben, haben sie möglicherweise bereits die aktualisierte App oder eine noch neuere Version, die direkt aus den App-Shops bezogen wurde.