À l'intérieur des forfaits OTA

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Le système construit le binaire de mise à jour à partir de bootable/recovery/updater et l'utilise dans un package OTA.

Le package lui-même est un fichier .zip ( ota_update.zip , incremental_ota_update.zip ) qui contient le binaire exécutable META-INF/com/google/android/update-binary .

Updater contient plusieurs fonctions intégrées et un interpréteur pour un langage de script extensible ( edify ) qui prend en charge les commandes pour les tâches typiques liées à la mise à jour. Updater recherche dans le fichier .zip du package un script dans le fichier META-INF/com/google/android/updater-script .

Remarque : L'utilisation du script edify et/ou des fonctions intégrées n'est pas une activité courante, mais peut être utile si vous avez besoin de déboguer le fichier de mise à jour.

Edifier la syntaxe

Un script Edify est une expression unique dans laquelle toutes les valeurs sont des chaînes. Les chaînes vides sont fausses dans un contexte booléen et toutes les autres chaînes sont vraies . Edify prend en charge les opérateurs suivants (avec les significations habituelles) :

(expr )
 expr + expr  # string concatenation, not integer addition
 expr == expr
 expr != expr
 expr && expr
 expr || expr
 ! expr
 if expr then expr endif
 if expr then expr else expr endif
 function_name(expr, expr,...)
 expr; expr

Toute chaîne de caractères az, AZ, 0-9, _, :, /, . qui n'est pas un mot réservé est considéré comme un littéral de chaîne. (Les mots réservés sont if else then endif. ) Les littéraux de chaîne peuvent également apparaître entre guillemets ; voici comment créer des valeurs avec des espaces et d'autres caractères ne figurant pas dans l'ensemble ci-dessus. \n, \t, \", et \\ servent d'échappement dans les chaînes entre guillemets, tout comme \x ## .

Le && et || les opérateurs court-circuitent ; le côté droit n'est pas évalué si le résultat logique est déterminé par le côté gauche. Les éléments suivants sont équivalents :

e1 && e2
if e1 then e2 endif

La ; l'opérateur est un point de séquence ; cela signifie évaluer d'abord le côté gauche, puis le côté droit. Sa valeur est la valeur de l'expression de droite. Un point-virgule peut également apparaître après une expression, de sorte que l'effet simule des instructions de style C :

prepare();
do_other_thing("argument");
finish_up();

Fonctions intégrées

La plupart des fonctionnalités de mise à jour sont contenues dans les fonctions disponibles pour l'exécution par des scripts. (À proprement parler, ce sont des macros plutôt que des fonctions au sens Lisp, puisqu'elles n'ont pas besoin d'évaluer tous leurs arguments.) Sauf indication contraire, les fonctions renvoient true en cas de succès et false en cas d'erreur. Si vous souhaitez que les erreurs interrompent l'exécution du script, utilisez les fonctions abort() et/ou assert() . L'ensemble des fonctions disponibles dans le programme de mise à jour peut également être étendu pour fournir des fonctionnalités spécifiques à l'appareil .

abort([ msg ])
Abandonne immédiatement l'exécution du script, avec l'option msg . Si l'utilisateur a activé l'affichage de texte, msg apparaît dans le journal de récupération et à l'écran.
assert( expr [, expr , ...])
Évalue chaque expr tour à tour. Si any est faux, abandonne immédiatement l'exécution avec le message "assert failed" et le texte source de l'expression ayant échoué.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
Applique un correctif binaire au src_file pour produire le tgt_file . Si la cible souhaitée est la même que la source, passez "-" pour tgt_file . tgt_sha1 et tgt_size sont le hachage SHA1 final attendu et la taille du fichier cible. Les arguments restants doivent être appariés : un hachage SHA1 (une chaîne hexadécimale de 40 caractères) et un blob. Le blob est le correctif à appliquer lorsque le contenu actuel du fichier source a le SHA1 donné.

