OTA paketlerinin içinde

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

Paketin kendisi META-INF/com/google/android/update-binary yürütülebilir ikili dosyasını 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örevler için 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ı için .zip dosyası paketine bakar.

Not: edify 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 yardımcı olabilir.

Sözdizimini düzenle

Bir edify betiği, tüm değerlerin dize olduğu tek bir ifadedir. Boole bağlamında boş dizeler false ve diğer tüm dizeler true . Edify, aşağıdaki operatörleri destekler (olağan 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ış sözcükler if else sonra endif'tir. ) 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 oluşturulacağı budur. \n, \t, \" ve \\, tıpkı \x ## gibi alıntılanan dizeler içinde kaçış işlevi görür.

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

e1 && e2
if e1 then e2 endif

; operatör bir sıra 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, bu nedenle efekt C tarzı ifadeleri simüle eder:

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

Yerleşik işlevler

Çoğu güncelleme işlevi, komut dosyaları tarafından yürütülebilecek işlevlerde bulunur. (Aslında bunlar, tüm argümanlarını değerlendirmeleri gerekmediğinden, Lisp anlamındaki işlevlerden ziyade makrolardır .) Aksi belirtilmedikçe, işlevler başarı durumunda true ve hata durumunda false döndürür. Komut dosyasının yürütülmesini durdurmak için hatalar istiyorsanız, abort() ve/veya assert() işlevlerini kullanın. Güncelleyicide bulunan işlevler seti, cihaza özel işlevsellik sağlamak üzere genişletilebilir.

abort([ msg ])
İsteğe bağlı msg ile komut dosyasının yürütülmesini hemen durdurur. Kullanıcı metin ekranını açtıysa, 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" mesajı ve başarısız ifadenin kaynak metni ile yürütmeyi hemen iptal eder.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
tgt_file öğesini üretmek için src_file öğesine bir ikili yama uygular. İstenen hedef kaynakla aynıysa, tgt_file için "-" iletin. tgt_sha1 ve tgt_size , hedef dosyanın beklenen son SHA1 karma değeri ve boyutudur. Kalan bağımsız değişkenler çiftler halinde gelmelidir: bir SHA1 karma (40 karakterlik bir onaltılık dize) ve bir blob. Blob, kaynak dosyanın mevcut içeriği verilen SHA1'e sahip olduğunda uygulanacak yamadır.

Yama, hedef dosyanın istenen SHA1 karma değerine ve boyutuna sahip olmasını veya dosyaya dokunulmamasını garanti eden güvenli bir şekilde yapılır - kurtarılamaz bir ara durumda bırakılmaz. Yama sırasında işlem kesintiye uğrarsa, hedef dosya bir ara durumda olabilir; önbellek bölümünde bir kopya vardır, bu nedenle güncellemeyi yeniden başlatmak 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ümlerin yamalanmasına olanak tanır. Bir MTD bölümünü okumak için, bölüm dosya sonu kavramına sahip olmadığı için ne kadar veri okumak istediğinizi bilmelisiniz. 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 (beden, sha-1) çifti belirtmelisiniz; Okumayı umduğunuz şey için birden fazla olasılık varsa, birden fazla belirtebilirsiniz.

apply_patch_check( filename , sha1 [, sha1 , ...])
Dosya adının veya önbellek bölümündeki (varsa) geçici kopyanın içeriği, verilen sha1 değerlerinden birine eşit bir SHA1 sağlama toplamına sahipse true döndürür. sha1 değerleri 40 onaltılık basamak olarak belirtilir. Bu işlev sha1_check(read_file( filename ), sha1 [, ...]) 'den farklıdır, çünkü önbellek bölümü kopyasını kontrol etmeyi bilir, bu nedenle dosya kesintiye uğramış bir apply_patch() update tarafından bozulmuş olsa bile apply_patch_check() başarılı olur.
apply_patch_space( bytes )
İkili yamaları uygulamak için en az baytlık boş alan varsa true değerini döndürür.
concat( expr [, expr , ...])
Her ifadeyi değerlendirir ve birleştirir. + operatörü, iki bağımsız değişkenin özel durumunda bu işlev için sözdizimsel şekerdir (ancak işlev formu herhangi bir sayıda ifade alabilir). İfadeler dize olmalıdır; blobları birleştiremez.
file_getprop( filename , key )
Verilen dosya adını okur, onu bir özellik dosyası olarak yorumlar (örneğin /system/build.prop ) ve verilen anahtarın değerini veya anahtar yoksa 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; orada boş bir yaffs2 dosya sistemi kurulur. Kalan argümanlar kullanılmaz.
  • fs_type="ext4" ve partition_type="EMMC". Konum, bölümün aygıt dosyası olmalıdır. Orada boş bir ext4 dosya sistemi oluşturulmuştur. fs_size sıfır ise, dosya sistemi tüm bölümü kaplar. fs_size pozitif bir sayıysa, dosya sistemi bölümün ilk fs_size baytını alır. fs_size negatif bir sayıysa, dosya sistemi son |fs_size| hariç hepsini alır. bölümün baytları.
  • fs_type="f2fs" ve partition_type="EMMC". Konum, bölümün aygıt dosyası olmalıdır. fs_size negatif olmayan bir sayı olmalıdır. fs_size sıfır ise, dosya sistemi tüm bölümü kaplar. fs_size pozitif bir sayıysa, dosya sistemi bölümün ilk fs_size baytını alır.
  • mount_point, dosya sistemi için gelecekteki bağlama noktası olmalıdır.
getprop( key )
Sistem özellik anahtarının (veya tanımlı değilse boş dizenin) değerini döndürür. Kurtarma bölümü tarafından tanımlanan sistem özelliği değerleri, mutlaka ana sisteminkilerle aynı değildir. Bu işlev, kurtarmadaki değeri döndürür.
greater_than_int( a , b )
Yalnızca ve ancak (iff) a (bir tamsayı olarak yorumlanır) b'den (bir tamsayı olarak yorumlanır) büyükse true değerini döndürür.
ifelse( cond , e1 [, e2 ])
koşulu değerlendirir ve doğruysa e1 değerini değerlendirir ve döndürür, aksi takdirde değerlendirir ve e2 (varsa) döndürür. "if ... else ... o zaman ... endif" yapısı bu işlev için sadece sözdizimsel şekerdir.
is_mounted( mount_point )
mount_point'te monte edilmiş bir dosya sistemi varsa true değerini döndürür.
is_substring( needle , haystack )
true iff iğnesini döndürür, haystack öğesinin bir alt dizesidir.
less_than_int( a , b )
a (bir tamsayı olarak yorumlanır) b'den küçükse (bir tamsayı olarak yorumlanır) doğru döndürür.
mount( fs_type , partition_type , name , mount_point )
mount_point'te fs_type dosya sistemini bağlar. partition_type şunlardan biri olmalıdır:
  • MTD . Ad, bir MTD bölümünün adıdır (örn. 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 paketten tüm dosyaları çıkarır ve dest_dir altındaki karşılık gelen ağaca yazar. Mevcut dosyaların üzerine yazılır.
package_extract_file( package_file [, dest_file ])
Güncelleme paketinden tek bir package_file ayıklar ve gerekirse mevcut dosyaların üzerine yazarak dest_file öğesine yazar. dest_file 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 , ...])
arg s'yi geçerek path konumunda ikili dosyayı yürütür. Programın çıkış durumunu döndürür.
set_progress( frac )
En son show_progress() çağrısı tarafından tanımlanan öbek 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; yapma girişimleri 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şken biçimidir. sha1 bağımsız değişkeni olmadan, bu işlev blobun SHA1 karmasını (40 basamaklı bir onaltılık dize olarak) döndürür. Bir veya daha fazla sha1 argümanıyla, bu fonksiyon argümanlardan birine eşitse SHA1 karmasını veya bunlardan herhangi birine eşit değilse boş dizeyi döndürür.
show_progress( frac , secs )
İlerleme ölçeri , saniye saniye boyunca uzunluğunun bir sonraki bölümü boyunca ilerletir (bir tamsayı olmalıdır). saniye 0 olabilir, bu durumda sayaç otomatik olarak değil, yukarıda tanımlanan set_progress() işlevi kullanılarak ilerletilir.
sleep( secs )
Saniye saniye uyur (tam sayı olmalıdır).
stdout( expr [, expr , ...])
Her ifadeyi değerlendirir ve değerini stdout'a döker. Hata ayıklamak için kullanışlıdır.
tune2fs( device [, arg , …])
Cihazdaki ayarlanabilir parametreleri args'yi ayarlar.
ui_print([ text , ...])
Tüm metin argümanlarını birleştirir ve sonucu kullanıcı arayüzüne yazdırır (kullanıcı metin ekranını açtıysa burada görünür).
unmount( mount_point )
mount_point'te bağlanan dosya sisteminin bağlantısını kaldırır.
wipe_block_device( block_dev , len )
Verilen blok aygıtının len baytlarını siler block_dev .
wipe_cache()
Başarılı bir yüklemenin 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. OTA paketinden bir bölüme dosya 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 edilirdi, bu nedenle bunu gerçekleştirmek için verilerin ilk olarak geçici bir yerel dosyaya sıkıştırılması gerekiyordu.