Le système compile le binaire de mise à jour à partir de bootable/recovery/updater
et l'utilise
dans un package OTA.
ota_update.zip
,
incremental_ota_update.zip
) contenant le binaire exécutable
META-INF/com/google/android/update-binary
Le programme de mise à jour contient plusieurs fonctions intégrées et un interpréteur pour un script extensible
(edify) compatible avec les commandes utilisées pour les tâches courantes liées aux mises à jour. Apparence de l'outil de mise à jour
dans le fichier .zip du package pour un script dans le fichier
META-INF/com/google/android/updater-script
Remarque:Il n'est pas courant d'utiliser le script edify et/ou les fonctions intégrées. mais peut être utile si vous devez déboguer le fichier de mise à jour.
Syntaxe Edify
Un script edify est une expression unique dans laquelle toutes les valeurs sont des chaînes. Les chaînes vides sont false dans un contexte booléen et toutes les autres chaînes sont true. Edify est compatible avec 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 a-z, A-Z, 0-9, _, :, /, . qui n'est pas un mot réservé est est considéré comme un littéral de chaîne. (Les mots réservés sont if else, puis endif.) Chaîne les littéraux peuvent également apparaître entre guillemets doubles ; voici comment créer des valeurs avec des espaces blancs d'autres caractères qui ne figurent pas dans le jeu ci-dessus. \n, \t, \" et \\ servent d'échappements entre guillemets chaînes, tout comme \x##.
La fonction && et || sont en court-circuitage, le côté droit n'est pas évalué si le le résultat logique est déterminé par la partie gauche. Les éléments suivants sont équivalents:
e1 && e2 if e1 then e2 endif
Les balises ; est un point de séquence ; il s'agit d'évaluer d'abord le côté gauche, puis le sur le côté droit. Sa valeur correspond à celle de l'expression de droite. Un point-virgule peut également apparaître après une expression, l'effet simule donc 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 pouvant être exécutées par des scripts.
(À proprement parler, il s'agit de macros plutôt que de fonctions au sens Lisp,
puisqu'ils n'ont pas besoin d'évaluer tous leurs arguments.) Sauf indication contraire, les fonctions renvoient
true en cas de réussite et false en cas d'erreur. Si vous souhaitez que les erreurs annulent l'exécution de la
utilisez les fonctions abort()
et/ou assert()
. L'ensemble des
les fonctions disponibles dans l'outil de mise à jour peuvent également être étendues pour fournir
fonctionnalités spécifiques à l'appareil.
abort([msg])
- Annule immédiatement l'exécution du script, avec le paramètre msg facultatif. Si l'utilisateur a activé l'affichage du texte, msg apparaît dans le journal de récupération et à l'écran.
-
assert(expr[, expr, ...])
- Évalue chaque expr l'un après l'autre. Si la valeur est "false", annule immédiatement l'exécution avec la message "assert failed" (échec de la revendication) 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 fichier src_file pour produire le fichier tgt_file. Si le
la cible souhaitée est la même que la source, transmettez "-" ; pour tgt_file . tgt_sha1 et
tgt_size correspondent au hachage SHA1 final attendu et à la taille du fichier cible. Le reste
doivent être fournis par paires: 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 possède l'algorithme SHA1 donné.
L'application des correctifs se fait en toute sécurité, avec la garantie que le fichier cible le hachage et la taille SHA1 souhaités, ou s'ils sont intacts, ils ne seront pas laissés dans un état intermédiaire. Si le processus est interrompu pendant l'application des correctifs, le fichier cible peut être dans un état intermédiaire ; la partition du cache contient déjà une copie. Vous devez donc redémarrer la mise à jour. peut mettre à jour le fichier.
Une syntaxe spéciale est compatible pour traiter le contenu du dispositif de technologie de mémoire (MTD) des partitions sous forme de fichiers, ce qui permet de corriger des partitions brutes comme le démarrage. Pour lire un MTD la partition, vous devez connaître la quantité de données que vous souhaitez lire, car la partition n'a pas une notion de fin de fichier. Vous pouvez utiliser la chaîne "MTD:partition:size_1:sha1_1:size_2: sha1_2" en tant que nom de fichier pour lire la partition donnée. Vous devez spécifier au moins un élément (size, sha-1) ; vous pouvez en spécifier plusieurs s'il existe plusieurs des possibilités pour ce que vous espérez lire.
-
apply_patch_check(filename, sha1[, sha1, ...])
-
Renvoie la valeur "true" si le contenu de filename ou la copie temporaire dans la partition de cache
(si elles sont présentes) ont 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 sens qu'il vérifier la copie de la partition du cache, afin queapply_patch_check()
réussisse même si le fichier a été corrompu par unapply_patch() update
interrompu. apply_patch_space(bytes)
- Renvoie "true" si au moins octets d'espace de travail est disponible pour l'application du binaire des correctifs.
-
concat(expr[, expr, ...])
- Évalue chaque expression et les concatène. Pour cela, l'opérateur + est un sucre syntaxique. fonction dans le cas particulier de deux arguments (mais la forme de la fonction peut prendre n'importe quel nombre expressions). Les expressions doivent être des chaînes. ne peut pas concaténer des objets blob.
-
file_getprop(filename, key)
-
Lit le nom de fichier donné et l'interprète comme un fichier de propriétés (par exemple,
/system/build.prop
) et renvoie la valeur d'une clé donnée, ou la chaîne vide si key n'est pas présent. -
format(fs_type, partition_type, location, fs_size, mount_point)
-
Reformate une partition donnée. Types de partitions compatibles:
<ph type="x-smartling-placeholder">
- </ph>
- fs_type="yaffs2" et partition_type="MTD". L'emplacement doit être le nom du MTD partition; un système de fichiers yaffs2 vide y est construit. Les arguments restants sont non utilisé.
- fs_type="ext4" et partition_type="EMMC". L'emplacement doit correspondre au fichier de l'appareil partition. Un système de fichiers ext4 vide y est construit. Si fs_size est égal à zéro, système de fichiers occupe la totalité de la partition. Si fs_size est un nombre positif, le 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 à l'exception des derniers |fs_size| octets du partition.
- fs_type="f2fs" et partition_type="EMMC". L'emplacement doit correspondre au fichier de l'appareil partition. fs_size doit être un nombre non négatif. Si fs_size est égal à zéro, système de fichiers occupe la totalité de la partition. Si fs_size est un nombre positif, le le système de fichiers prend les premiers octets fs_size de la partition.
- "mount_point" doit être le futur point d'installation 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 identiques à celles du système principal. Cette fonction renvoie la valeur dans "recovery".
-
greater_than_int(a, b)
- Renvoie "true" si et seulement si (iff) a (interprété comme un entier) est supérieur à b (interprété comme un entier).
-
ifelse(cond, e1[, e2])
- Prend la valeur cond, et si elle est vraie, évalue et renvoie la valeur de e1, Sinon, elle évalue et renvoie e2 (le cas échéant). L'instruction "if ... else ... then ... endif est simplement du sucre syntaxique pour cette fonction.
is_mounted(mount_point)
- Renvoie la valeur "true" si un système de fichiers est installé à mount_point.
-
is_substring(needle, haystack)
- Renvoie la valeur "true" si needle est une sous-chaîne de haystack.
-
less_than_int(a, b)
- Renvoie "true" si a (interprété comme un entier) est inférieur à b (interprété comme (nombre entier).
-
mount(fs_type, partition_type, name, mount_point)
-
Installe un système de fichiers de fs_type sur mount_point. partition_type doit être
au choix:
<ph type="x-smartling-placeholder">
- </ph>
-
début du mois à ce jour. "name" est le nom d'une partition MTD (par exemple, system, userdata ; voir
/proc/mtd
sur l'appareil pour obtenir la liste complète). - EMMC.
La restauration n'installe aucun système de fichiers par défaut (à l'exception de la carte SD si l'utilisateur est installer manuellement un paquet à partir de la carte SD) ; votre script doit installer des partitions qu'il doit modifier.
-
début du mois à ce jour. "name" est le nom d'une partition MTD (par exemple, system, userdata ; voir
-
package_extract_dir(package_dir, dest_dir)
- Cette opération extrait tous les fichiers du package sous package_dir et les écrit dans le l'arborescence correspondante sous dest_dir. Tous les fichiers existants sont écrasés.
-
package_extract_file(package_file[, dest_file])
- Extrait un seul fichier package_file du package de mise à jour et l'écrit dans dest_file, en écrasant les fichiers existants si nécessaire. En l'absence de L'argument dest_file, qui renvoie le contenu du fichier du package sous forme de blob binaire.
read_file(filename)
- Lecture du 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 transmettant des arg. Renvoie l'état de sortie du programme.
set_progress(frac)
-
Définit la position de l'indicateur de progression dans le bloc défini par le segment le plus récent.
Appel
show_progress()
. frac doit être compris dans la plage [0,0, 1,0]. La progression le compteur ne recule jamais, les tentatives visant à le faire sont ignorées. -
sha1_check(blob[, sha1])
-
L'argument blob est un blob du type renvoyé par
read_file()
ou par forme à un argument depackage_extract_file()
. Sans argument sha1, cette fonction renvoie le hachage SHA1 du blob (sous forme de chaîne hexadécimale de 40 chiffres). Avec un ou plusieurs sha1, cette fonction renvoie le hachage SHA1 si celui-ci est égal à l'un des ou la chaîne vide si elle n'est égale à aucun d'entre eux. -
show_progress(frac, secs)
-
Fait avancer l'indicateur de progression sur la frac suivante de sa longueur sur les
sec secondes (doit être un nombre entier). secs peut être égal à 0, auquel cas l'indicateur est
Pas avancé automatiquement, mais à l'aide de la fonction
set_progress()
définie ci-dessus. sleep(secs)
- Mise en veille pendant secondes secondes (doit être un nombre entier).
-
stdout(expr[, expr, ...])
- Évalue chaque expression et transmet sa valeur à stdout. Utile pour le débogage.
-
tune2fs(device[, arg, …])
- Ajuste les paramètres réglables args sur device.
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ésinstalle le système de fichiers installé à l'emplacement mount_point.
-
wipe_block_device(block_dev, len)
- Efface les octets len de l'appareil de stockage en mode bloc block_dev.
wipe_cache()
- Entraîne l'effacement de la partition du 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 désignant un fichier local ou un argument utilisant la valeur d'un 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. les données ont dû d'abord être décompressées dans un fichier local temporaire.