Wewnątrz pakietów OTA

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

System buduje plik binarny aktualizatora z bootable/recovery/updater i używa go w pakiecie OTA.

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

Updater zawiera kilka wbudowanych funkcji i interpreter rozszerzalnego języka skryptowego ( edify ), który obsługuje polecenia dla typowych zadań związanych z aktualizacją. Updater szuka w pliku .zip pakietu skryptu w pliku META-INF/com/google/android/updater-script .

Uwaga: Używanie skryptu edify i/lub funkcji wbudowanych nie jest powszechną czynnością, ale może być pomocne, jeśli musisz debugować plik aktualizacji.

Edytuj składnię

Skrypt edify to pojedyncze wyrażenie, w którym wszystkie wartości są ciągami. Puste ciągi są fałszywe w kontekście logicznym, a wszystkie inne ciągi są prawdziwe . 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 az, AZ, 0-9, _, :, /, . które nie jest słowem zastrzeżonym jest uważane za literał ciągu. (Słowa zastrzeżone to jeśli inaczej to endif. ) Literały łańcuchowe mogą również pojawiać się w cudzysłowach; w ten sposób tworzy się wartości z białymi znakami i innymi znakami, których nie ma w powyższym zestawie. \n, \t, \" i \\ służą jako znaki ucieczki w łańcuchach w cudzysłowie, podobnie jak \x ## .

&& i || operatorzy zwierają; prawa strona nie jest oceniana, jeśli logiczny wynik jest określany przez lewą stronę. Poniższe są równoważne:

e1 && e2
if e1 then e2 endif

; operator jest punktem sekwencji; to znaczy najpierw oceniać lewą, a potem prawą stronę. Jego wartością jest wartość wyrażenia po prawej stronie. Po wyrażeniu może również pojawić się średnik, więc efekt symuluje instrukcje w stylu C:

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

Wbudowane funkcje

Większość funkcji aktualizacji jest zawarta w funkcjach dostępnych do wykonania przez skrypty. (Ściśle mówiąc, są to makra , a nie funkcje w sensie Lispowym, ponieważ nie muszą oceniać wszystkich swoich argumentów.) O ile nie zaznaczono inaczej, funkcje zwracają prawdę w przypadku sukcesu i fałsz w przypadku błędu. Jeśli chcesz, aby błędy przerwały wykonywanie skryptu, użyj funkcji abort() i/lub assert() . Zestaw funkcji dostępnych w aktualizatorze można również rozszerzyć, aby zapewnić funkcjonalność specyficzną dla urządzenia .

abort([ msg ])
Natychmiast przerywa wykonywanie skryptu, z opcjonalnym msg . Jeśli użytkownik włączył wyświetlanie tekstowe, w dzienniku odzyskiwania i na ekranie pojawi się komunikat msg .
assert( expr [, expr , ...])
Po kolei ocenia każdy wyraż . Jeśli którakolwiek jest fałszywa, natychmiast przerywa wykonywanie z komunikatem „potwierdzenie nie powiodło się” i tekstem źródłowym wyrażenia, które nie powiodło się.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
Stosuje binarną poprawkę do pliku src_file w celu utworzenia pliku tgt_file . Jeśli żądany cel jest taki sam jak źródło, wpisz „-” dla pliku_tgt . tgt_sha1 i tgt_size to oczekiwany końcowy skrót SHA1 i rozmiar pliku docelowego. Pozostałe argumenty muszą występować parami: skrót SHA1 (40-znakowy ciąg szesnastkowy) i obiekt BLOB. Obiekt BLOB to poprawka do zastosowania, gdy bieżąca zawartość pliku źródłowego ma podany SHA1.

Łatanie jest wykonywane w bezpieczny sposób, który gwarantuje, że plik docelowy ma żądany skrót i rozmiar SHA1 lub jest nienaruszony — nie zostanie pozostawiony w niemożliwym do odzyskania stanie pośrednim. Jeśli proces zostanie przerwany podczas aktualizacji, plik docelowy może znajdować się w stanie pośrednim; kopia istnieje na partycji pamięci podręcznej, więc ponowne uruchomienie aktualizacji może pomyślnie zaktualizować plik.

