Di dalam Paket OTA

Sistem membangun 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 yang dapat dieksekusi META-INF/com/google/android/update-binary .

Updater berisi beberapa fungsi bawaan dan juru bahasa untuk bahasa skrip yang dapat diperluas ( edify ) yang mendukung perintah untuk tugas terkait pembaruan biasa. Pembaru mencari di file paket .zip untuk skrip 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 pembaruan.

Perbaiki sintaks

Skrip edify adalah ekspresi tunggal di mana semua nilai adalah string. String kosong salah dalam konteks Boolean dan semua string lainnya benar . 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

Setiap string karakter az, AZ, 0-9, _, :, /, . itu bukan kata yang dicadangkan dianggap sebagai string literal. (Kata-kata yang dicadangkan adalah if else maka endif. ) Literal string juga dapat muncul dalam tanda kutip ganda; ini adalah cara membuat nilai dengan spasi putih dan karakter lain yang tidak ada di set di atas. \n, \t, \", dan \\ berfungsi sebagai escape dalam string yang dikutip, seperti halnya \x ## .

&& dan || operator mengalami hubungan arus pendek; sisi kanan tidak dievaluasi jika hasil logis ditentukan oleh sisi kiri. Berikut ini adalah setara:

e1 && e2
if e1 then e2 endif

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

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

Fungsi bawaan

Sebagian besar fungsi pembaruan terkandung dalam fungsi yang tersedia untuk dieksekusi oleh skrip. (Sebenarnya ini adalah makro daripada fungsi dalam arti Lisp, karena mereka tidak perlu mengevaluasi semua argumen mereka.) Kecuali dinyatakan lain, fungsi mengembalikan true pada keberhasilan dan false pada kesalahan. Jika Anda ingin kesalahan membatalkan eksekusi skrip, gunakan fungsi abort() dan/atau assert() . Kumpulan fungsi yang tersedia di updater juga dapat diperluas untuk menyediakan fungsionalitas khusus perangkat .

abort([ msg ])
Membatalkan eksekusi skrip segera, dengan opsional msg . Jika pengguna telah mengaktifkan tampilan teks, pesan 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 gagal.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
Menerapkan tambalan biner ke src_file untuk menghasilkan tgt_file . Jika target yang diinginkan sama dengan sumber, berikan "-" 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. Gumpalan adalah tambalan yang akan diterapkan ketika konten file sumber saat ini memiliki SHA1 yang diberikan.

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

Sintaks khusus didukung untuk memperlakukan konten partisi Memory Technology Device (MTD) sebagai file, memungkinkan patch partisi mentah seperti boot. Untuk membaca partisi MTD, Anda harus mengetahui berapa banyak data yang ingin Anda baca karena partisi tersebut tidak memiliki gagasan 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 (ukuran, sha-1) pasangan; Anda dapat menentukan lebih dari satu jika ada beberapa kemungkinan untuk apa yang Anda harapkan untuk dibaca.

apply_patch_check( filename , sha1 [, sha1 , ...])
Mengembalikan nilai true 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 ditentukan sebagai 40 digit hex. Fungsi ini berbeda dari sha1_check(read_file( filename ), sha1 [, ...]) karena fungsi ini mengetahui untuk memeriksa salinan partisi cache, jadi apply_patch_check() akan berhasil bahkan jika file rusak oleh apply_patch() update yang terputus.
apply_patch_space( bytes )
Mengembalikan nilai true jika setidaknya byte ruang awal tersedia untuk menerapkan patch biner.
concat( expr [, expr , ...])
Mengevaluasi setiap ekspresi dan menggabungkannya. Operator + adalah gula sintaksis untuk fungsi ini dalam kasus khusus dari dua argumen (tetapi bentuk fungsi dapat mengambil sejumlah ekspresi). Ekspresi harus berupa string; itu tidak bisa menggabungkan gumpalan.
file_getprop( filename , key )
Membaca nama file yang diberikan, menafsirkannya sebagai file properti (mis /system/build.prop ), dan mengembalikan nilai kunci yang diberikan, atau string kosong jika kunci tidak ada.
format( fs_type , partition_type , location , fs_size , mount_point )
Memformat ulang partisi yang diberikan. Jenis partisi yang didukung:
  • fs_type="yaffs2" dan partition_type="MTD". Lokasi harus berupa nama partisi MTD; sistem file yaffs2 kosong dibangun 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 dibangun di sana. Jika fs_size adalah nol, sistem file mengambil seluruh partisi. Jika fs_size adalah angka positif, sistem file mengambil byte fs_size pertama dari partisi. Jika fs_size adalah angka negatif, sistem file mengambil semua kecuali |fs_size| . terakhir byte 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 adalah nol, sistem file mengambil seluruh partisi. Jika fs_size adalah angka positif, sistem file mengambil byte fs_size pertama dari partisi.
  • mount_point harus menjadi titik pemasangan di masa mendatang untuk sistem file.