Le correctif est effectué d'une manière sûre qui garantit que le fichier cible a le hachage et la taille SHA1 souhaités, ou qu'il n'est pas modifié - il ne sera pas laissé dans un état intermédiaire irrécupérable. Si le processus est interrompu pendant le patch, le fichier cible peut être dans un état intermédiaire ; une copie existe dans la partition de cache afin que le redémarrage de la mise à jour puisse mettre à jour le fichier avec succès.

Une syntaxe spéciale est prise en charge pour traiter le contenu des partitions Memory Technology Device (MTD) comme des fichiers, ce qui permet de corriger les partitions brutes telles que boot. Pour lire une partition MTD, vous devez savoir combien de données vous voulez lire puisque la partition n'a pas de notion de fin de fichier. Vous pouvez utiliser la chaîne "MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 " comme nom de fichier pour lire la partition donnée. Vous devez spécifier au moins une paire (taille, sha-1) ; vous pouvez en spécifier plusieurs s'il existe plusieurs possibilités pour ce que vous vous attendez à lire.

apply_patch_check( filename , sha1 [, sha1 , ...])
Renvoie true si le contenu de filename ou la copie temporaire dans la partition de cache (le cas échéant) a une somme de contrôle SHA1 égale à l'une des valeurs sha1 données. Les valeurs sha1 sont spécifiées sous la forme de 40 chiffres hexadécimaux. Cette fonction diffère de sha1_check(read_file( filename ), sha1 [, ...]) en ce qu'elle sait vérifier la copie de la partition de cache, donc apply_patch_check() réussira même si le fichier a été corrompu par une mise à jour interrompue de apply_patch() update .
apply_patch_space( bytes )
Renvoie vrai si au moins des octets d'espace de travail sont disponibles pour appliquer des correctifs binaires.
concat( expr [, expr , ...])
Évalue chaque expression et les concatène. L'opérateur + est du sucre syntaxique pour cette fonction dans le cas particulier de deux arguments (mais la forme de la fonction peut prendre n'importe quel nombre d'expressions). Les expressions doivent être des chaînes ; il ne peut pas concaténer des blobs.
file_getprop( filename , key )
Lit le nom de fichier donné, l'interprète comme un fichier de propriétés (par exemple /system/build.prop ) et renvoie la valeur de la clé donnée, ou la chaîne vide si la clé n'est pas présente.
format( fs_type , partition_type , location , fs_size , mount_point )
Reformate une partition donnée. Types de partition pris en charge :
  • fs_type="yaffs2" et partition_type="MTD". L'emplacement doit être le nom de la partition MTD ; un système de fichiers yaffs2 vide y est construit. Les arguments restants sont inutilisés.
  • fs_type="ext4" et partition_type="EMMC". L'emplacement doit être le fichier de périphérique de la partition. Un système de fichiers ext4 vide y est construit. Si fs_size vaut zéro, le système de fichiers occupe toute la partition. Si fs_size est un nombre positif, le système de fichiers prend les premiers octets fs_size de la partition. Si fs_size est un nombre négatif, le système de fichiers prend tout sauf le dernier |fs_size| octets de la partition.
  • fs_type="f2fs" et partition_type="EMMC". L'emplacement doit être le fichier de périphérique de la partition. fs_size doit être un nombre non négatif. Si fs_size vaut zéro, le système de fichiers occupe toute la partition. Si fs_size est un nombre positif, le système de fichiers prend les premiers octets fs_size de la partition.
  • mount_point doit être le futur point de montage du système de fichiers.
