Di dalam paket OTA

Sistem mem-build biner updater dari bootable/recovery/updater dan menggunakannya dalam paket OTA.

Paket itu sendiri adalah file .zip (ota_update.zip, incremental_ota_update.zip) yang berisi biner META-INF/com/google/android/update-binary yang dapat dieksekusi.

Updater berisi beberapa fungsi bawaan dan penafsir untuk bahasa skrip yang dapat diperluas (edify) yang mendukung perintah untuk tugas terkait update standar. Updater mencari skrip dalam file .zip paket di file META-INF/com/google/android/updater-script.

Catatan: Menggunakan skrip edify dan/atau fungsi bawaan bukanlah aktivitas umum, tetapi dapat membantu jika Anda perlu men-debug file update.

Sintaksis Edify

Skrip edify adalah satu ekspresi yang semua nilainya berupa string. String kosong adalah false dalam konteks Boolean dan semua string lainnya adalah true. Edify mendukung operator berikut (dengan arti biasa):

(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

String apa pun dari karakter a-z, A-Z, 0-9, _, :, /, . yang bukan kata khusus dianggap sebagai literal string. (Kata yang dicadangkan adalah if else lalu endif.) Literal string juga dapat muncul dalam tanda kutip ganda; ini adalah cara membuat nilai dengan spasi kosong dan karakter lain yang tidak ada dalam kumpulan di atas. \n, \t, \", dan \\ berfungsi sebagai escape dalam string yang diapit tanda petik, seperti halnya \x##.

Operator && dan || melakukan short-circuiting; sisi kanan tidak dievaluasi jika hasil logika ditentukan oleh sisi kiri. Berikut adalah setara:

e1 && e2
if e1 then e2 endif

Operator ; adalah titik urutan; artinya mengevaluasi sisi kiri terlebih dahulu, lalu sisi kanan. Nilainya adalah nilai ekspresi sisi kanan. Titik koma juga dapat muncul setelah ekspresi, sehingga efeknya menyimulasikan pernyataan bergaya C:

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

Fungsi bawaan

Sebagian besar fungsi update terdapat dalam fungsi yang tersedia untuk dieksekusi oleh skrip. (Secara ketat, ini adalah makro, bukan fungsi dalam arti Lisp, karena tidak perlu mengevaluasi semua argumennya.) Kecuali jika dinyatakan lain, fungsi akan menampilkan true jika berhasil dan false jika terjadi error. Jika Anda ingin error membatalkan eksekusi skrip, gunakan fungsi abort() dan/atau assert(). Kumpulan fungsi yang tersedia di updater juga dapat diperluas untuk menyediakan fungsi khusus perangkat.

abort([msg])
Segera membatalkan eksekusi skrip, dengan msg opsional. Jika pengguna telah mengaktifkan tampilan teks, msg akan muncul di log pemulihan dan di layar.
assert(expr[, expr, ...])
Mengevaluasi setiap expr secara bergantian. Jika ada yang salah, segera batalkan eksekusi dengan pesan "assert failed" dan teks sumber ekspresi yang gagal.
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
Menerapkan patch biner ke src_file untuk menghasilkan tgt_file . Jika target yang diinginkan sama dengan sumber, teruskan "-" untuk tgt_file . tgt_sha1 dan tgt_size adalah hash SHA1 akhir yang diharapkan dan ukuran file target. Argumen yang tersisa harus berpasangan: hash SHA1 (string hex 40 karakter) dan blob. Blob adalah patch yang akan diterapkan saat konten file sumber saat ini memiliki SHA1 yang diberikan.

Patching dilakukan dengan cara yang aman yang menjamin file target memiliki hash dan ukuran SHA1 yang diinginkan, atau tidak tersentuh—file tidak akan dibiarkan dalam status perantara yang tidak dapat dipulihkan. Jika proses terganggu selama patching, file target mungkin dalam status perantara; salinan ada di partisi cache sehingga memulai ulang update dapat berhasil mengupdate file.

Sintaksis khusus didukung untuk memperlakukan konten partisi Memory Technology Device (MTD) sebagai file, yang memungkinkan patching partisi mentah seperti booting. Untuk membaca partisi MTD, Anda harus mengetahui jumlah data yang ingin dibaca karena partisi tidak memiliki konsep akhir file. Anda dapat menggunakan string "MTD:partition:size_1:sha1_1:size_2: sha1_2" sebagai nama file untuk membaca partisi yang diberikan. Anda harus menentukan setidaknya satu pasangan (size, sha-1); Anda dapat menentukan lebih dari satu jika ada beberapa kemungkinan untuk apa yang ingin Anda baca.

apply_patch_check(filename, sha1[, sha1, ...])
Menampilkan true jika konten filename atau salinan sementara di partisi cache (jika ada) memiliki checksum SHA1 yang sama dengan salah satu nilai sha1 yang diberikan. Nilai sha1 ditentukan sebagai 40 digit heksadesimal. Fungsi ini berbeda dengan sha1_check(read_file(filename), sha1 [, ...]) karena mengetahui cara memeriksa salinan partisi cache, sehingga apply_patch_check() akan berhasil meskipun file rusak oleh apply_patch() update yang terganggu.
apply_patch_space(bytes)
Menampilkan true jika setidaknya byte ruang sementara tersedia untuk menerapkan patch biner.
concat(expr[, expr, ...])
Mengevaluasi setiap ekspresi dan menggabungkannya. Operator + adalah sugar sintaksis untuk fungsi ini dalam kasus khusus dua argumen (tetapi bentuk fungsi dapat menggunakan sejumlah ekspresi). Ekspresi harus berupa string; ekspresi tidak dapat menyambungkan blob.
file_getprop(filename, key)
Membaca filename yang diberikan, menafsirkannya sebagai file properti (misalnya, /system/build.prop), dan menampilkan nilai key yang diberikan, atau string kosong jika key tidak ada.
format(fs_type, partition_type, location, fs_size, mount_point)
Memformat ulang partisi tertentu. Jenis partisi yang didukung:
  • fs_type="yaffs2" dan partition_type="MTD". Lokasi harus berupa nama partisi MTD; sistem file yaffs2 kosong dibuat di sana. Argumen yang tersisa tidak digunakan.
  • fs_type="ext4" dan partition_type="EMMC". Lokasi harus berupa file perangkat untuk partisi. Sistem file ext4 kosong dibuat di sana. Jika fs_size nol, sistem file akan mengisi seluruh partisi. Jika fs_size adalah bilangan positif, sistem file akan mengambil fs_size byte pertama dari partisi. Jika fs_size adalah bilangan negatif, sistem file akan mengambil semua kecuali byte |fs_size| terakhir dari partisi.
  • fs_type="f2fs" dan partition_type="EMMC". Lokasi harus berupa file perangkat untuk partisi. fs_size harus berupa angka non-negatif. Jika fs_size nol, sistem file akan mengisi seluruh partisi. Jika fs_size adalah bilangan positif, sistem file akan mengambil fs_size byte pertama dari partisi.
  • mount_point harus menjadi titik pemasangan di masa mendatang untuk sistem file.
getprop(key)
Menampilkan nilai kunci properti sistem (atau string kosong, jika tidak ditentukan). Nilai properti sistem yang ditentukan oleh partisi pemulihan tidak harus sama dengan nilai properti sistem utama. Fungsi ini menampilkan nilai dalam pemulihan.
greater_than_int(a, b)
Menampilkan true (benar) jika dan hanya jika (iff) a (ditafsirkan sebagai bilangan bulat) lebih besar dari b (ditafsirkan sebagai bilangan bulat).
ifelse(cond, e1[, e2])
Mengevaluasi cond, dan jika benar, mengevaluasi dan menampilkan nilai e1, jika tidak, mengevaluasi dan menampilkan e2 (jika ada). Konstruksi "if ... else ... then ... endif" hanyalah sugar sintaksis untuk fungsi ini.
is_mounted(mount_point)
Menampilkan true (benar) jika ada sistem file yang dipasang di mount_point.
is_substring(needle, haystack)
Menampilkan true (benar) jika needle adalah substring dari haystack.
less_than_int(a, b)
Menampilkan true jika a (ditafsirkan sebagai bilangan bulat) kurang dari b (ditafsirkan sebagai bilangan bulat).
mount(fs_type, partition_type, name, mount_point)
Memasang sistem file fs_type di mount_point. partition_type harus berupa salah satu dari:
  • MTD. Name adalah nama partisi MTD (misalnya, system, userdata; lihat /proc/mtd di perangkat untuk mengetahui daftar lengkapnya).
  • EMMC.

Pemulihan tidak memasang sistem file apa pun secara default (kecuali kartu SD jika pengguna melakukan penginstalan paket secara manual dari kartu SD); skrip Anda harus memasang partisi yang perlu diubah.

package_extract_dir(package_dir, dest_dir)
Mengekstrak semua file dari paket di bawah package_dir dan menulisnya ke hierarki yang sesuai di bawah dest_dir. Semua file yang ada akan ditimpa.
package_extract_file(package_file[, dest_file])
Mengekstrak satu package_file dari paket update dan menulisnya ke dest_file, menimpa file yang ada jika diperlukan. Tanpa argumen dest_file, menampilkan konten file paket sebagai blob biner.
read_file(filename)
Membaca filename dan menampilkan kontennya sebagai blob biner.
run_program(path[, arg, ...])
Menjalankan biner di path, dengan meneruskan arg. Menampilkan status keluar program.
set_progress(frac)
Menetapkan posisi pengukur progres dalam bagian yang ditentukan oleh panggilan show_progress() terbaru. frac harus dalam rentang [0.0, 1.0]. Pengukur progres tidak pernah bergerak mundur; upaya untuk membuatnya melakukannya akan diabaikan.
sha1_check(blob[, sha1])
Argumen blob adalah blob dari jenis yang ditampilkan oleh read_file() atau bentuk satu argumen dari package_extract_file() . Tanpa argumen sha1, fungsi ini akan menampilkan hash SHA1 blob (sebagai string hex 40 digit). Dengan satu atau beberapa argumen sha1, fungsi ini akan menampilkan hash SHA1 jika sama dengan salah satu argumen, atau string kosong jika tidak sama dengan salah satu argumen.
show_progress(frac, secs)
Memajukan pengukur progres selama frac berikutnya dari panjangnya selama secs detik (harus berupa bilangan bulat). secs dapat berupa 0, dalam hal ini pengukur tidak maju secara otomatis, tetapi dengan menggunakan fungsi set_progress() yang ditentukan di atas.
sleep(secs)
Berhenti selama secs detik (harus berupa bilangan bulat).
stdout(expr[, expr, ...])
Mengevaluasi setiap ekspresi dan membuang nilainya ke stdout. Berguna untuk proses debug.
tune2fs(device[, arg, …])
Menyesuaikan parameter yang dapat disesuaikan args di perangkat.
ui_print([text, ...])
Menggabungkan semua argumen text dan mencetak hasilnya ke UI (tempat argumen akan terlihat jika pengguna telah mengaktifkan tampilan teks).
unmount(mount_point)
Melepas sistem file yang dipasang di mount_point.
wipe_block_device(block_dev, len)
Menghapus total byte len dari perangkat blok tertentu block_dev.
wipe_cache()
Menyebabkan partisi cache dihapus di akhir penginstalan yang berhasil.
write_raw_image(filename_or_blob, partition)
Menulis image dalam filename_or_blob ke partisi MTD. filename_or_blob dapat berupa string yang menamai file lokal atau argumen bernilai blob yang berisi data yang akan ditulis. Untuk menyalin file dari paket OTA ke partisi, gunakan: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Catatan: Sebelum Android 4.1, hanya nama file yang diterima, jadi untuk melakukannya, data harus diekstrak terlebih dahulu ke file lokal sementara.