Obsługiwana jest specjalna składnia umożliwiająca traktowanie zawartości partycji Memory Technology Device (MTD) jako plików, umożliwiając łatanie surowych partycji, takich jak rozruch. Aby odczytać partycję MTD, musisz wiedzieć, ile danych chcesz odczytać, ponieważ partycja nie ma pojęcia końca pliku. Możesz użyć ciągu "MTD: partycja :rozmiar_1 : sha1_1 : rozmiar_2 : sha1_2 " jako nazwę pliku, aby odczytać podaną partycję. Musisz określić co najmniej jedną parę (rozmiar, sha-1) ; możesz określić więcej niż jeden, jeśli istnieje wiele możliwości tego, co chcesz przeczytać.

apply_patch_check( filename , sha1 [, sha1 , ...])
Zwraca true, jeśli zawartość pliku lub tymczasowej kopii w partycji pamięci podręcznej (jeśli jest obecna) ma sumę kontrolną SHA1 równą jednej z podanych wartości sha1 . Wartości sha1 są określone jako 40 cyfr szesnastkowych. Ta funkcja różni się od sha1_check(read_file( filename ), sha1 [, ...]) tym, że wie, jak sprawdzić kopię partycji pamięci podręcznej, więc apply_patch_check() powiedzie się, nawet jeśli plik został uszkodzony przez przerwaną apply_patch() update .
apply_patch_space( bytes )
Zwraca wartość true, jeśli co najmniej bajty miejsca na zarysowania są dostępne do zastosowania łat binarnych.
concat( expr [, expr , ...])
Ocenia każde wyrażenie i łączy je. Operator + jest cukrem składniowym dla tej funkcji w szczególnym przypadku dwóch argumentów (ale forma funkcji może przyjmować dowolną liczbę wyrażeń). Wyrażenia muszą być ciągami; nie może łączyć obiektów blob.
file_getprop( filename , key )
Czyta podaną nazwę pliku , interpretuje ją jako plik właściwości (np /system/build.prop ) i zwraca wartość podanego klucza lub pusty ciąg, jeśli klucz nie jest obecny.
format( fs_type , partition_type , location , fs_size , mount_point )
Reformatuje daną partycję. Obsługiwane typy partycji:
  • fs_type="yaffs2" i partition_type="MTD". Lokalizacja musi być nazwą partycji MTD; konstruowany jest tam pusty system plików yaffs2. Pozostałe argumenty nie są używane.
  • fs_type="ext4" i partition_type="EMMC". Lokalizacja musi być plikiem urządzenia dla partycji. Jest tam konstruowany pusty system plików ext4. Jeśli fs_size wynosi zero, system plików zajmuje całą partycję. Jeśli fs_size jest liczbą dodatnią, system plików pobiera pierwsze bajty fs_size partycji. Jeśli fs_size jest liczbą ujemną, system plików przyjmuje wszystko oprócz ostatniego |fs_size| bajty partycji.
  • fs_type="f2fs" i ​​partition_type="EMMC". Lokalizacja musi być plikiem urządzenia dla partycji. fs_size musi być liczbą nieujemną. Jeśli fs_size wynosi zero, system plików zajmuje całą partycję. Jeśli fs_size jest liczbą dodatnią, system plików pobiera pierwsze bajty fs_size partycji.
  • mount_point powinien być przyszłym punktem montowania systemu plików.
getprop( key )
Zwraca wartość klucza właściwości systemowej (lub pusty ciąg, jeśli nie jest zdefiniowany). Wartości właściwości systemowych zdefiniowane przez partycję odzyskiwania niekoniecznie są takie same jak w systemie głównym. Ta funkcja zwraca wartość w odzysku.
greater_than_int( a , b )
Zwraca prawdę wtedy i tylko wtedy, gdy (iff) a (interpretowane jako liczba całkowita) jest większe niż b (interpretowane jako liczba całkowita).
ifelse( cond , e1 [, e2 ])
Oblicza cond , a jeśli jest prawdą, oblicza i zwraca wartość e1 , w przeciwnym razie oblicza i zwraca e2 (jeśli występuje). Konstrukcja "if ... else ... then ... endif" jest tylko cukrem składniowym dla tej funkcji.
is_mounted( mount_point )
Zwraca prawdę, jeśli w punkcie montowania jest zamontowany system plików.
is_substring( needle , haystack )
Zwraca true iff needle jest podłańcuchem haystack .
less_than_int( a , b )
Zwraca prawdę, jeśli a (interpretowane jako liczba całkowita) jest mniejsze niż b (interpretowane jako liczba całkowita).
mount( fs_type , partition_type , name , mount_point )
Montuje system plików fs_type w mount_point . typ_partycji musi być jednym z:
  • MTD . Nazwa to nazwa partycji MTD (np. system, dane użytkownika; pełna lista znajduje się w /proc/mtd na urządzeniu).
  • EMC.

