Wewnątrz pakietów OTA

System kompiluje plik binarny aktualizatora ze źródła bootable/recovery/updater i używa go w pakiecie OTA.

Pakiet jest plikiem .zip (ota_update.zip, incremental_ota_update.zip), który zawiera plik binarny wykonywalny META-INF/com/google/android/update-binary

Aktualizator zawiera kilka wbudowanych funkcji i interpreter do rozszerzania obsługi skryptów język (edify), który obsługuje polecenia związane z typowymi zadaniami związanymi z aktualizacją. Style aktualizatora w pliku .zip pakietu dla skryptu w pliku. META-INF/com/google/android/updater-script

Uwaga: używanie skryptu edycji lub funkcji wbudowanych jest rzadkością aktywności, ale może być pomocne, jeśli musisz debugować plik aktualizacji.

Określ składnię

Skrypt edycji to pojedyncze wyrażenie, w którym wszystkie wartości są ciągami znaków. Puste ciągi znaków są false w kontekście wartości logicznych, a pozostałe ciągi mają wartość true (prawda). Edify obsługuje następujące operatory (o zwykłym znaczeniu):

(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

Dowolny ciąg znaków a–z, A–Z, 0–9, _, :, /, . które nie jest zastrzeżonym słowem, uważany za literał ciągu znaków. (zastrzeżone słowa to if other, a następnie endif.) Ciąg znaków literały mogą także występować w cudzysłowach podwójnych; W ten sposób tworzymy wartości z odstępami i odstępami. inne znaki spoza powyższego zestawu. \n, \t, \\ i służą jako znaki zmiany znaczenia w cudzysłowie ciągi tekstowe, tak jak \x##.

Funkcje && i || zwarcia, prawa strona nie jest oceniana, jeśli wynik logiczny jest określany przez lewą stronę. Te elementy są równoważne:

e1 && e2
if e1 then e2 endif

Znak ; jest punktem sekwencyjnym; oznacza analizę najpierw lewej strony, a potem po prawej stronie. Jego wartość jest wartością wyrażenia po prawej stronie. Może się też pojawić średnik. po wyrażeniu, dzięki czemu efekt będzie symulował wyrażenia w stylu C:

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

Wbudowane funkcje

Większość funkcji aktualizacji znajduje się w funkcjach dostępnych do wykonywania przez skrypty. Zasadniczo są to makra, a nie funkcje w kontekście tekstu Lisp. ponieważ nie musi on analizować wszystkich swoich argumentów). O ile nie zaznaczono inaczej, funkcje zwracają true w przypadku powodzenia i false w przypadku błędu. Jeśli chcesz, aby błędy przerywały wykonywanie polecenia skryptu, użyj funkcji abort() lub assert(). Zestaw funkcje dostępne w aktualizatorze można również rozszerzyć, aby zapewnić funkcjach dostępnych na konkretnym urządzeniu.

abort([msg])
Natychmiastowe przerwanie wykonywania skryptu i dodawanie opcjonalnego parametru msg. Jeśli użytkownik ma włączony tekst, wiadomość pojawi się w dzienniku odzyskiwania i na ekranie.
assert(expr[, expr, ...])
Analizuje kolejno każdy element expr. Jeśli parametr ma wartość false (fałsz), natychmiast przerywa wykonanie Komunikat „assert failed” (nie udało się przesłać) oraz tekst źródłowy nieprawidłowego wyrażenia.
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
Stosuje poprawkę binarną do pliku src_file, aby utworzyć plik tgt_file. Jeśli żądane miejsce docelowe jest takie samo jak źródło, przekazujesz „-” dla argumentu tgt_file . tgt_sha1 i tgt_size to oczekiwany ostateczny hasz SHA1 i rozmiar pliku docelowego. Pozostałe argumenty muszą występować w parach: hasz SHA1 (40-znakowy ciąg szesnastkowy) i obiekt blob. Blob to poprawka do zastosowania, gdy bieżąca zawartość pliku źródłowego ma określony SHA1.

Instalowanie poprawek odbywa się w bezpieczny sposób, czyli gwarantuje, że plik docelowy ma odpowiedni hasz i rozmiar SHA1 (lub nie zostanie zmieniony) – nie pozostanie w nieodwracalnym pośrednim. Jeśli proces zostanie przerwany podczas instalowania poprawek, plik docelowy może zostać w stanie pośrednim; Na partycji pamięci podręcznej znajduje się kopia, więc uruchom ponownie aktualizację Plik może zostać zaktualizowany.

