In OTA-Paketen

Das System erstellt die Updater-Binärdatei aus bootable bootable/recovery/updater und verwendet sie in einem OTA-Paket.

Das Paket selbst ist eine ZIP-Datei ( ota_update.zip , incremental_ota_update.zip ), die die ausführbare Binärdatei META-INF/com/google/android/update-binary enthält.

Updater enthält mehrere eingebaute Funktionen und einen Interpreter für eine erweiterbare Skriptsprache ( edify ), die Befehle für typische Update-bezogene Aufgaben unterstützt. Updater sucht in der ZIP-Datei des Pakets nach einem Skript in der Datei META-INF/com/google/android/updater-script .

Hinweis: Die Verwendung des edify-Skripts und/oder der integrierten Funktionen ist keine häufige Aktivität, kann jedoch hilfreich sein, wenn Sie die Update-Datei debuggen müssen.

Edify-Syntax

Ein Edify-Skript ist ein einzelner Ausdruck, in dem alle Werte Zeichenfolgen sind. Leere Strings sind in einem booleschen Kontext falsch und alle anderen Strings sind wahr . Edify unterstützt die folgenden Operatoren (mit den üblichen Bedeutungen):

(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 aus den Zeichen az, AZ, 0-9, _, :, /, . das kein reserviertes Wort ist, wird als Zeichenfolgenliteral betrachtet. (Reservierte Wörter sind if else then endif. ) Zeichenfolgenliterale können auch in doppelten Anführungszeichen stehen; So erstellen Sie Werte mit Leerzeichen und anderen Zeichen, die nicht im obigen Satz enthalten sind. \n, \t, \", und \\ dienen als Escapezeichen innerhalb von Zeichenfolgen in Anführungszeichen, ebenso wie \x ## .

Das && und || Operatoren schließen kurz; die rechte Seite wird nicht ausgewertet, wenn das logische Ergebnis von der linken Seite bestimmt wird. Äquivalent sind:

e1 && e2
if e1 then e2 endif

Das ; Operator ist ein Sequenzpunkt; es bedeutet, zuerst die linke Seite und dann die rechte Seite zu bewerten. Sein Wert ist der Wert des Ausdrucks auf der rechten Seite. Ein Semikolon kann auch nach einem Ausdruck erscheinen, sodass der Effekt Anweisungen im C-Stil simuliert:

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

Eingebaute Funktionen

Die meisten Aktualisierungsfunktionen sind in den Funktionen enthalten, die für die Ausführung durch Skripte verfügbar sind. (Genau genommen handelt es sich eher um Makros als um Funktionen im Sinne von Lisp, da sie nicht alle ihre Argumente auswerten müssen.) Sofern nicht anders angegeben, geben Funktionen bei Erfolg true und bei Fehlern false zurück. Wenn Sie möchten, dass Fehler die Ausführung des Skripts abbrechen, verwenden Sie die Funktionen abort() und/oder assert() . Der im Updater verfügbare Funktionsumfang kann auch um gerätespezifische Funktionalität erweitert werden .

abort([ msg ])
Bricht die Ausführung des Skripts sofort mit dem optionalen msg ab. Wenn der Benutzer die Textanzeige aktiviert hat, wird msg im Wiederherstellungsprotokoll und auf dem Bildschirm angezeigt.
assert( expr [, expr , ...])
Wertet nacheinander jeden Ausdruck aus. Wenn einer falsch ist, wird die Ausführung sofort mit der Meldung "assert failed" und dem Quelltext des fehlgeschlagenen Ausdrucks abgebrochen.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
Wendet einen binären Patch auf die src_file an, um die tgt_file zu erzeugen. Wenn das gewünschte Ziel mit der Quelle identisch ist, übergeben Sie "-" für tgt_file . tgt_sha1 und tgt_size sind der erwartete endgültige SHA1-Hash und die Größe der Zieldatei. Die verbleibenden Argumente müssen paarweise vorliegen: ein SHA1-Hash (eine 40-stellige Hex-Zeichenfolge) und ein Blob. Der Blob ist der Patch, der angewendet wird, wenn der aktuelle Inhalt der Quelldatei den angegebenen SHA1 hat.

Das Patchen erfolgt auf sichere Weise, die garantiert, dass die Zieldatei entweder den gewünschten SHA1-Hash und die gewünschte Größe hat oder unberührt bleibt – sie wird nicht in einem nicht wiederherstellbaren Zwischenzustand verbleiben. Wenn der Prozess während des Patchens unterbrochen wird, befindet sich die Zieldatei möglicherweise in einem Zwischenzustand. In der Cache-Partition ist eine Kopie vorhanden, sodass ein Neustart der Aktualisierung die Datei erfolgreich aktualisieren kann.

Es wird eine spezielle Syntax unterstützt, um den Inhalt von MTD-Partitionen (Memory Technology Device) als Dateien zu behandeln, was das Patchen von Raw-Partitionen wie Booten ermöglicht. Um eine MTD-Partition zu lesen, müssen Sie wissen, wie viele Daten Sie lesen möchten, da die Partition keinen End-of-File-Begriff hat. Sie können den String "MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 " als Dateinamen verwenden, um die angegebene Partition zu lesen. Sie müssen mindestens ein Paar (Größe, sha-1) angeben; Sie können mehr als eine angeben, wenn es mehrere Möglichkeiten für das gibt, was Sie lesen möchten.

apply_patch_check( filename , sha1 [, sha1 , ...])
Gibt wahr zurück, wenn der Inhalt von Dateiname oder der temporären Kopie in der Cache-Partition (falls vorhanden) eine SHA1-Prüfsumme gleich einem der angegebenen sha1- Werte hat. sha1- Werte werden als 40 Hexadezimalziffern angegeben. Diese Funktion unterscheidet sich von sha1_check(read_file( filename ), sha1 [, ...]) darin, dass sie weiß, dass die Kopie der Cache-Partition überprüft werden muss, also wird apply_patch_check() erfolgreich sein, selbst wenn die Datei durch ein unterbrochenes apply_patch() update beschädigt wurde.
apply_patch_space( bytes )
Gibt „true“ zurück, wenn mindestens Byte Arbeitsspeicher zum Anwenden von Binärpatches verfügbar sind.
concat( expr [, expr , ...])
Wertet jeden Ausdruck aus und verkettet sie. Der +-Operator ist syntaktischer Zucker für diese Funktion im Spezialfall von zwei Argumenten (aber die Funktionsform kann eine beliebige Anzahl von Ausdrücken annehmen). Die Ausdrücke müssen Zeichenfolgen sein; es kann keine Blobs verketten.
file_getprop( filename , key )
Liest den angegebenen Dateinamen , interpretiert ihn als Eigenschaftendatei (z. B. /system/build.prop ) und gibt den Wert des angegebenen Schlüssels oder den leeren String zurück, wenn Schlüssel nicht vorhanden ist.
format( fs_type , partition_type , location , fs_size , mount_point )
Formatiert eine bestimmte Partition neu. Unterstützte Partitionstypen:
  • fs_type="yaffs2" und partition_type="MTD". Ort muss der Name der MTD-Partition sein; dort wird ein leeres yaffs2-Dateisystem aufgebaut. Verbleibende Argumente werden nicht verwendet.
  • fs_type="ext4" und partition_type="EMMC". Speicherort muss die Gerätedatei für die Partition sein. Dort wird ein leeres ext4-Dateisystem aufgebaut. Wenn fs_size Null ist, nimmt das Dateisystem die gesamte Partition ein. Wenn fs_size eine positive Zahl ist, nimmt das Dateisystem die ersten fs_size- Bytes der Partition. Wenn fs_size eine negative Zahl ist, nimmt das Dateisystem alles außer der letzten |fs_size| Bytes der Partition.
  • fs_type="f2fs" und partition_type="EMMC". Speicherort muss die Gerätedatei für die Partition sein. fs_size muss eine nicht negative Zahl sein. Wenn fs_size Null ist, nimmt das Dateisystem die gesamte Partition ein. Wenn fs_size eine positive Zahl ist, nimmt das Dateisystem die ersten fs_size- Bytes der Partition.
  • mount_point sollte der zukünftige Einhängepunkt für das Dateisystem sein.
getprop( key )
Gibt den Wert des Systemeigenschaftsschlüssels zurück (oder den leeren String, falls er nicht definiert ist). Die von der Wiederherstellungspartition definierten Systemeigenschaftswerte sind nicht notwendigerweise die gleichen wie die des Hauptsystems. Diese Funktion gibt den Wert in recovery zurück.
greater_than_int( a , b )
Gibt wahr zurück, wenn und nur wenn (iff) a (als Ganzzahl interpretiert) größer als b (als Ganzzahl interpretiert) ist.
ifelse( cond , e1 [, e2 ])
Wertet cond aus, und wenn es wahr ist, wertet es aus und gibt den Wert von e1 zurück, andernfalls wertet es aus und gibt e2 zurück (falls vorhanden). Das Konstrukt "if ... else ... then ... endif" ist nur syntaktischer Zucker für diese Funktion.
is_mounted( mount_point )
Gibt wahr zurück, wenn ein Dateisystem am Einhängepunkt eingehängt ist .
is_substring( needle , haystack )
Gibt true zurück, wenn needle eine Teilzeichenfolge von haystack ist.
less_than_int( a , b )
Gibt wahr zurück, wenn a (als Ganzzahl interpretiert) kleiner als b (als Ganzzahl interpretiert) ist.
mount( fs_type , partition_type , name , mount_point )
Mountet ein Dateisystem von fs_type an mount_point . partition_type muss einer der folgenden sein:
  • MTD . Name ist der Name einer MTD-Partition (z. B. System, Benutzerdaten; siehe /proc/mtd auf dem Gerät für eine vollständige Liste).
  • EMMC.

Die Wiederherstellung hängt standardmäßig keine Dateisysteme ein (außer der SD-Karte, wenn der Benutzer eine manuelle Installation eines Pakets von der SD-Karte durchführt); Ihr Skript muss alle Partitionen mounten, die es ändern muss.

package_extract_dir( package_dir , dest_dir )
Extrahiert alle Dateien aus dem Paket unter Paketverzeichnis und schreibt sie in den entsprechenden Baum unter Zielverzeichnis . Eventuell vorhandene Dateien werden überschrieben.
package_extract_file( package_file [, dest_file ])
Extrahiert eine einzelne Paketdatei aus dem Aktualisierungspaket und schreibt sie in dest_file , wobei vorhandene Dateien bei Bedarf überschrieben werden. Gibt ohne das Argument dest_file den Inhalt der Paketdatei als binäres Blob zurück.
read_file( filename )
Liest den Dateinamen und gibt seinen Inhalt als binären Blob zurück.
run_program( path [, arg , ...])
Führt die Binärdatei bei path aus und übergibt arg s. Gibt den Exit-Status des Programms zurück.
set_progress( frac )
Legt die Position des Fortschrittsmessers innerhalb des Chunks fest, der durch den letzten Aufruf von show_progress() definiert wurde. frac muss im Bereich [0.0, 1.0] liegen. Die Fortschrittsanzeige bewegt sich nie rückwärts; Versuche, dies zu erreichen, werden ignoriert.
sha1_check( blob [, sha1 ])
Das Blob -Argument ist ein Blob des Typs, der von read_file() oder der Ein-Argument-Form von package_extract_file() wird. Ohne sha1- Argumente gibt diese Funktion den SHA1-Hash des Blobs zurück (als 40-stellige Hex-Zeichenfolge). Mit einem oder mehreren sha1- Argumenten gibt diese Funktion den SHA1-Hash zurück, wenn er einem der Argumente entspricht, oder den leeren String, wenn er keinem der Argumente entspricht.
show_progress( frac , secs )
Bewegt die Fortschrittsanzeige um den nächsten Bruchteil ihrer Länge über die Sek . Sekunden (muss eine ganze Zahl sein). secs kann 0 sein, in diesem Fall wird der Zähler nicht automatisch vorgerückt, sondern durch Verwendung der oben definierten Funktion set_progress() .
sleep( secs )
Schläft für Sekunden Sekunden (muss eine ganze Zahl sein).
stdout( expr [, expr , ...])
Wertet jeden Ausdruck aus und gibt seinen Wert an stdout aus. Nützlich zum Debuggen.
tune2fs( device [, arg , …])
Passt abstimmbare Parameter args auf dem Gerät an.
ui_print([ text , ...])
Verkettet alle Textargumente und gibt das Ergebnis auf der Benutzeroberfläche aus (wo es sichtbar ist, wenn der Benutzer die Textanzeige eingeschaltet hat).
unmount( mount_point )
Unmountet das an mount_point gemountete Dateisystem.
wipe_block_device( block_dev , len )
Löscht die len Bytes des angegebenen Blockgeräts block_dev .
wipe_cache()
Bewirkt, dass die Cache-Partition am Ende einer erfolgreichen Installation gelöscht wird.
write_raw_image( filename_or_blob , partition )
Schreibt das Bild in filename_or_blob auf die MTD -Partition . filename_or_blob kann eine Zeichenfolge sein, die eine lokale Datei benennt, oder ein Argument mit Blobwert, das die zu schreibenden Daten enthält. Um eine Datei aus dem OTA-Paket auf eine Partition zu kopieren, verwenden Sie: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Hinweis: Vor Android 4.1 wurden nur Dateinamen akzeptiert, daher mussten die Daten zunächst in eine temporäre lokale Datei entpackt werden.