Di dalam paket OTA

Sistem membangun biner updater dari bootable/recovery/updater dan menggunakannya dalam paket OTA.

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

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

Catatan: Penggunaan skrip edisi dan/atau fungsi bawaan tidak terlalu umum tetapi bisa berguna jika Anda perlu men-debug file pembaruan.

Sintaksis Edify

Skrip pendukung adalah ekspresi tunggal di mana semua nilai berupa string. String kosong adalah false dalam konteks Boolean dan semua string lainnya bernilai 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, _, :, /, . itu bukan kata yang khusus untuk digunakan dianggap sebagai literal {i>string<i}. (Kata yang dicadangkan adalah if else lalu endif.) {i>String<i} literal juga dapat muncul dalam tanda kutip ganda; inilah cara membuat nilai dengan spasi kosong dan karakter lain yang tidak termasuk dalam himpunan di atas. \n, \t, \", dan \\ berfungsi sebagai escape dalam tanda kutip string, seperti halnya \x##.

&& dan || terjadi hubungan arus pendek; sisi kanan tidak dievaluasi jika hasil logis ditentukan oleh ruas kiri. Hal berikut setara:

e1 && e2
if e1 then e2 endif

; operator adalah titik urutan; berarti mengevaluasi terlebih dahulu sisi kiri dan kemudian sisi sebelah kanan. Nilainya adalah nilai ekspresi sisi kanan. Titik koma juga dapat muncul setelah ekspresi, sehingga efeknya menyimulasikan pernyataan gaya C:

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

Fungsi bawaan

Sebagian besar fungsi update dimuat dalam fungsi yang tersedia untuk dieksekusi oleh skrip. (Sebenarnya ini adalah makro, bukan fungsi dalam arti Lisp, karena mereka tidak perlu mengevaluasi semua argumen.) Kecuali jika dinyatakan lain, fungsi akan menampilkan true jika berhasil dan false jika error. Jika Anda ingin agar error membatalkan eksekusi skrip, gunakan fungsi abort() dan/atau assert(). Himpunan fungsi yang tersedia di {i>updater<i} juga dapat diperluas untuk memberikan fungsi khusus perangkat.

abort([msg])
Membatalkan eksekusi skrip secara langsung, dengan pesan opsional. Jika pengguna memiliki mengaktifkan tampilan teks, pesan 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 "pernyataan gagal" dan teks sumber dari 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. Sisa argumen harus berpasangan: hash SHA1 (string hex 40 karakter) dan blob. Blob adalah patch yang akan diterapkan ketika isi file sumber saat ini memiliki SHA1 yang ditentukan.

Patching dilakukan dengan cara aman yang menjamin file target memiliki hash dan ukuran SHA1 yang diinginkan, atau tidak disentuh—tidak akan dibiarkan dalam status perantara. Jika proses terganggu selama patching, file target mungkin dalam kondisi menengah; salinan ada di partisi cache, jadi memulai ulang pembaruan berhasil memperbarui file.

