OTA paketlerinin içinde

Sistem, güncelleyici ikili dosyasını bootable/recovery/updater oluşturur ve bunu bir OTA paketinde kullanır.

Paketin kendisi, yürütülebilir ikili META-INF/com/google/android/update-binary içeren bir .zip dosyasıdır ( ota_update.zip , incremental_ota_update.zip ).

Güncelleyici, çeşitli yerleşik işlevler ve tipik güncellemeyle ilgili görevlere yönelik komutları destekleyen genişletilebilir bir komut dosyası dili ( edify ) için bir yorumlayıcı içerir. Güncelleyici META-INF/com/google/android/updater-script dosyasındaki bir komut dosyasını paket .zip dosyasında arar.

Not: Düzenleme komut dosyasını ve/veya yerleşik işlevleri kullanmak yaygın bir etkinlik değildir, ancak güncelleme dosyasında hata ayıklamanız gerekiyorsa yararlı olabilir.

Sözdizimini düzenle

Düzenleme komut dosyası, tüm değerlerin dize olduğu tek bir ifadedir. Boş dizeler Boolean bağlamında false'tur ve diğer tüm dizeler true'dur . Edify aşağıdaki operatörleri destekler (normal anlamlarıyla):

(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

az, AZ, 0-9, _, :, /, karakterlerinden oluşan herhangi bir dize. bu ayrılmış bir kelime değil, bir dize değişmezi olarak kabul edilir. (Ayrılmış kelimeler if else than endif şeklindedir. ) Dize değişmezleri çift tırnak içinde de görünebilir; Yukarıdaki kümede olmayan boşluk ve diğer karakterlerle değerlerin nasıl yaratılacağı budur. \n, \t, \" ve \\, \x ## gibi tırnak içine alınan dizeler içinde kaçış görevi görür.

&& ve || operatörler kısa devre yapıyor; Mantıksal sonuç sol taraf tarafından belirleniyorsa sağ taraf değerlendirilmez. Aşağıdakiler eşdeğerdir:

e1 && e2
if e1 then e2 endif

; operatör bir dizi noktasıdır; önce sol tarafı, sonra sağ tarafı değerlendirmek demektir. Değeri sağ taraftaki ifadenin değeridir. Bir ifadeden sonra noktalı virgül de görünebilir, böylece efekt C tarzı ifadeleri simüle eder:

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

Yerleşik işlevler

Güncelleme işlevlerinin çoğu, komut dosyaları tarafından yürütülmeye uygun işlevlerde bulunur. (Aslında bunlar Lisp anlamındaki işlevlerden ziyade makrolardır , çünkü tüm argümanlarını değerlendirmeleri gerekmez.) Aksi belirtilmediği sürece, işlevler başarı durumunda true , hata durumunda false değerini döndürür. Hataların betiğin yürütülmesini iptal etmesini istiyorsanız abort() ve/ assert() işlevlerini kullanın. Güncelleyicide mevcut olan işlevler kümesi , cihaza özgü işlevsellik sağlayacak şekilde genişletilebilir.

abort([ msg ])
İsteğe bağlı mesajla betiğin yürütülmesini anında iptal eder. Kullanıcı metin görüntülemeyi açmışsa kurtarma günlüğünde ve ekranda mesaj görünür.
assert( expr [, expr , ...])
Her ifadeyi sırayla değerlendirir. Herhangi biri yanlışsa, "iddia başarısız oldu" mesajıyla ve başarısız olan ifadenin kaynak metniyle yürütmeyi derhal iptal edin.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
tgt_file dosyasını üretmek için src_file dosyasına ikili bir yama uygular. İstenilen hedef kaynakla aynıysa tgt_file yerine "-" iletin. tgt_sha1 ve tgt_size hedef dosyanın beklenen son SHA1 karması ve boyutudur. Kalan bağımsız değişkenler çiftler halinde gelmelidir: bir SHA1 karması (40 karakterlik onaltılık dize) ve bir blob. Blob, kaynak dosyanın mevcut içeriği belirtilen SHA1'e sahip olduğunda uygulanacak yamadır.

Düzeltme eki, hedef dosyanın istenen SHA1 karma değerine ve boyutuna sahip olmasını ya da dokunulmamış olmasını (kurtarılamaz bir ara durumda bırakılmamasını) garanti edecek şekilde güvenli bir şekilde yapılır. Yama uygulama sırasında süreç kesintiye uğrarsa hedef dosya bir ara durumda olabilir; önbellek bölümünde bir kopya mevcut olduğundan güncellemenin yeniden başlatılması dosyayı başarıyla güncelleyebilir.

Bellek Teknolojisi Aygıtı (MTD) bölümlerinin içeriğini dosyalar olarak işlemek için özel sözdizimi desteklenir ve önyükleme gibi ham bölümlere yama uygulanmasına olanak tanır. Bir MTD bölümünü okumak için, bölümün dosya sonu kavramı olmadığından ne kadar veri okumak istediğinizi bilmeniz gerekir. Verilen bölümü okumak için dosya adı olarak "MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 " dizesini kullanabilirsiniz. En az bir (boyut, sha-1) çift belirtmelisiniz; okumayı beklediğiniz şey için birden fazla olasılık varsa birden fazlasını belirtebilirsiniz.

apply_patch_check( filename , sha1 [, sha1 , ...])
Dosya adının içeriği veya önbellek bölümündeki geçici kopya (varsa), verilen sha1 değerlerinden birine eşit bir SHA1 sağlama toplamına sahipse true değerini döndürür. sha1 değerleri 40 onaltılık basamak olarak belirtilir. Bu işlev sha1_check(read_file( filename ), sha1 [, ...]) işlevinden farklıdır, çünkü önbellek bölümü kopyasını kontrol etmeyi bilir, dolayısıyla dosya kesintiye uğrayan bir apply_patch() update nedeniyle bozulmuş olsa bile apply_patch_check() başarılı olacaktır.
apply_patch_space( bytes )
İkili yamaların uygulanması için en az baytlık boş alan mevcutsa true değerini döndürür.
concat( expr [, expr , ...])
Her ifadeyi değerlendirir ve bunları birleştirir. + operatörü, iki argümanın özel durumunda bu fonksiyon için sözdizimsel bir şekerdir (ancak fonksiyon formu herhangi bir sayıda ifade alabilir). İfadeler dizeler olmalıdır; blobları birleştiremez.
file_getprop( filename , key )
Verilen dosya adını okur, bunu bir özellikler dosyası (örn. /system/build.prop ) olarak yorumlar ve verilen anahtarın değerini veya anahtar mevcut değilse boş dizeyi döndürür.
format( fs_type , partition_type , location , fs_size , mount_point )
Belirli bir bölümü yeniden biçimlendirir. Desteklenen bölüm türleri:
  • fs_type = "yaffs2" ve partition_type = "MTD". Konum, MTD bölümünün adı olmalıdır; Burada boş bir yaffs2 dosya sistemi oluşturulmuştur. Kalan argümanlar kullanılmaz.
  • fs_type = "ext4" ve partition_type = "EMMC". Konum, bölümün cihaz dosyası olmalıdır. Burada boş bir ext4 dosya sistemi oluşturulmuştur. fs_size sıfırsa, dosya sistemi bölümün tamamını kaplar. fs_size pozitif bir sayıysa, dosya sistemi bölümün ilk fs_size baytlarını alır. Eğer fs_size negatif bir sayı ise, dosya sistemi son |fs_size| dışındakileri alır. bölümün baytları.
  • fs_type = "f2fs" ve partition_type = "EMMC". Konum, bölümün cihaz dosyası olmalıdır. fs_size negatif olmayan bir sayı olmalıdır. fs_size sıfırsa, dosya sistemi bölümün tamamını kaplar. fs_size pozitif bir sayıysa, dosya sistemi bölümün ilk fs_size baytlarını alır.
  • mount_point dosya sisteminin gelecekteki bağlama noktası olmalıdır.
getprop( key )
Sistem özellik anahtarının değerini (veya tanımlanmamışsa boş dizeyi) döndürür. Kurtarma bölümü tarafından tanımlanan sistem özelliği değerlerinin ana sisteminkilerle aynı olması gerekmez. Bu işlev, kurtarma işlemindeki değeri döndürür.
greater_than_int( a , b )
Yalnızca (iff) a (tamsayı olarak yorumlanır) b'den (tamsayı olarak yorumlanır) büyükse doğru değerini döndürür.
ifelse( cond , e1 [, e2 ])
cond'u değerlendirir ve eğer doğruysa e1 değerini değerlendirir ve döndürür, aksi takdirde e2'yi (varsa) değerlendirir ve döndürür. "If...else...then...endif" yapısı bu işlev için sadece sözdizimsel bir şekerdir.
is_mounted( mount_point )
Mount_point'e monte edilmiş bir dosya sistemi varsa true değerini döndürür.
is_substring( needle , haystack )
Gerçek değeri döndürür iff iğne samanlığın bir alt dizisidir.
less_than_int( a , b )
a (tamsayı olarak yorumlanır) b'den küçükse (tamsayı olarak yorumlanır) true değerini döndürür.
mount( fs_type , partition_type , name , mount_point )
fs_type dosya sistemini mount_point noktasına bağlar. bölüm_türü aşağıdakilerden biri olmalıdır:
  • MTD . Ad, bir MTD bölümünün adıdır (örneğin, sistem, kullanıcı verileri; tam liste için aygıtta /proc/mtd bakın).
  • EMMC.

Kurtarma varsayılan olarak herhangi bir dosya sistemini bağlamaz (kullanıcı SD karttan bir paketi manuel olarak kuruyorsa SD kart hariç); betiğinizin değiştirmesi gereken bölümleri bağlaması gerekir.

package_extract_dir( package_dir , dest_dir )
package_dir altındaki paketteki tüm dosyaları çıkarır ve bunları dest_dir altındaki ilgili ağaca yazar. Mevcut dosyaların üzerine yazılır.
package_extract_file( package_file [, dest_file ])
Güncelleme paketinden tek bir package_file dosyasını çıkarır ve gerekirse mevcut dosyaların üzerine yazarak bunu dest_file dosyasına yazar. Hedef_dosyası bağımsız değişkeni olmadan, paket dosyasının içeriğini ikili bir blob olarak döndürür.
read_file( filename )
Dosya adını okur ve içeriğini ikili bir blob olarak döndürür.
run_program( path [, arg , ...])
İkili dosyayı path konumunda çalıştırarak arg s'yi geçirir. Programın çıkış durumunu döndürür.
set_progress( frac )
En son show_progress() çağrısı tarafından tanımlanan yığın içindeki ilerleme ölçerin konumunu ayarlar. frac [0,0, 1,0] aralığında olmalıdır. İlerleme ölçer asla geriye doğru hareket etmez; bunu yapmaya yönelik girişimler göz ardı edilir.
sha1_check( blob [, sha1 ])
Blob bağımsız değişkeni, read_file() tarafından döndürülen türden bir blob veya package_extract_file() öğesinin tek bağımsız değişkenli biçimidir. Sha1 bağımsız değişkeni olmadan bu işlev, blobun SHA1 karmasını döndürür (40 basamaklı onaltılık dize olarak). Bir veya daha fazla sha1 argümanıyla bu işlev, argümanlardan birine eşitse SHA1 karmasını veya bunlardan hiçbirine eşit değilse boş dizeyi döndürür.
show_progress( frac , secs )
İlerleme ölçeri saniye cinsinden uzunluğunun bir sonraki kesri boyunca ilerletir (bir tamsayı olmalıdır). saniye 0 olabilir; bu durumda sayaç otomatik olarak ilerletilmez ancak yukarıda tanımlanan set_progress() işlevi kullanılarak ilerletilir.
sleep( secs )
Saniye saniye boyunca uyur (bir tamsayı olmalıdır).
stdout( expr [, expr , ...])
Her ifadeyi değerlendirir ve değerini stdout'a aktarır. Hata ayıklamak için kullanışlıdır.
tune2fs( device [, arg , …])
Cihazdaki ayarlanabilir args parametrelerini ayarlar.
ui_print([ text , ...])
Tüm metin bağımsız değişkenlerini birleştirir ve sonucu kullanıcı arayüzüne yazdırır (kullanıcı metin ekranını açtığında görünür olacaktır).
unmount( mount_point )
Mount_point konumuna bağlanan dosya sisteminin bağlantısını keser.
wipe_block_device( block_dev , len )
Belirtilen blok aygıtının len baytlarını siler Block_dev .
wipe_cache()
Başarılı bir kurulumun sonunda önbellek bölümünün silinmesine neden olur.
write_raw_image( filename_or_blob , partition )
filename_or_blob içindeki görüntüyü MTD bölümüne yazar. dosyaadı_veya_blob, yerel bir dosyayı adlandıran bir dize veya yazılacak verileri içeren blob değerli bir bağımsız değişken olabilir. Bir dosyayı OTA paketinden bir bölüme kopyalamak için şunu kullanın: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Not: Android 4.1'den önce yalnızca dosya adları kabul ediliyordu; dolayısıyla bunu başarmak için önce verilerin geçici bir yerel dosyaya açılması gerekiyordu.