Cette page décrit les modifications ajoutées à AOSP pour réduire les modifications de fichiers inutiles entre les compilations. Les responsables de l'implémentation d'appareils qui gèrent leurs propres systèmes de compilation peuvent s'inspirer de ces informations. pour réduire la taille de leurs mises à jour Over The Air (OTA).
Les mises à jour OTA d'Android contiennent parfois des fichiers modifiés qui ne correspondent pas aux changements du code. Il s'agit en fait d'artefacts système de compilation. Cela peut se produire lorsque le même code, compilé à différents niveaux à partir de répertoires ou de machines différents produit un grand nombre de modifications . Ces fichiers en trop augmentent la taille d'un correctif OTA et rendent difficile son identification quel code a été modifié.
Pour rendre le contenu d'une OTA plus transparent, AOSP inclut des modifications du système de compilation conçues pour réduire la taille des correctifs OTA. Des modifications inutiles ont été apportées au fichier et seuls les fichiers liés aux correctifs sont contenus dans les mises à jour OTA. AOSP comprend également outil de comparaison de compilation, qui filtre les différences de compilation courantes les modifications de fichiers pour fournir une différence plus propre dans le fichier de compilation, outil de mappage de blocs, qui vous aide à conserver l'allocation de blocs cohérentes.
Un système de compilation peut créer des correctifs inutilement volumineux de plusieurs manières. Pour atténuer ce problème, dans Sur Android 8.0 et versions ultérieures, de nouvelles fonctionnalités ont été ajoutées afin de réduire la taille du correctif pour chaque diff. Voici les améliorations qui ont permis de réduire la taille des packages OTA-update:
-
Utilisation de ZSTD, un algorithme de compression sans perte à usage générique pour des
sur les mises à jour d'appareils non A/B. Vous pouvez personnaliser la valeur ZSTD
en augmentant le niveau de compression. Le niveau de compression est défini pendant l'OTA
et peuvent être définies en transmettant
--vabc_compression_param=zstd,$COMPRESSION_LEVEL
-
Augmentation de la taille de la fenêtre de compression utilisée lors de l'OTA. Taille maximale de la fenêtre de compression
peut être défini en personnalisant le paramètre de compilation dans le fichier
.mk
d'un appareil. Ce est définie surPRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 262144
<ph type="x-smartling-placeholder"> - Utilisation de la recompression Puffin, un outil d'application de correctifs déterministe pour le dégâtnement flux, qui gère les fonctions de compression et de différence pour la génération de mises à jour OTA A/B.
-
Modifications apportées à l'utilisation de l'outil de génération delta, telles que la manière dont
bsdiff
est utilisée pour compresser les correctifs. Sur Android 9 ou version ultérieure, L'outilbsdiff
sélectionne l'algorithme de compression les meilleurs résultats de compression pour un correctif. -
Améliorations apportées à la
update_engine
a entraîné une réduction de la consommation de mémoire lors de l'application de correctifs pour les mises à jour A/B des appareils.
Les sections suivantes traitent de différents problèmes qui affectent la taille des mises à jour OTA, leurs solutions, et des exemples d'implémentation dans AOSP.
Ordre des fichiers
Problème: les systèmes de fichiers ne garantissent pas l'ordre des fichiers lorsqu'une liste de
fichiers dans un répertoire, bien que cela soit
généralement le même pour le même paiement. Des outils tels que
ls
trie les résultats par défaut, mais la fonction de caractère générique utilisée par les commandes telles que
que find
et make
ne sont pas triées. Avant d'utiliser ces outils, vous devez trier
les sorties.
Solution: lorsque vous utilisez des outils tels que find
et
make
avec la fonction de caractère générique, triez le résultat de ces commandes avant d'utiliser
de l'IA générative. Lorsque vous utilisez $(wildcard)
ou $(shell find)
dans
Android.mk
fichiers, triez-les également. Certains outils, comme Java, trient les entrées,
Avant de trier les fichiers, vérifiez que l'outil que vous utilisez ne l'a pas déjà fait.
Exemples:De nombreuses instances ont été corrigées dans le système de compilation principal à l'aide de l'
all-*-files-under
intégrée, qui inclut
all-cpp-files-under
(car plusieurs définitions ont été réparties dans d'autres fichiers makefile).
Pour en savoir plus, consultez les ressources suivantes:
- 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.
Répertoire de compilation
Problème:la modification du répertoire dans lequel les éléments sont compilés peut entraîner l'erreur
les binaires soient différents. La plupart des chemins d'accès dans le build Android sont des chemins relatifs.
__FILE__
en C/C++ n'est pas un problème. Toutefois, les symboles de débogage encodent l'intégralité
pathname par défaut, et le .note.gnu.build-id
est généré en hachant le
binaire pré-effacé, qui change donc si les symboles de débogage changent.
Solution:AOSP rend désormais les chemins de débogage relatifs. Pour en savoir plus, consultez CL: https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02.
Codes temporels
Problème:les horodatages dans le résultat de la compilation entraînent des modifications inutiles dans les fichiers. Ce problème est susceptible de se produire dans les pays suivants:
__DATE__/__TIME__/__TIMESTAMP__
en code C ou C++.- Codes temporels intégrés aux archives ZIP.
Solutions/Exemples:Pour supprimer des horodatages dans la sortie de compilation, utilisez la méthode les instructions fournies ci-dessous dans __DATE__/__TIME__/__TIMESTAMP__ en C/C++. et Horodatages intégrés dans les archives :
__DATE__/__TIME__/__TIMESTAMP__ en C/C++
Ces macros produisent toujours des sorties différentes selon les builds. Par conséquent, nous vous déconseillons de les utiliser. Ici, plusieurs options permettent de les supprimer:
- Supprimez-les. Pour obtenir un exemple, consultez https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f.
- Pour identifier de manière unique le binaire en cours d'exécution, lisez l'ID de build à partir de l'en-tête ELF.
-
Pour savoir quand l'OS a été créé, lisez le
ro.build.date
(cela fonctionne pour tout sauf les builds incrémentiels, qui ne sont peut-être pas mis à jour à cette date). Pour consulter un exemple, reportez-vous à à https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84.
Codes temporels intégrés dans les archives (ZIP, JAR)
Android 7.0 a résolu le problème des horodatages intégrés dans les archives zip en ajoutant
-X
à toutes les utilisations de la commande zip
. Cette opération a supprimé l'UID/GID du
et le code temporel Unix étendu du fichier zip.
Un nouvel outil, ziptime
(situé dans
/platform/build/+/main/tools/ziptime/
) réinitialise les codes temporels normaux dans les en-têtes ZIP. Pour en savoir plus, consultez les
Fichier README.
L'outil signapk
définit les codes temporels des fichiers APK qui peuvent varier en fonction
le fuseau horaire du serveur. Pour en savoir plus, consultez la
<ph type="x-smartling-placeholder"></ph>
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028.
L'outil signapk
définit les codes temporels des fichiers APK qui peuvent varier en fonction
le fuseau horaire du serveur. Pour en savoir plus, consultez la
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028.
Chaînes de version
Problème:BUILD_NUMBER
était souvent ajouté aux chaînes des versions d'APK
à leurs versions codées en dur. Même si rien d'autre n'a changé dans un APK, l'APK
serait différente.
Solution:supprimez le numéro de build de la chaîne de version de l'APK.
Exemples:
- https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27
- https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c
Activer le calcul de vérification sur l'appareil
Si dm-verity est activé sur votre appareil, les outils OTA récupèrent automatiquement votre configuration de vérification et activer le calcul de vérification sur l'appareil. Cela permet de calculer les blocs de vérification sur Android au lieu d'être stockés sous forme d'octets bruts dans votre package OTA. Les blocs de vérification peuvent utiliser environ 16 Mo pour une partition de 2 Go.
Toutefois, le calcul de la vérification sur l'appareil peut prendre beaucoup de temps. Plus précisément, la fonction
La correction des erreurs peut prendre beaucoup de temps. Sur les appareils Pixel,
minutes. Sur les appareils bas de gamme, cela peut prendre plus de temps. Si vous souhaitez désactiver la vérification sur l'appareil
les calculs tout en activant dm-verity, vous pouvez le faire en transmettant
--disable_fec_computation
à l'outil ota_from_target_files
lorsque
la génération d'une mise à jour OTA. Cet indicateur désactive le calcul de vérification sur l'appareil lors des mises à jour OTA.
Cela réduit le temps d'installation de l'OTA, mais augmente la taille du package OTA. Si votre appareil ne
si dm-verity est activé, la transmission de cet indicateur n'a aucun effet.
Outils de compilation cohérents
Problème:les outils qui génèrent les fichiers installés doivent être cohérents (une doivent toujours produire la même sortie).
Solutions/Exemples:des modifications ont été nécessaires dans les outils de compilation suivants:
- Créateur de fichier AVIS. Le créateur du fichier AVIS a été modifié pour créer collections INFORMATION reproductibles. Reportez-vous à CL: https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64.
- Java Android Compiler Kit (Jack) La chaîne d'outils Jack a nécessité une mise à jour pour gérer les modifications occasionnelles apportées à l'ordre des constructeurs générés. Accesseurs déterministes pour constructeurs ont été ajoutés à la chaîne d'outils: https://android.googlesource.com/workload/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b.
- Compilateur ART AOT (dex2oat). Le binaire du compilateur ART a reçu une mise à jour qui Ajout d'une option pour créer une image déterministe: https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9
-
Fichier libpac.so (V8). Chaque build crée un
/system/lib/libpac.so
, car l'instantané V8 change pour chaque build. La consiste à supprimer l'instantané: https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29. - Fichiers de pré-dexopt (.odex) au niveau de l'application : Les fichiers pre-dexopt (.odex) contenait une marge intérieure non initialisée sur les systèmes 64 bits. Ce problème a été corrigé: https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029.
Utiliser l'outil Build Diff
Dans les cas où il est impossible d'éliminer les modifications de fichiers liées à la compilation, AOSP inclut un
de compilation des différences,
target_files_diff.py
à utiliser pour comparer
deux packages de fichiers. Cet outil effectue une différence récursive entre deux
à l'exclusion des modifications courantes apportées aux fichiers liées à la compilation, telles que
- Modifications attendues dans la sortie de compilation (par exemple, en raison d'un changement de numéro de compilation).
- Modifications dues à des problèmes connus dans le système de compilation actuel.
Pour utiliser l'outil Build diff, exécutez la commande suivante:
target_files_diff.py dir1 dir2
dir1
et dir2
sont des répertoires de base contenant la cible extraite.
pour chaque compilation.
Maintenir la cohérence de l'allocation des blocs
Pour un fichier donné, bien que son contenu reste le même entre deux compilations, les blocs réels qui contiennent les données ont peut-être changé. Le programme de mise à jour doit donc effectuer pour déplacer les blocs pour une mise à jour OTA.
Dans une mise à jour OTA virtuelle A/B, des E/S inutiles peuvent augmenter considérablement l'espace de stockage nécessaire. pour stocker l'instantané de copie en écriture. Dans une mise à jour OTA non A/B, déplacer les blocs pour La mise à jour OTA contribue à augmenter la durée des mises à jour, car les E/S sont plus nombreuses en raison des déplacements de blocs.
Pour résoudre ce problème, Google a étendu l'outil make_ext4fs
dans Android 7.0 à
en gardant l'allocation de blocs cohérente entre les compilations. L'outil make_ext4fs
accepte
Un indicateur -d base_fs
facultatif qui tente d'allouer des fichiers aux mêmes blocs
lors de la génération d'une image ext4
. Vous pouvez extraire les fichiers de mappage de blocs (tels que
les fichiers de mappage base_fs
) à partir des fichiers cibles d'une compilation précédente .zip. Pour chaque
ext4
, il y a un fichier .map
dans
Répertoire IMAGES
(par exemple, IMAGES/system.map
correspond au répertoire
la partition system
). Ces fichiers base_fs
peuvent ensuite être enregistrés et
spécifié via PRODUCT_<partition>_BASE_FS_PATH
, comme dans cet exemple:
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
Bien que cela n'aide pas à réduire la taille globale du package OTA, cela améliore la mise à jour OTA. en réduisant le nombre d'E/S. Pour les mises à jour A/B virtuelles, il réduit considérablement d'espace de stockage nécessaire pour appliquer la mise à jour OTA.
Éviter de mettre à jour des applications
En plus de réduire les différences de compilation, vous pouvez réduire la taille des mises à jour OTA en excluant les mises à jour pour les applications mises à jour via les plates-formes de téléchargement d'applications. Les APK comprennent souvent une partie importante différentes partitions d'un appareil. Y compris les dernières versions des applications mises à jour par application les magasins d'une mise à jour OTA peuvent avoir un impact important sur les packages OTA et fournir peu d'utilisateurs avantageuse. Lorsque les utilisateurs reçoivent un package OTA, il est possible qu'ils disposent déjà de la mise à jour de l'application. une version encore plus récente, reçue directement des plates-formes de téléchargement d'applications.