Sintaksis khusus didukung untuk memperlakukan konten Memory Technology Device (MTD) partisi seperti file, yang memungkinkan {i>patching<i} pada partisi mentah seperti {i>boot<i}. Untuk membaca MTD Anda harus mengetahui berapa banyak data yang ingin Anda baca karena partisi itu tidak memiliki konsep {i>end-of-file<i}. Anda bisa menggunakan rangkaian "MTD:partisi:size_1:sha1_1:size_2: sha1_2" sebagai nama {i>file<i} untuk membaca partisi yang diberikan. Anda harus menentukan minimal satu (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 (benar) jika konten nama file atau salinan sementara di partisi cache (jika ada) memiliki checksum SHA1 yang sama dengan salah satu nilai sha1 yang diberikan. Nilai sha1 ditetapkan sebagai 40 digit heksadesimal. Fungsi ini berbeda dengan sha1_check(read_file(filename), sha1 [, ...]) yang mengetahui periksa salinan partisi cache, sehingga apply_patch_check() akan berhasil meskipun file rusak karena apply_patch() update yang terputus.
apply_patch_space(bytes)
Menampilkan true (benar) jika setidaknya byte ruang coretan tersedia untuk menerapkan biner patching.
concat(expr[, expr, ...])
Mengevaluasi setiap ekspresi dan menyambungkannya. Operator + adalah sugar sintaksis untuk ini dalam kasus khusus dua argumen (tetapi bentuk fungsi bisa memakan waktu ekspresi). Ekspresi harus berupa string; perintah itu tidak dapat menggabungkan blob.
file_getprop(filename, key)
Membaca nama file tertentu, menafsirkannya sebagai file properti (mis. /system/build.prop), dan menampilkan nilai kunci 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 MTD partisi; sistem file yaffs2 kosong terbentuk di sana. Argumen lainnya adalah 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 adalah nol, sistem file mengambil seluruh partisi. Jika fs_size adalah bilangan positif, sistem file mengambil byte fs_size pertama dari partisi. Jika fs_size adalah negatif, sistem file mengambil semua file kecuali |fs_size| byte terakhir dari partisi.
  • fs_type="f2fs" dan partition_type="EMMC". Lokasi harus berupa file perangkat untuk partisi. fs_size harus berupa angka yang tidak negatif. Jika fs_size adalah nol, sistem file mengambil seluruh partisi. Jika fs_size adalah bilangan positif, sistem file mengambil byte fs_size pertama dari partisi.
  • {i>mount_point<i} harus menjadi titik pemasangan sistem file di masa mendatang.
getprop(key)
Menampilkan nilai key properti sistem (atau string kosong, jika tidak ditentukan). Nilai properti sistem yang ditentukan oleh partisi pemulihan tidak selalu sama dengan elemen yang ada di sistem utama. Fungsi ini menampilkan nilai dalam pemulihan.
greater_than_int(a, b)
Menampilkan benar jika dan hanya jika (iff) a (diinterpretasikan sebagai bilangan bulat) lebih besar dari b (diinterpretasikan sebagai bilangan bulat).
ifelse(cond, e1[, e2])
Mengevaluasi cond, dan jika true, mengevaluasi dan menampilkan nilai e1, jika tidak, sistem akan mengevaluasi dan menampilkan e2 (jika ada). Perintah "if ... else ... maka ... {i> endif<i}” konstruknya adalah sugar sintaksis untuk fungsi ini.
is_mounted(mount_point)
Menampilkan nilai benar jika ada sistem file yang terpasang di mount_point.
is_substring(needle, haystack)
Menampilkan needle iff benar adalah substring haystack.
less_than_int(a, b)
Menampilkan jika benar a (diinterpretasikan sebagai bilangan bulat) lebih kecil dari b (diinterpretasikan sebagai bilangan bulat).
mount(fs_type, partition_type, name, mount_point)
Memasang sistem file fs_type pada mount_point. partition_type harus salah satu dari:
  • MTD. Name adalah nama partisi MTD (mis., sistem, data pengguna; lihat /proc/mtd di perangkat untuk melihat 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 dimodifikasi.

package_extract_dir(package_dir, dest_dir)
Mengekstrak semua file dari paket di bawah package_dir dan tulis ke pohon yang sesuai di bawah dest_dir. File apa pun yang sudah ada akan ditimpa.
package_extract_file(package_file[, dest_file])
Mengekstrak package_file tunggal dari paket update dan menulisnya ke dest_file, yang akan menimpa file yang ada jika perlu. Tanpa tag dest_file, menampilkan konten file paket sebagai blob biner.
read_file(filename)
Membaca nama file dan menampilkan kontennya sebagai blob biner.
run_program(path[, arg, ...])
Mengeksekusi biner di path, dengan meneruskan arg. Menampilkan status keluar program.
set_progress(frac)
Mengatur posisi pengukur progres dalam potongan yang didefinisikan oleh yang terbaru show_progress() panggilan. frac harus berada dalam rentang [0.0, 1.0]. Progres meter tidak pernah bergerak mundur; upaya untuk melakukannya akan diabaikan.
sha1_check(blob[, sha1])
Argumen blob adalah blob jenis yang ditampilkan oleh read_file() atau bentuk satu argumen dari package_extract_file() . Tanpa argumen sha1, fungsi ini menampilkan hash SHA1 blob (sebagai string hex 40 digit). Dengan satu atau beberapa sha1, fungsi ini akan menampilkan hash SHA1 jika sama dengan salah satu argumen, atau {i>string<i} kosong jika tidak sama dengan salah satunya.
show_progress(frac, secs)
Memajukan pengukur progres ke pakah berikutnya sepanjang panjangnya selama dtk detik (harus berupa bilangan bulat). secs mungkin 0, dalam hal ini meterannya adalah tidak maju secara otomatis tetapi dengan menggunakan fungsi set_progress() yang ditentukan di atas.
sleep(secs)
Tidur selama dtk 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 args yang dapat disetel di perangkat.
ui_print([text, ...])
Menggabungkan semua argumen text dan mencetak hasilnya ke UI (tempat terlihat jika pengguna telah mengaktifkan tampilan teks).
unmount(mount_point)
Melepaskan sistem file yang terpasang di mount_point.
wipe_block_device(block_dev, len)
Menghapus total byte len dari perangkat blok yang ditentukan block_dev.
wipe_cache()
Menyebabkan partisi cache dihapus total pada akhir penginstalan yang berhasil.
write_raw_image(filename_or_blob, partition)
Menuliskan image dalam filename_or_blob ke partisi MTD. filename_or_blob dapat berupa string yang menamai file lokal atau argumen yang bernilai blob yang berisi data untuk 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 menyelesaikan data ini terlebih dahulu harus diekstrak menjadi file lokal sementara.