À l'intérieur des packages OTA

Le système construit le binaire du programme 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 devez déboguer le fichier de mise à jour.

Modifier 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, _,:, /,. ce n'est pas un mot réservé est considéré comme une chaîne littérale. (Les mots réservés sont if else alors 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 n'appartenant pas à l'ensemble ci-dessus. \ n, \ t, \ "et \\ servent d'échappements dans les chaînes entre guillemets, tout comme \ x ## .

Les && 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

Le ; 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, car elles n'ont pas besoin d'évaluer tous leurs arguments.) Sauf indication contraire, les fonctions retournent vrai en cas de succès et faux en cas d'erreur. Si vous souhaitez que des 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 ])
Annule immédiatement l'exécution du script, avec le msg facultatif. 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 à son 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 patch 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 se présenter par paires: un hachage SHA1 (une chaîne hexadécimale de 40 caractères) et un objet 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 l'application des correctifs, le fichier cible peut être dans un état intermédiaire; une copie existe dans la partition de cache, donc le redémarrage de la mise à jour peut mettre à jour le fichier avec succès.

Une syntaxe spéciale est prise en charge pour traiter le contenu des partitions MTD (Memory Technology Device) comme des fichiers, permettant la correction des partitions brutes telles que le démarrage. Pour lire une partition MTD, vous devez savoir combien de données vous voulez lire car 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 de la copie temporaire dans la partition de cache (si présente) a une somme de contrôle SHA1 égale à l'une des valeurs sha1 données. Les valeurs sha1 sont spécifiées sous 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 apply_patch() update interrompue.
apply_patch_space( bytes )
Renvoie true si au moins 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 un 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 les 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 ne sont pas utilisé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 devrait être le futur point de montage du système de fichiers.
getprop( key )
Renvoie la valeur de la clé de propriété système (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 (siff) 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 que du sucre syntaxique pour cette fonction.
is_mounted( mount_point )
Renvoie true ssi un système de fichiers est monté à mount_point .
is_substring( needle , haystack )
Renvoie vrai si l' aiguille est une sous-chaîne de meule de foin .
less_than_int( a , b )
Renvoie vrai si 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 fs_type au point de montage . partition_type doit être l'un des suivants:
  • MTD . Nom est le nom d'une partition MTD (par exemple, système, données utilisateur; voir /proc/mtd sur le périphérique pour une liste complète).
  • EMMC.

La restauration ne monte aucun système de fichiers par défaut (sauf 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 objet blob binaire.
read_file( filename )
Lit le nom du fichier et renvoie son contenu sous forme de blob binaire.
run_program( path [, arg , ...])
Exécute le binaire au chemin , en passant arg s. Renvoie l'état de sortie du programme.
set_progress( frac )
Définit la position de la show_progress() de progression dans le bloc défini par l'appel le plus récent à show_progress() . frac doit être compris entre [0.0, 1.0]. Le compteur de progression ne recule jamais; les tentatives pour y parvenir 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 de l'objet blob (sous forme de 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 si elle n'est égale à aucun d'entre eux.
show_progress( frac , secs )
Avance la jauge de progression sur la fraction suivante de sa longueur sur les secondes secondes (doit être un entier). secs peut être égal à 0, auquel cas le compteur n'est pas avancé automatiquement mais en utilisant la fonction set_progress() définie ci-dessus.
sleep( secs )
Dort pendant secondes secondes (doit être un entier).
stdout( expr [, expr , ...])
Évalue chaque expression et vide sa valeur dans stdout. Utile pour le débogage.
tune2fs( device [, arg , …])
Ajuste les paramètres réglables args sur l' appareil .
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 de texte).
unmount( mount_point )
Démonte le système de fichiers monté à mount_point .
wipe_block_device( block_dev , len )
Efface les len octets du périphérique bloc block_dev donné .
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 dans 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.