getprop( key )
Mengembalikan nilai kunci properti sistem (atau string kosong, jika tidak ditentukan). Nilai properti sistem yang ditentukan oleh partisi pemulihan tidak harus sama dengan nilai dari sistem utama. Fungsi ini mengembalikan nilai dalam pemulihan.
greater_than_int( a , b )
Mengembalikan nilai true 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 mengembalikan nilai e1 , jika tidak maka akan mengevaluasi dan mengembalikan e2 (jika ada). Konstruksi "if ... else ... then ... endif" hanyalah gula sintaksis untuk fungsi ini.
is_mounted( mount_point )
Mengembalikan nilai true jika ada sistem file yang dipasang di mount_point .
is_substring( needle , haystack )
Mengembalikan true iff needle adalah substring dari haystack .
less_than_int( a , b )
Mengembalikan nilai 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 . partisi_tipe harus salah satu dari:
  • MTD . Nama adalah nama partisi MTD (misalnya, sistem, data pengguna; lihat /proc/mtd pada perangkat untuk daftar lengkap).
  • EMMC.

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

package_extract_dir( package_dir , dest_dir )
Ekstrak semua file dari paket di bawah package_dir dan tulis ke pohon 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 pembaruan dan menulisnya ke dest_file , menimpa file yang ada jika perlu. Tanpa argumen dest_file , mengembalikan konten file paket sebagai gumpalan biner.
read_file( filename )
Membaca nama file dan mengembalikan isinya sebagai gumpalan biner.
run_program( path [, arg , ...])
Mengeksekusi biner di path , melewati arg s. Mengembalikan status keluar program.
set_progress( frac )
Menyetel posisi pengukur kemajuan dalam potongan yang ditentukan oleh panggilan show_progress() terbaru. frac harus dalam kisaran [0.0, 1.0]. Pengukur kemajuan tidak pernah bergerak mundur; upaya untuk melakukannya diabaikan.
sha1_check( blob [, sha1 ])
Argumen blob adalah blob dari tipe yang dikembalikan oleh read_file() atau bentuk satu-argumen package_extract_file() . Tanpa argumen sha1 , fungsi ini mengembalikan hash SHA1 dari blob (sebagai string hex 40 digit). Dengan satu atau lebih argumen sha1 , fungsi ini mengembalikan hash SHA1 jika sama dengan salah satu argumen, atau string kosong jika tidak sama dengan salah satu argumen.
show_progress( frac , secs )
Memajukan pengukur kemajuan selama fraksi berikutnya dari panjangnya selama detik detik (harus bilangan bulat). detik mungkin 0, dalam hal ini meter tidak dimajukan secara otomatis tetapi dengan menggunakan fungsi set_progress() yang ditentukan di atas.
sleep( secs )
Tidur selama detik detik (harus bilangan bulat).
stdout( expr [, expr , ...])
Mengevaluasi setiap ekspresi dan membuang nilainya ke stdout. Berguna untuk debugging.
tune2fs( device [, arg , …])
Menyesuaikan argumen parameter yang dapat disetel pada perangkat .
ui_print([ text , ...])
Menggabungkan semua argumen teks dan mencetak hasilnya ke UI (di mana akan terlihat jika pengguna telah mengaktifkan tampilan teks).
unmount( mount_point )
Lepas sistem file yang dipasang di mount_point .
wipe_block_device( block_dev , len )
Menghapus byte len dari perangkat blok yang diberikan block_dev .
wipe_cache()
Menyebabkan partisi cache dihapus pada akhir penginstalan yang berhasil.
write_raw_image( filename_or_blob , partition )
Menulis gambar dalam filename_or_blob ke partisi MTD. filename_or_blob dapat berupa string yang menamai file lokal atau argumen 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 melakukannya, data harus di-unzip terlebih dahulu ke file lokal sementara.