Das System erstellt die Updater-Binärdatei aus bootable/recovery/updater
und verwendet sie
in einem OTA-Paket.
ota_update.zip
,
incremental_ota_update.zip
) mit der ausführbaren Binärdatei
META-INF/com/google/android/update-binary
Der Updater enthält mehrere integrierte Funktionen und einen Interpreter für erweiterbare Skripts.
Sprache (edify), die Befehle für typische Updateaufgaben unterstützt. Updater-Looks
in der ZIP-Datei für ein Skript in der Datei
META-INF/com/google/android/updater-script
Hinweis:Es ist nicht üblich, das edify-Skript und/oder die integrierten Funktionen zu verwenden. Aktivität, aber kann hilfreich sein, wenn Sie Fehler in der Update-Datei beheben müssen.
Edify-Syntax
Ein Edify-Skript ist ein einzelner Ausdruck, in dem alle Werte Strings sind. Leere Strings false in einem booleschen Kontext und alle anderen Strings sind true. Edify unterstützt die folgenden Operatoren (mit der üblichen Bedeutung):
(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
Beliebige Zeichenfolge der Zeichen a–z, A–Z, 0–9, _, :, /, . das kein reserviertes Wort ist, String-Literal betrachtet. Reservierte Wörter sind if else und dann endif. Zeichenfolge Literale können auch in doppelten Anführungszeichen stehen. So erstellen Sie Werte mit Leerzeichen und Zeichen, die nicht im obigen Zeichensatz enthalten sind. \n, \t, \" und \\ dienen als Escapezeichen innerhalb von Anführungszeichen Zeichenfolgen, genau wie \x##.
Das && und || Kurzschlussauslöser. die rechte Seite nicht ausgewertet, Das logische Ergebnis wird von der linken Seite bestimmt. Folgendes ist äquivalent:
e1 && e2 if e1 then e2 endif
Das ; ist ein Sequenzpunkt. zuerst die linke Seite und dann die auf der rechten Seite. Sein Wert ist der Wert des Ausdrucks auf der rechten Seite. Ein Semikolon kann auch nach einem Ausdruck hinzu, sodass der Effekt C-Stil-Anweisungen simuliert:
prepare(); do_other_thing("argument"); finish_up();
Integrierte Funktionen
Die meisten Updatefunktionen sind in den Funktionen enthalten, die von Skripts ausgeführt werden können.
(Genau genommen handelt es sich hierbei um Makros und nicht um Funktionen im Lisp-Sinn,
da sie nicht alle Argumente prüfen müssen.) Sofern nicht anders angegeben, geben Funktionen
true bei Erfolg und false bei Fehler. Wenn Sie möchten, dass Fehler die Ausführung des
die Funktionen abort()
und/oder assert()
verwenden. Die Gruppe der
im Updater verfügbare Funktionen können auch erweitert werden, um
gerätespezifische Funktionen zu nutzen.
abort([msg])
- bricht die Ausführung des Skripts sofort mit der optionalen msg-Funktion ab. Wenn der Nutzer aktivierter Textanzeige erscheint msg im Wiederherstellungsprotokoll und auf dem Bildschirm.
-
assert(expr[, expr, ...])
- Wertet jeden expr der Reihe nach aus. Wenn einer der Werte „false“ ist, wird die Ausführung sofort mit dem Parameter Nachricht „Assertion fehlgeschlagen“ und den Quelltext des fehlgeschlagenen Ausdrucks.
-
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
-
Wendet einen Binärpatch auf src_file an, um tgt_file zu erzeugen. Wenn die
gewünschtes Ziel mit der Quelle identisch ist, übergeben Sie "-" für tgt_file . tgt_sha1 und
tgt_size sind der erwartete endgültige SHA1-Hash-Wert und die Größe der Zieldatei. Die verbleibenden
Argumente müssen paarweise vorliegen: ein SHA1-Hash-Wert (ein 40-stelliger hexadezimaler String) und ein Blob. Blob
ist der Patch, der angewendet wird, wenn der aktuelle Inhalt der Quelldatei das angegebene SHA1 aufweist.
Das Patchen erfolgt auf sichere Weise, sodass sichergestellt ist, dass die Zieldatei entweder die gewünschte SHA1-Hash-Größe und -Größe oder sie ist unberührt. in den Zwischenzustand ein. Wenn der Prozess während des Patchvorgangs unterbrochen wird, ist die Zieldatei möglicherweise sich in einem Zwischenzustand befinden; Da in der Cache-Partition eine Kopie vorhanden ist, müssen Sie das Update neu starten. die Datei aktualisieren kann.
Es wird eine spezielle Syntax unterstützt, um den Inhalt des Memory Technology Device (MTD) zu verarbeiten als Dateien, was das Patchen von Rohpartitionen wie Booten ermöglicht. So lesen Sie einen MTD eine Partition erstellen, müssen Sie wissen, wie viele Daten Sie lesen möchten, da die Partition ein End-of-File-Konzept. Sie können den String „MTD:partition:size_1:sha1_1:size_2: sha1_2“ als filename, um die angegebene Partition zu lesen. Es muss mindestens ein Wert angegeben werden (size, sha-1)-Paar; können Sie auch mehrere angeben, wenn mehrere für das, was Sie lesen möchten.
-
apply_patch_check(filename, sha1[, sha1, ...])
-
Gibt "true" zurück, wenn der Inhalt von filename oder die temporäre Kopie in der Cache-Partition
(sofern vorhanden) eine SHA1-Prüfsumme haben, die einem der angegebenen sha1-Werte entspricht.
sha1-Werte werden als 40 Hexadezimalziffern angegeben. Diese Funktion unterscheidet sich von
sha1_check(read_file(filename), sha1 [, ...])
, da sie weiß, prüfen Sie die Cache-Partitionskopie, damitapply_patch_check()
auch dann erfolgreich ist, wenn der Datei wurde durch eine unterbrocheneapply_patch() update
beschädigt. apply_patch_space(bytes)
- Gibt "true" zurück, wenn mindestens bytes an temporärer Speicherkapazität zum Anwenden von Binärprogrammen verfügbar sind Patches.
-
concat(expr[, expr, ...])
- Wertet jeden Ausdruck aus und verkettet sie. Der +-Operator steht für syntaktischen Zucker für den Sonderfall zweier Argumente (die Funktion kann jedoch eine beliebige Anzahl von Argumenten für Ausdrücke). Die Ausdrücke müssen Zeichenfolgen sein. keine Blobs verketten können.
-
file_getprop(filename, key)
-
Liest den angegebenen filename, interpretiert ihn als Attributdatei (z.B.
/system/build.prop
) und gibt den Wert des angegebenen key oder den Leerer String, wenn key nicht vorhanden ist. -
format(fs_type, partition_type, location, fs_size, mount_point)
-
Formatiert eine bestimmte Partition neu. Unterstützte Partitionstypen:
<ph type="x-smartling-placeholder">
- </ph>
- fs_type="yaffs2" und partition_type="MTD". Der Standort muss der Name des MTD sein Partition; wird dort ein leeres yaffs2-Dateisystem erstellt. Verbleibende Argumente sind nicht verwendet werden.
- fs_type="ext4" und partition_type="EMMC". Der Speicherort muss die Gerätedatei für die -Partition an. Dort wird ein leeres ext4-Dateisystem erstellt. Wenn fs_size null ist, gibt der Parameter die gesamte Partition einnimmt. Wenn fs_size eine positive Zahl ist, gibt der Wert Das Dateisystem übernimmt die ersten fs_size Byte der Partition. Wenn fs_size ein negative Zahl verwendet, nimmt das Dateisystem alle Byte mit Ausnahme der letzten |fs_size| Byte -Partition an.
- fs_type="f2fs" und partition_type="EMMC". Der Speicherort muss die Gerätedatei für die -Partition an. fs_size muss eine nicht negative Zahl sein. Wenn fs_size null ist, gibt der Parameter die gesamte Partition einnimmt. Wenn fs_size eine positive Zahl ist, gibt der Wert Das Dateisystem übernimmt die ersten fs_size Byte der Partition.
- „mount_point“ sollte der zukünftige Bereitstellungspunkt für das Dateisystem sein.
getprop(key)
- Gibt den Wert der Systemeigenschaft key zurück (oder den leeren String, wenn er nicht definiert ist). Die von der Wiederherstellungspartition definierten Systemattributwerte sind nicht unbedingt dieselben wie die des Hauptsystems. Diese Funktion gibt den Wert bei der Wiederherstellung zurück.
-
greater_than_int(a, b)
- Gibt "true" zurück, wenn und nur wenn (wenn) a (als Ganzzahl interpretiert) größer als b (als Ganzzahl interpretiert).
-
ifelse(cond, e1[, e2])
- Wertet cond aus. Wenn der Wert wahr ist, wird der Wert von e1 ausgewertet und zurückgegeben, Andernfalls wird e2 ausgewertet und zurückgegeben (falls vorhanden). Die Antwort "if ... else ... then ..." endif" ist syntaktischer Zucker für diese Funktion.
is_mounted(mount_point)
- Gibt "true" zurück, wenn unter mount_point ein Dateisystem bereitgestellt ist.
-
is_substring(needle, haystack)
- Gibt "true" zurück, wenn needle ein Teilstring von haystack ist.
-
less_than_int(a, b)
- Gibt "true" zurück, wenn a (als Ganzzahl interpretiert) kleiner als b ist (interpretiert als eine Ganzzahl).
-
mount(fs_type, partition_type, name, mount_point)
-
Stellt ein Dateisystem von fs_type unter mount_point bereit. partition_type muss
eine der folgenden Optionen:
<ph type="x-smartling-placeholder">
- </ph>
-
MTD: Name ist der Name einer MTD-Partition (z.B. system, userdata; siehe
/proc/mtd
auf dem Gerät, um eine vollständige Liste zu erhalten. - EMMC:
Bei der Wiederherstellung werden standardmäßig keine Dateisysteme bereitgestellt (mit Ausnahme der SD-Karte, wenn der Nutzer Manuelle Installation eines Pakets von der SD-Karte) muss Ihr Skript die er ändern muss.
-
MTD: Name ist der Name einer MTD-Partition (z.B. system, userdata; siehe
-
package_extract_dir(package_dir, dest_dir)
- Extrahiert alle Dateien aus dem Paket unterhalb von package_dir und schreibt sie in den entsprechende Baumstruktur unter dest_dir. Alle vorhandenen Dateien werden überschrieben.
-
package_extract_file(package_file[, dest_file])
- Extrahiert eine einzelne package_file-Datei aus dem Update-Paket und schreibt sie in dest_file, wobei vorhandene Dateien überschrieben werden, falls erforderlich. Ohne die Argument dest_file gibt den Inhalt der Paketdatei als binäres Blob zurück.
read_file(filename)
- Liest filename und gibt seinen Inhalt als binäres Blob zurück.
-
run_program(path[, arg, ...])
- Führt die Binärdatei unter path aus und übergibt args. Gibt den Ausstiegsstatus des Programms zurück.
set_progress(frac)
-
Legt die Position der Fortschrittsanzeige innerhalb des Blocks fest, der durch den letzten
Anruf in
show_progress()
. frac muss im Bereich [0.0, 1.0] liegen. Der Fortschritt Das Messgerät bewegt sich nicht rückwärts. werden dagegen ignoriert. -
sha1_check(blob[, sha1])
-
Das blob-Argument ist ein Blob des Typs, der von
read_file()
oder dem Form mit einem Argument vonpackage_extract_file()
. Ohne sha1-Argumente Diese Funktion gibt den SHA1-Hash des Blobs als 40-stelliger hexadezimaler String zurück. Mit mindestens einem sha1 verwendet, gibt diese Funktion den SHA1-Hash zurück, wenn er einem der oder den leeren String, falls er keinem dieser Argumente entspricht. -
show_progress(frac, secs)
-
Überträgt die Fortschrittsanzeige für den nächsten Teil ihrer Länge im
secs Sekunden (muss eine Ganzzahl sein). secs kann 0 sein; in diesem Fall ist das Messgerät
nicht automatisch erweitert, sondern mithilfe der definierten Funktion
set_progress()
oben. sleep(secs)
- Schlafdauer für secs Sekunden (muss eine Ganzzahl sein).
-
stdout(expr[, expr, ...])
- Wertt jeden Ausdruck aus und gibt seinen Wert an stdout aus. Nützlich für die Fehlerbehebung.
-
tune2fs(device[, arg, …])
- Passt abstimmbare Parameter args auf device an.
ui_print([text, ...])
- Verkettet alle text-Argumente und gibt das Ergebnis auf der Benutzeroberfläche aus, wo es sichtbar ist, wenn der Nutzer die Textanzeige aktiviert hat.
unmount(mount_point)
- Trennt die Bereitstellung des Dateisystems, das unter mount_point bereitgestellt wurde.
-
wipe_block_device(block_dev, len)
- Löscht die len Byte des angegebenen Blockgeräts block_dev.
wipe_cache()
- Die Cachepartition wird am Ende einer erfolgreichen Installation gelöscht.
-
write_raw_image(filename_or_blob, partition)
-
Schreibt das Image in filename_or_blob in die MTD-Partition.
filename_or_blob kann ein String zur Benennung einer lokalen Datei oder ein Argument mit einem Blob-Wert sein.
das die zu schreibenden Daten enthält. Um eine Datei aus dem OTA-Paket in eine Partition zu kopieren, verwende Folgendes:
write_raw_image(package_extract_file("zip_filename"), "partition_name");
Hinweis: Vor Android 4.1 wurden nur Dateinamen akzeptiert. mussten die Daten zuerst in eine temporäre lokale Datei entpackt werden.