Sistem mem-build biner updater dari bootable/recovery/updater
dan menggunakannya
dalam paket OTA.
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, sehinggaapply_patch_check()
akan berhasil meskipun file rusak olehapply_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.
-
MTD. Name adalah nama partisi MTD (misalnya, system, userdata; lihat
-
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 daripackage_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.