Obsługiwana jest specjalna składnia do traktowania zawartości urządzenia Memory Technology Device (MTD) jako pliki, co pozwala na instalowanie poprawek na partycjach nieprzetworzonych, np. podczas rozruchu. Aby odczytać MTD partycjonowanie, musisz wiedzieć, ile danych chcesz odczytać, ponieważ partycja nie zawiera ze spostrzeżeniami na końcu pliku. Aby to zrobić, "MTD:partition:size_1:sha1_1:size_2: sha1_2" jako nazwa pliku, aby odczytać daną partycję. Musisz określić co najmniej jeden (size, sha-1); możesz podać więcej niż jeden, jeśli występuje wiele to, co można przeczytać.

apply_patch_check(filename, sha1[, sha1, ...])
Zwraca wartość „prawda”, jeśli zawartość elementu filename lub tymczasowej kopii na partycji pamięci podręcznej (jeśli występuje) suma kontrolna SHA1 jest równa jednej z podanych wartości sha1. Wartości sha1 są podawane jako 40 cyfr szesnastkowych. Ta funkcja różni się od sha1_check(read_file(filename), sha1 [, ...]), ponieważ wie, że sprawdzić kopię partycji pamięci podręcznej, tak aby operacja apply_patch_check() zadziałała, nawet jeśli został uszkodzony przez przerwę w działaniu apply_patch() update.
apply_patch_space(bytes)
Zwraca wartość „prawda”, jeśli co najmniej bajty wolnego miejsca na dane binarne są dostępne poprawek.
concat(expr[, expr, ...])
Ocenia każde wyrażenie i łączy je. Operator + to cukier składowy w specjalnym przypadku dwóch argumentów (jednak forma funkcji może przyjmować dowolną liczbę ). Wyrażenia muszą być ciągami znaków. nie może łączyć blobów.
file_getprop(filename, key)
Odczytuje podaną nazwę pliku, interpretuje go jako plik właściwości (np. /system/build.prop) i zwraca wartość danego klucza lub funkcji jeśli key nie jest obecny, pusty ciąg znaków.
format(fs_type, partition_type, location, fs_size, mount_point)
Ponownie formatuje daną partycję. Obsługiwane typy partycji:
  • fs_type="yaffs2" partycji_type="MTD". Lokalizacja musi być nazwą MTD partycja; powstaje pusty system plików yaffs2. Pozostałe argumenty to nieużywane.
  • fs_type="ext4" partycji_type="EMMC". Lokalizacja musi być plikiem na urządzeniu dla partycji danych. Tworzony jest w nim pusty system plików ext4. Jeśli fs_size ma wartość zero, zajmuje całą partycję. Jeśli fs_size jest liczbą dodatnią, system plików pobiera pierwsze bajty fs_size partycji. Jeśli fs_size to liczba ujemna, system plików przyjmuje wszystkie oprócz ostatnich |fs_size| bajtów partycji danych.
  • fs_type="f2fs" partycji_type="EMMC". Lokalizacja musi być plikiem na urządzeniu dla partycji danych. fs_size nie może być liczbą ujemną. Jeśli fs_size ma wartość zero, zajmuje całą partycję. Jeśli fs_size jest liczbą dodatnią, system plików pobiera pierwsze bajty fs_size partycji.
  • Parametr mount_point powinien być w przyszłości punktem podłączania w systemie plików.
getprop(key)
Zwraca wartość key właściwości systemowej (lub pustego ciągu, jeśli nie został on zdefiniowany). Wartości właściwości systemowych zdefiniowane przez partycję przywracania nie muszą być takie same jak systemu głównego. Ta funkcja zwraca wartość w odzyskaniu.
greater_than_int(a, b)
Zwraca wartość prawda tylko wtedy, gdy (iff) a (zinterpretowane jako liczba całkowita) jest większe od b (interpretowane jako liczba całkowita).
ifelse(cond, e1[, e2])
Analizuje warunek cond, a jeśli jest prawda, oblicza i zwraca wartość e1, W przeciwnym razie sprawdza i zwraca e2 (jeśli występuje). Instrukcja „if ... other ... potem ... endif" jest po prostu cukrem składniowym dla tej funkcji.
is_mounted(mount_point)
Zwraca wartość true (prawda), że system plików jest podłączony w miejscu mount_point.
is_substring(needle, haystack)
Zwraca wartość true iff iff (igła) jako podłańcuch elementu haystack (stóg siana).
less_than_int(a, b)
Zwraca wartość true iff a (interpretowane jako liczba całkowita) jest mniejsze od b (interpretowane jako jest liczbą całkowitą).
mount(fs_type, partition_type, name, mount_point)
Podłącza system plików fs_type w punkcie mount_point. Parametr partition_type musi mieć wartość jedna z tych opcji:
    .
  • Od początku miesiąca. Nazwa to nazwa partycji MTD (np. system, dane użytkownika; patrz /proc/mtd, aby wyświetlić pełną listę).
  • EMMC.