getprop( key )
Renvoie la valeur de la propriété système key (ou la chaîne vide, si elle n'est pas définie). Les valeurs des propriétés système définies par la partition de récupération ne sont pas nécessairement les mêmes que celles du système principal. Cette fonction renvoie la valeur en récupération.
greater_than_int( a , b )
Renvoie true si et seulement si (ssi) a (interprété comme un entier) est supérieur à b (interprété comme un entier).
ifelse( cond , e1 [, e2 ])
Évalue cond , et s'il est vrai, évalue et renvoie la valeur de e1 , sinon il évalue et renvoie e2 (si présent). La construction "if ... else ... then ... endif" n'est qu'un sucre syntaxique pour cette fonction.
is_mounted( mount_point )
Renvoie true ssi il y a un système de fichiers monté au mount_point .
is_substring( needle , haystack )
Renvoie true ssi needle est une sous-chaîne de haystack .
less_than_int( a , b )
Renvoie true ssi a (interprété comme un entier) est inférieur à b (interprété comme un entier).
mount( fs_type , partition_type , name , mount_point )
Monte un système de fichiers de type_fs au point_de_montage . type_partition doit être l'un des suivants :
  • MDT . Name est le nom d'une partition MTD (par exemple, system, userdata ; voir /proc/mtd sur le périphérique pour une liste complète).
  • EMMC.

La récupération ne monte aucun système de fichiers par défaut (à l'exception de la carte SD si l'utilisateur effectue une installation manuelle d'un package à partir de la carte SD) ; votre script doit monter toutes les partitions qu'il doit modifier.

package_extract_dir( package_dir , dest_dir )
Extrait tous les fichiers du package sous package_dir et les écrit dans l'arborescence correspondante sous dest_dir . Tous les fichiers existants sont écrasés.
package_extract_file( package_file [, dest_file ])
Extrait un seul package_file du package de mise à jour et l'écrit dans dest_file , en écrasant les fichiers existants si nécessaire. Sans l'argument dest_file , renvoie le contenu du fichier de package sous la forme d'un blob binaire.
read_file( filename )
Lit le nom de fichier et renvoie son contenu sous la forme d'un blob binaire.
run_program( path [, arg , ...])
Exécute le binaire sur path , en passant arg s. Renvoie l'état de sortie du programme.
set_progress( frac )
Définit la position de la jauge de progression dans le segment défini par l'appel show_progress() le plus récent. frac doit être dans la plage [0.0, 1.0]. La jauge de progression ne recule jamais ; les tentatives de le faire sont ignorées.
sha1_check( blob [, sha1 ])
L'argument blob est un blob du type renvoyé par read_file() ou la forme à un argument de package_extract_file() . Sans arguments sha1 , cette fonction renvoie le hachage SHA1 du blob (sous la forme d'une chaîne hexadécimale à 40 chiffres). Avec un ou plusieurs arguments sha1 , cette fonction renvoie le hachage SHA1 s'il est égal à l'un des arguments, ou la chaîne vide s'il n'est égal à aucun d'entre eux.
show_progress( frac , secs )
Avance le compteur de progression sur la frac suivante de sa longueur sur les secondes secondes (doit être un entier). secs peut être 0, auquel cas le compteur n'est pas avancé automatiquement mais en utilisant la fonction set_progress() définie ci-dessus.
sleep( secs )
Veille pendant secondes secondes (doit être un entier).
stdout( expr [, expr , ...])
Évalue chaque expression et vide sa valeur sur stdout. Utile pour le débogage.
tune2fs( device [, arg , …])
Ajuste les paramètres réglables args sur le périphérique .
ui_print([ text , ...])
Concatène tous les arguments de texte et imprime le résultat dans l'interface utilisateur (où il sera visible si l'utilisateur a activé l'affichage du texte).
unmount( mount_point )
Démonte le système de fichiers monté au point_de_montage .
wipe_block_device( block_dev , len )
Efface les len octets du périphérique de bloc donné block_dev .
wipe_cache()
Provoque l'effacement de la partition de cache à la fin d'une installation réussie.
write_raw_image( filename_or_blob , partition )
Écrit l'image dans filename_or_blob sur la partition MTD. filename_or_blob peut être une chaîne nommant un fichier local ou un argument de valeur blob contenant les données à écrire. Pour copier un fichier du package OTA vers une partition, utilisez : write_raw_image(package_extract_file("zip_filename"), "partition_name");

Remarque : Avant Android 4.1, seuls les noms de fichiers étaient acceptés, donc pour ce faire, les données devaient d'abord être décompressées dans un fichier local temporaire.