All'interno dei pacchetti OTA

Il sistema crea il programma binario del programma di aggiornamento da bootable/recovery/updater e lo utilizza in un pacchetto OTA.

Il pacchetto stesso è un file ZIP (ota_update.zip, incremental_ota_update.zip) che contiene il file binario eseguibile META-INF/com/google/android/update-binary .

Il programma di aggiornamento contiene diverse funzioni integrate e un interprete per uno scripting estensibile (edify) che supporta i comandi per le tipiche attività legate agli aggiornamenti. Stili di aggiornamento nel file .zip del pacchetto per uno script nel file META-INF/com/google/android/updater-script.

Nota: l'uso dello script edify e/o delle funzioni integrate non è una pratica comune attività, ma può essere utile se devi eseguire il debug del file di aggiornamento.

Sintassi Edify

Uno script edify è una singola espressione in cui tutti i valori sono stringhe. Le stringhe vuote vengono false in un contesto booleano e tutte le altre stringhe sono true. Edify supporta i seguenti operatori (con i normali significati):

(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

Qualsiasi stringa con i caratteri a-z, A-Z, 0-9, _, :, /, . che non è una parola riservata è considerata un valore letterale stringa. Le parole riservate sono if else e endif. Stringa i valori letterali possono essere visualizzati anche tra virgolette; Ecco come creare valori con spazi vuoti altri caratteri non compresi nella serie precedente. \n, \t, \" e \\ come caratteri di escape all'interno delle virgolette stringhe, così come \x##.

Il && e || gli operatori sono in cortocircuito; quella a destra non viene valutata il risultato logico è determinato dal lato sinistro. I seguenti valori sono equivalenti:

e1 && e2
if e1 then e2 endif

Il ; l'operatore è un punto di sequenza; significa valutare prima il lato sinistro e poi a destra. Il suo valore è il valore dell'espressione a destra. Può essere visualizzato anche un punto e virgola dopo un'espressione, quindi l'effetto simula istruzioni di stile C:

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

Funzioni integrate

La maggior parte delle funzionalità di aggiornamento è contenuta nelle funzioni disponibili per l'esecuzione dagli script. (a rigor di termini, queste sono macro anziché funzioni nel senso di Lisp, poiché non devono valutare tutti gli argomenti.) Se non diversamente indicato, le funzioni restituiscono true in caso di esito positivo e false in caso di errore. Se desideri che gli errori interrompano l'esecuzione del utilizzare le funzioni abort() e/o assert(). L'insieme le funzioni disponibili in Updater possono essere estese funzionalità specifiche del dispositivo.

abort([msg])
Interrompi immediatamente l'esecuzione dello script, con il msg facoltativo. Se l'utente ha Se la visualizzazione del testo è attiva, nel log di recupero e sullo schermo viene visualizzato messaggio.
assert(expr[, expr, ...])
Valuta ogni expr a rotazione. Se c'è un valore false, interrompe immediatamente l'esecuzione con il comando messaggio "errore di conferma" e il testo di origine dell'espressione con errori.
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
Applica una patch binaria al file src_file per produrre il file tgt_file. Se il target desiderato è uguale all'origine, passa "-" per tgt_file . tgt_sha1 e tgt_size corrisponde all'hash SHA1 finale previsto e alle dimensioni del file di destinazione. I restanti Gli argomenti devono essere forniti in coppie: un hash SHA1 (una stringa esadecimale di 40 caratteri) e un blob. Il blob è la patch da applicare quando i contenuti attuali del file di origine hanno l'algoritmo SHA1 specificato.

L'applicazione delle patch viene eseguita in modo sicuro per garantire che il file di destinazione abbia l'hash SHA1 desiderato e la dimensione desiderata oppure il valore non viene toccato stato intermedio. Se il processo viene interrotto durante l'applicazione di patch, il file di destinazione potrebbe essere in uno stato intermedio; una copia è presente nella partizione della cache, quindi l'aggiornamento viene riavviato può aggiornare correttamente il file.

È supportata una sintassi speciale per trattare i contenuti di Memory Technology Device (MTD) come file, consentendo l'applicazione di patch a partizioni non elaborate come l'avvio. Per leggere un MTD devi sapere quanti dati vuoi leggere, dato che la partizione non ha un concetto alla fine del file. Puoi usare la stringa "MTD:partition:size_1:sha1_1:size_2: sha1_2" come nome file per leggere la partizione specificata. Devi specificarne almeno uno coppia (size, sha-1); puoi specificarne più di uno se sono presenti possibili per ciò che ti aspetti di leggere.

apply_patch_check(filename, sha1[, sha1, ...])
Restituisce true se il contenuto di filename o la copia temporanea nella partizione cache (se presenti) hanno un checksum SHA1 uguale a uno dei valori sha1 specificati. I valori sha1 sono specificati come 40 cifre esadecimali. Questa funzione è diversa da sha1_check(read_file(filename), sha1 [, ...]) in quanto sa di controlla la copia della partizione cache, in modo che apply_patch_check() abbia esito positivo anche se file è stato danneggiato da un file apply_patch() update interrotto.
apply_patch_space(bytes)
Restituisce true se sono disponibili almeno byte di spazio temporaneo per l'applicazione patch.
concat(expr[, expr, ...])
Valuta ogni espressione e le concatena. L'operatore + è lo zucchero sintattico per questo funzione nel caso speciale di due argomenti (ma la forma della funzione può prendere qualsiasi numero di ). Le espressioni devono essere stringhe; non può concatenare i BLOB.
file_getprop(filename, key)
Legge il filename specificato e lo interpreta come un file delle proprietà (ad es. /system/build.prop) e restituisce il valore della chiave specificata, o stringa vuota se non è presente la chiave.
format(fs_type, partition_type, location, fs_size, mount_point)
Riformatta una determinata partizione. Tipi di partizioni supportati:
  • fs_type="yaffs2" e partition_type="MTD". La località deve essere il nome dell'MTD partizione; viene creato un file system yaffs2 vuoto. Gli argomenti rimanenti sono inutilizzati.
  • fs_type="ext4" e partition_type="EMMC". La posizione deve essere il file del dispositivo per della partizione di testo. Qui viene costruito un file system ext4 vuoto. Se fs_size è zero, il valore che occupa l'intera partizione. Se fs_size è un numero positivo, il valore il file system prende i primi fs_size byte della partizione. Se fs_size è un valore numero negativo, il file system prende tutti i byte tranne gli ultimi |fs_size| del della partizione di testo.
  • fs_type="f2fs" e partition_type="EMMC". La posizione deve essere il file del dispositivo per della partizione di testo. fs_size deve essere un numero non negativo. Se fs_size è zero, il valore che occupa l'intera partizione. Se fs_size è un numero positivo, il valore il file system prende i primi fs_size byte della partizione.
  • mount_point dovrebbe essere il futuro punto di montaggio per il file system.
getprop(key)
Restituisce il valore della proprietà di sistema key (o la stringa vuota, se non è definita). I valori della proprietà di sistema definiti dalla partizione di ripristino non sono necessariamente gli stessi quelle del sistema principale. Questa funzione restituisce il valore in recupero.
greater_than_int(a, b)
Restituisce true se e solo se (iff) a (interpretato come un numero intero) è maggiore di b (interpretato come un numero intero).
ifelse(cond, e1[, e2])
Valuta cond e, se è true, restituisce il valore e1, altrimenti valuta e restituisce e2 (se presente). La funzione "se ... altrimenti ... allora ... endif" è solo lo zucchero sintattico per questa funzione.
is_mounted(mount_point)
Restituisci true se il file system è montato in mount_point.
is_substring(needle, haystack)
restituisce true iff needle una sottostringa di haystack.
less_than_int(a, b)
Restituisce un valore true se a (interpretato come un numero intero) è minore di b (interpretato come un numero intero).
mount(fs_type, partition_type, name, mount_point)
Monta un file system fs_type in mount_point. partition_type deve essere uno dei seguenti:
  • da inizio mese. "Name" indica il nome di una partizione MTD (ad es. system, userdata; consultare /proc/mtd sul dispositivo per un elenco completo).
  • EMMC.

Il ripristino non monta alcun file system per impostazione predefinita (ad eccezione della scheda SD se l'utente è l'installazione manuale di un pacchetto dalla scheda SD); lo script deve montare e le partizioni da modificare.

package_extract_dir(package_dir, dest_dir)
Estrae tutti i file dal pacchetto sotto package_dir e li scrive nella albero corrispondente sotto dest_dir. Tutti i file esistenti vengono sovrascritti.
package_extract_file(package_file[, dest_file])
Estrae un singolo package_file dal pacchetto di aggiornamento e lo scrive nel dest_file, sovrascrivendo i file esistenti se necessario. Senza il parametro dest_file, restituisce il contenuto del file del pacchetto come blob binario.
read_file(filename)
Legge filename e restituisce i contenuti come blob binario.
run_program(path[, arg, ...])
Esegue il programma binario in path, passando arg. Restituisce lo stato di uscita del programma.
set_progress(frac)
Imposta la posizione dell'indicatore di avanzamento all'interno del blocco definito dall' Chiamata show_progress(). frac deve essere compreso nell'intervallo [0,0, 1,0]. I progressi il metro non si sposta mai indietro; per far sì che lo facciano vengono ignorati.
sha1_check(blob[, sha1])
L'argomento blob è un blob del tipo restituito da read_file() o forma a un argomento di package_extract_file() . Senza argomenti sha1, questa funzione restituisce l'hash SHA1 del blob (come stringa esadecimale a 40 cifre). Con uno o più sha1, questa funzione restituisce l'hash SHA1 se è uguale a uno dei argomenti o la stringa vuota se non corrisponde ad alcuno di essi.
show_progress(frac, secs)
Fa avanzare l'indicatore di avanzamento sul frac successivo della sua lunghezza sulla secs secondi (deve essere un numero intero). secs può essere 0. In questo caso lo strumento è non avanzano automaticamente, ma tramite la funzione set_progress() definita in alto.
sleep(secs)
Sonno per sec secondi (deve essere un numero intero).
stdout(expr[, expr, ...])
Valuta ogni espressione e ne scarica il valore su stdout. Utile per il debug.
tune2fs(device[, arg, …])
Regola gli arg dei parametri regolabili sul device.
ui_print([text, ...])
Concatena tutti gli argomenti text e stampa il risultato nella UI (dove verrà visibile se l'utente ha attivato la visualizzazione del testo).
unmount(mount_point)
Smonta il file system montato in mount_point.
wipe_block_device(block_dev, len)
Cancella i dati len byte del dispositivo a blocchi block_dev specificato.
wipe_cache()
La cancellazione della partizione della cache comporta la cancellazione al termine di un'installazione riuscita.
write_raw_image(filename_or_blob, partition)
Scrive l'immagine in filename_or_blob nella partizione MTD. filename_or_blob può essere una stringa che denomina un file locale o un argomento con valore blob contenente i dati da scrivere. Per copiare un file dal pacchetto OTA su una partizione, utilizza: write_raw_image(package_extract_file("zip_filename"), "partition_name");
.

Nota: prima di Android 4.1, erano accettati solo i nomi file, quindi per svolgere i dati dovevano prima essere decompressi in un file locale temporaneo.