Podczas przywracania systemu plików domyślnie nie są podłączane żadne systemy plików (z wyjątkiem karty SD, jeśli użytkownik ręczna instalacja pakietu z karty SD); skrypt musi podłączyć na partycjach, które musi zmodyfikować.

package_extract_dir(package_dir, dest_dir)
Wyodrębnia wszystkie pliki z pakietu pod pozycją package_dir i zapisuje je w odpowiednie drzewo w sekcji dest_dir. Wszystkie istniejące pliki zostaną zastąpione.
package_extract_file(package_file[, dest_file])
Wyodrębnia pojedynczy plik package_file z pakietu aktualizacji i zapisuje go w dest_file. W razie potrzeby możesz zastąpić istniejące pliki. Bez dest_file zwraca zawartość pliku pakietu w postaci binarnego obiektu blob.
read_file(filename)
Odczytuje element filename i zwraca jego zawartość jako binarny obiekt blob.
run_program(path[, arg, ...])
Wykonuje plik binarny w miejscu path, przekazując argumenty arg. Zwraca stan wyjścia programu.
set_progress(frac)
Ustawia pozycję miernika postępu we fragmencie określonym przez ostatnie show_progress() połączenie. frac musi mieścić się w zakresie [0,0, 1,0]. Postęp metr nigdy nie porusza się do tyłu; są ignorowane.
sha1_check(blob[, sha1])
Argument blob to obiekt blob typu zwracany przez funkcję read_file() lub jednoargumentowej funkcji package_extract_file() . Bez argumentów sha1 ta funkcja zwraca hasz SHA1 obiektu blob (w postaci 40-cyfrowego ciągu szesnastkowego). Z co najmniej jedną sha1, funkcja zwraca hasz SHA1, jeśli jest równa jeden z argumentów lub pusty ciąg, jeśli żaden z nich nie jest równy.
show_progress(frac, secs)
Przesuwa miernik postępu o następny frac swojej długości w sec s (musi być liczbą całkowitą). sec może wynosić 0, w którym to przypadku licznik jest nie są zaawansowane automatycznie, ale za pomocą zdefiniowanej funkcji set_progress() powyżej.
sleep(secs)
Uśpienia przez sekundy sekund (musi być liczbą całkowitą).
stdout(expr[, expr, ...])
Ocenia każde wyrażenie i umieszcza jego wartość jako stdout. Przydatny podczas debugowania.
tune2fs(device[, arg, …])
Dostosowuje argumenty możliwych do dostosowania parametrów na urządzeniu.
ui_print([text, ...])
Łączy wszystkie argumenty text i wyświetla wynik w interfejsie (gdzie zostanie widoczne, jeśli użytkownik włączył wyświetlacz tekstowy).
unmount(mount_point)
Odłącza system plików podłączony w punkcie mount_point.
wipe_block_device(block_dev, len)
Czyści dług bajtów danego urządzenia blokowego block_dev.
wipe_cache()
Po pomyślnej instalacji partycja pamięci podręcznej zostaje wyczyszczona.
write_raw_image(filename_or_blob, partition)
Zapisuje obraz z pliku filename_or_blob w partycji MTD. nazwa_pliku_lub_blob może być ciągiem znaków z nazwą pliku lokalnego lub argumentem o wartości blob zawierający dane do zapisania. Aby skopiować plik z pakietu OTA na partycję, użyj polecenia: write_raw_image(package_extract_file("zip_filename"), "partition_name");
.

Uwaga: przed Androidem 4.1 akceptowane były tylko nazwy plików, aby trzeba było rozpakować dane do tymczasowego pliku lokalnego.