In OTA-Paketen

Das System erstellt die Updater-Binärdatei aus 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 integrierte 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-Paketdatei nach einem Skript in der Datei META-INF/com/google/android/updater-script .

Hinweis: Die Verwendung des Edify-Skripts und/oder integrierter Funktionen ist keine übliche Aktivität, kann jedoch hilfreich sein, wenn Sie die Aktualisierungsdatei debuggen müssen.

Syntax verbessern

Ein Edify-Skript ist ein einzelner Ausdruck, in dem alle Werte Zeichenfolgen sind. Leere Zeichenfolgen sind in einem booleschen Kontext falsch und alle anderen Zeichenfolgen 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 mit den Zeichen az, AZ, 0-9, _, :, /, . das kein reserviertes Wort ist, wird als Zeichenfolgenliteral betrachtet. (Reservierte Wörter sind if else then endif. ) String-Literale können auch in doppelten Anführungszeichen stehen; So erstellen Sie Werte mit Leerzeichen und anderen Zeichen, die nicht im oben genannten Satz enthalten sind. \n, \t, \", und \\ dienen als Escapezeichen innerhalb von Zeichenfolgen in Anführungszeichen, ebenso wie \x ## .

Das && und || Betreiber schließen kurz; die rechte Seite wird nicht ausgewertet, wenn das logische Ergebnis durch die linke Seite bestimmt wird. Äquivalent sind:

e1 && e2
if e1 then e2 endif

Der ; 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. Nach einem Ausdruck kann auch ein Semikolon stehen, sodass der Effekt Anweisungen im C-Stil simuliert:

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

Integrierte 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 hierbei 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 einem Fehler „ 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 ab, mit der optionalen msg . Wenn der Benutzer die Textanzeige aktiviert hat, erscheint die Nachricht im Wiederherstellungsprotokoll und auf dem Bildschirm.
assert( expr [, expr , ...])
Wertet nacheinander jeden Ausdruck aus. Wenn irgendein Wert falsch ist, wird die Ausführung sofort mit der Meldung „Assert fehlgeschlagen“ 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 erstellen. Wenn das gewünschte Ziel mit der Quelle übereinstimmt, ü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 übrigen Argumente müssen paarweise vorliegen: ein SHA1-Hash (eine 40-stellige Hex-Zeichenfolge) und ein Blob. Der Blob ist der Patch, der angewendet werden soll, 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 SHA1-Größe hat oder unberührt bleibt – sie verbleibt nicht in einem nicht wiederherstellbaren Zwischenzustand. 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 des Updates 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 nicht über eine End-of-File-Funktion verfügt. Sie können die Zeichenfolge „MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 “ als Dateinamen verwenden, um die angegebene Partition zu lesen. Sie müssen mindestens ein (size, sha-1) -Paar 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 „true“ zurück, wenn der Inhalt von Dateiname oder der temporären Kopie in der Cache-Partition (falls vorhanden) eine SHA1-Prüfsumme hat, die einem der angegebenen SHA1- Werte entspricht. SHA1- Werte werden als 40 Hexadezimalstellen angegeben. Diese Funktion unterscheidet sich von sha1_check(read_file( filename ), sha1 [, ...]) darin, dass sie die Cache-Partitionskopie überprüfen muss, sodass apply_patch_check() auch dann erfolgreich ist, wenn die Datei durch ein unterbrochenes apply_patch() update beschädigt wurde.
apply_patch_space( bytes )
Gibt „true“ zurück, wenn mindestens Bytes Arbeitsspeicher zum Anwenden von Binärpatches verfügbar sind.
concat( expr [, expr , ...])
Wertet jeden Ausdruck aus und verkettet ihn. Der +-Operator ist der syntaktische Zucker für diese Funktion im Sonderfall von zwei Argumenten (die Funktionsform kann jedoch eine beliebige Anzahl von Ausdrücken annehmen). Die Ausdrücke müssen Zeichenfolgen sein; Es können keine Blobs verkettet werden.
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 die leere Zeichenfolge zurück, wenn der 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". Der Standort muss der Name der MTD-Partition sein; Dort wird ein leeres yaffs2-Dateisystem erstellt. Die restlichen Argumente werden nicht verwendet.
  • fs_type="ext4" und partition_type="EMMC". Der 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, übernimmt das Dateisystem die ersten fs_size- Bytes der Partition. Wenn fs_size eine negative Zahl ist, akzeptiert das Dateisystem alles außer dem letzten |fs_size| Bytes der Partition.
  • fs_type="f2fs" und partition_type="EMMC". Der 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, übernimmt das Dateisystem die ersten fs_size- Bytes der Partition.
  • mount_point sollte der zukünftige Mountpunkt für das Dateisystem sein.
