Di dalam paket OTA

Sistem membangun biner pembaru 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 penerjemah untuk bahasa skrip yang dapat diperluas ( edify ) yang mendukung perintah untuk tugas-tugas umum terkait pembaruan. Updater mencari di paket file .zip untuk skrip di file META-INF/com/google/android/updater-script .

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

Memperbaiki sintaksis

Skrip edify adalah ekspresi tunggal yang semua nilainya berupa string. String kosong bernilai 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 karakter apa pun az, AZ, 0-9, _, :, /, . itu bukan kata yang dilindungi undang-undang 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 dan karakter lain yang tidak termasuk dalam kumpulan di atas. \n, \t, \", dan \\ berfungsi sebagai pelolosan dalam string yang dikutip, seperti halnya \x ## .

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

e1 && e2
if e1 then e2 endif

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

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

Fungsi bawaan

Sebagian besar fungsionalitas pembaruan terkandung dalam fungsi yang tersedia untuk dieksekusi oleh skrip. (Sebenarnya ini adalah makro dan bukan fungsi dalam pengertian Lisp, karena mereka tidak perlu mengevaluasi semua argumennya.) Kecuali disebutkan sebaliknya, fungsi akan menghasilkan nilai true jika berhasil dan false jika error. Jika Anda ingin kesalahan membatalkan eksekusi skrip, gunakan fungsi abort() dan/ assert() . Rangkaian fungsi yang tersedia di pembaru juga dapat diperluas untuk menyediakan fungsionalitas khusus perangkat .

abort([ msg ])
Segera batalkan eksekusi skrip, dengan pesan opsional. 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 "assert failed" dan teks sumber ekspresi 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 sumbernya, berikan "-" untuk tgt_file . tgt_sha1 dan tgt_size adalah hash SHA1 akhir yang diharapkan dan ukuran file target. Argumen lainnya harus berpasangan: hash SHA1 (string hex 40 karakter) dan blob. Blob adalah patch yang akan diterapkan ketika 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 tersebut tidak akan dibiarkan dalam keadaan perantara yang tidak dapat dipulihkan. Jika proses terhenti selama patching, file target mungkin berada dalam status perantara; salinannya ada di partisi cache sehingga memulai ulang pembaruan dapat berhasil memperbarui file.

Sintaks khusus didukung untuk memperlakukan konten partisi Perangkat Teknologi Memori (MTD) sebagai file, memungkinkan patching 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: partisi : size_1 : sha1_1 : size_2 : sha1_2 " sebagai nama file untuk membaca partisi yang diberikan. Anda harus menentukan setidaknya satu pasangan (ukuran, sha-1) ; Anda dapat menentukan lebih dari satu jika ada beberapa kemungkinan untuk apa yang ingin Anda baca.

apply_patch_check( filename , sha1 [, sha1 , ...])
Mengembalikan nilai 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 ditentukan sebagai 40 digit hex. Fungsi ini berbeda dari sha1_check(read_file( filename ), sha1 [, ...]) karena ia mengetahui untuk memeriksa salinan partisi cache, jadi apply_patch_check() akan berhasil meskipun file rusak karena apply_patch() update yang terputus.
apply_patch_space( bytes )
Mengembalikan nilai benar jika setidaknya byte ruang awal tersedia untuk menerapkan patch biner.
concat( expr [, expr , ...])
Evaluasi setiap ekspresi dan gabungkan. Operator + adalah gula sintaksis untuk fungsi ini dalam kasus khusus dari dua argumen (tetapi bentuk fungsi dapat mengambil sejumlah ekspresi). Ekspresinya harus berupa string; itu tidak dapat menggabungkan gumpalan.
file_getprop( filename , key )
Membaca nama file yang diberikan, menafsirkannya sebagai file properti (misalnya /system/build.prop ), dan mengembalikan 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 partisi_type="MTD". Lokasi harus berupa nama partisi MTD; sistem file yaffs2 kosong dibangun di sana. Argumen yang tersisa tidak digunakan.
  • fs_type="ext4" dan partisi_type="EMMC". Lokasi harus berupa file perangkat untuk partisi tersebut. Sistem file ext4 kosong dibangun di sana. Jika fs_size adalah nol, sistem file akan menempati 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 akan mengambil semuanya kecuali |fs_size| terakhir byte partisi.
  • fs_type="f2fs" dan partisi_type="EMMC". Lokasi harus berupa file perangkat untuk partisi tersebut. fs_size harus berupa angka bukan negatif. Jika fs_size adalah nol, sistem file akan menempati seluruh partisi. Jika fs_size adalah angka positif, sistem file mengambil byte fs_size pertama dari partisi.
  • mount_point harus menjadi titik mount masa depan untuk sistem file.
getprop( key )
Mengembalikan nilai kunci properti sistem (atau string kosong, jika tidak ditentukan). Nilai properti sistem yang ditentukan oleh partisi pemulihan belum tentu sama dengan nilai properti sistem utama. Fungsi ini mengembalikan nilai dalam pemulihan.
greater_than_int( a , b )
Mengembalikan nilai 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 mengembalikan nilai e1 , jika tidak maka mengevaluasi dan mengembalikan e2 (jika ada). Konstruk "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 nilai true jika needle adalah substring dari haystack .
less_than_int( a , b )
Mengembalikan nilai benar jika a (ditafsirkan sebagai bilangan bulat) lebih kecil 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 diubah.

package_extract_dir( package_dir , dest_dir )
Ekstrak semua file dari paket di bawah package_dir dan tuliskan ke pohon terkait 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 , meneruskan arg s. Mengembalikan status keluar program.
set_progress( frac )
Menetapkan posisi pengukur kemajuan dalam potongan yang ditentukan oleh panggilan show_progress() terbaru. frac harus berada dalam kisaran [0.0, 1.0]. Pengukur kemajuan tidak pernah bergerak mundur; upaya untuk membuatnya melakukannya diabaikan.
sha1_check( blob [, sha1 ])
Argumen blob adalah blob dari tipe yang dikembalikan oleh read_file() atau bentuk satu argumen dari 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 ke frac berikutnya dari panjangnya selama detik detik (harus berupa bilangan bulat). detik mungkin 0, dalam hal ini meteran tidak dimajukan secara otomatis tetapi dengan menggunakan fungsi set_progress() yang ditentukan di atas.
sleep( secs )
Tidur selama beberapa detik (harus bilangan bulat).
stdout( expr [, expr , ...])
Evaluasi setiap ekspresi dan buang 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 (yang akan terlihat jika pengguna telah mengaktifkan tampilan teks).
unmount( mount_point )
Melepaskan 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 instalasi 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 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 mencapai hal ini, data harus di-unzip terlebih dahulu ke dalam file lokal sementara.