Recovery domyślnie nie montuje żadnych systemów plików (z wyjątkiem karty SD, jeśli użytkownik wykonuje ręczną instalację pakietu z karty SD); Twój skrypt musi zamontować wszystkie partycje, które musi zmodyfikować.

package_extract_dir( package_dir , dest_dir )
Wyodrębnia wszystkie pliki z pakietu poniżej package_dir i zapisuje je w odpowiednim drzewie poniżej dest_dir . Wszelkie istniejące pliki zostaną nadpisane.
package_extract_file( package_file [, dest_file ])
Wyodrębnia pojedynczy plik package_file z pakietu aktualizacji i zapisuje go w dest_file , zastępując istniejące pliki w razie potrzeby. Bez argumentu dest_file zwraca zawartość pliku pakietu jako binarny obiekt BLOB.
read_file( filename )
Odczytuje nazwę pliku i zwraca jego zawartość jako binarny obiekt BLOB.
run_program( path [, arg , ...])
Wykonuje plik binarny w path , przekazując arg s. Zwraca status zakończenia programu.
set_progress( frac )
Ustawia pozycję miernika postępu w porcji zdefiniowanej przez ostatnie show_progress() . frac musi być w zakresie [0,0, 1,0]. Wskaźnik postępu nigdy nie cofa się; próby, aby to zrobić, są ignorowane.
sha1_check( blob [, sha1 ])
Argument obiektu BLOB jest obiektem BLOB typu zwróconego przez read_file read_file() lub jednoargumentową postać package_extract_file() . Bez argumentów sha1 ta funkcja zwraca skrót SHA1 obiektu BLOB (jako 40-cyfrowy ciąg szesnastkowy). Z jednym lub większą liczbą argumentów sha1 ta funkcja zwraca skrót SHA1, jeśli jest równy jednemu z argumentów, lub pusty ciąg, jeśli nie jest równy żadnemu z nich.
show_progress( frac , secs )
Przesuwa licznik postępu o następny ułamek jego długości o sekundy (musi być liczbą całkowitą). secs może wynosić 0, w którym to przypadku licznik nie jest uaktualniany automatycznie, ale za pomocą zdefiniowanej powyżej funkcji set_progress() .
sleep( secs )
Uśpiony przez sekundy sekund (musi być liczbą całkowitą).
stdout( expr [, expr , ...])
Ocenia każde wyrażenie i zrzuca jego wartość na standardowe wyjście. Przydatne do debugowania.
tune2fs( device [, arg , …])
Dostosowuje regulowane parametry na urządzeniu .
ui_print([ text , ...])
Łączy wszystkie argumenty tekstowe i drukuje wynik w interfejsie użytkownika (gdzie będzie widoczny, jeśli użytkownik włączył wyświetlanie tekstu).
unmount( mount_point )
Odmontowuje system plików zamontowany w punkcie montowania .
wipe_block_device( block_dev , len )
Czyści bajty len danego urządzenia blokowego block_dev .
wipe_cache()
Powoduje wyczyszczenie partycji pamięci podręcznej po zakończeniu pomyślnej instalacji.
write_raw_image( filename_or_blob , partition )
Zapisuje obraz w pliku nazwa_lub_blob na partycji MTD . filename_or_blob może być ciągiem określającym plik lokalny lub argumentem o wartości obiektu BLOB zawierającym dane do zapisania. Aby skopiować plik z pakietu OTA na partycję, użyj: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Uwaga: przed Androidem 4.1 akceptowane były tylko nazwy plików, więc aby to osiągnąć, dane musiały zostać najpierw rozpakowane do tymczasowego pliku lokalnego.