getprop( key )
Gibt den Wert des Systemeigenschaftsschlüssels zurück (oder die leere Zeichenfolge, wenn sie nicht definiert ist). Die von der Wiederherstellungspartition definierten Systemeigenschaftswerte stimmen nicht unbedingt mit denen des Hauptsystems überein. Diese Funktion gibt den Wert bei der Wiederherstellung zurück.
greater_than_int( a , b )
Gibt genau dann „true“ zurück, wenn (diff.) a (als Ganzzahl interpretiert) größer als b (als Ganzzahl interpretiert) ist.
ifelse( cond , e1 [, e2 ])
Wertet cond aus und wenn es wahr ist, wird der Wert von e1 ausgewertet und zurückgegeben, andernfalls wird e2 ausgewertet und zurückgegeben (falls vorhanden). Das „if ... else ... then ... endif“-Konstrukt ist nur syntaktischer Zucker für diese Funktion.
is_mounted( mount_point )
Gibt true zurück, wenn am mount_point ein Dateisystem gemountet 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 (als Ganzzahl interpretiert) ist.
mount( fs_type , partition_type , name , mount_point )
Mountet ein Dateisystem vom Typ fs_type am mount_point . partition_type muss einer der folgenden sein:
  • MTD . Name ist der Name einer MTD-Partition (z. B. System, Benutzerdaten; eine vollständige Liste finden Sie unter /proc/mtd auf dem Gerät).
  • EMMC.

Bei der Wiederherstellung werden standardmäßig keine Dateisysteme gemountet (mit Ausnahme der SD-Karte, wenn der Benutzer ein Paket manuell von der SD-Karte installiert). Ihr Skript muss alle Partitionen bereitstellen, die geändert werden müssen.

package_extract_dir( package_dir , dest_dir )
Extrahiert alle Dateien aus dem Paket unterhalb von package_dir und schreibt sie in den entsprechenden Baum unter dest_dir . Eventuell vorhandene Dateien werden überschrieben.
package_extract_file( package_file [, dest_file ])
Extrahiert eine einzelne Paketdatei aus dem Update-Paket und schreibt sie in dest_file , wobei vorhandene Dateien bei Bedarf überschrieben werden. Ohne das Argument „dest_file“ wird der Inhalt der Paketdatei als binärer Blob zurückgegeben.
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 unter path aus und übergibt arg s. Gibt den Exit-Status des Programms zurück.
set_progress( frac )
Legt die Position der Fortschrittsanzeige innerhalb des Blocks fest, der durch den letzten show_progress() Aufruf 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 von read_file() zurückgegebenen Typs oder der Ein-Argument-Form von package_extract_file() . Ohne sha1- Argumente gibt diese Funktion den SHA1-Hash des Blobs zurück (als 40-stellige Hexadezimalzeichenfolge). Mit einem oder mehreren sha1- Argumenten gibt diese Funktion den SHA1-Hash zurück, wenn er einem der Argumente entspricht, oder die leere Zeichenfolge, wenn er keinem von ihnen entspricht.
show_progress( frac , secs )
Erhöht den Fortschrittsmesser um das nächste Bruchteil seiner Länge in den Sekunden Sekunden (muss eine ganze Zahl sein). Sekunden können 0 sein. In diesem Fall wird der Zähler nicht automatisch weitergeschaltet, sondern mithilfe der oben definierten Funktion set_progress() .
sleep( secs )
Ruhet für Sekunden Sekunden (muss eine Ganzzahl sein).
stdout( expr [, expr , ...])
Wertet jeden Ausdruck aus und gibt seinen Wert an stdout aus. Nützlich zum Debuggen.
tune2fs( device [, arg , …])
Passt die einstellbaren Parameterargumente 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 aktiviert hat).
unmount( mount_point )
Hebt die Bereitstellung des am mount_point gemounteten Dateisystems auf.
wipe_block_device( block_dev , len )
Löscht die Länge der 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 in die MTD- Partition . filename_or_blob kann eine Zeichenfolge sein, die eine lokale Datei benennt, oder ein Blob-wertiges Argument, 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. Um dies zu erreichen, mussten die Daten zunächst in eine temporäre lokale Datei entpackt werden.