OTA paketlerinin içinde

Sistem, bootable/recovery/updater 'ten güncelleyici ikilisini oluşturur ve OTA paketinde kullanır.

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

Updater, birkaç yerleşik işlev ve güncellemeyle ilgili tipik görevler için komutları destekleyen, genişletilebilir bir komut dosyası dili (edify) için bir yorumlayıcı içerir. Güncelleme aracı, META-INF/com/google/android/updater-script dosyasında bir komut dosyası olup olmadığını belirlemek için paket .zip dosyasını inceler.

Not: edify komut dosyası ve/veya yerleşik işlevler yaygın bir işlem değildir ancak güncelleme dosyasında hata ayıklama yapmanız gerektiğinde faydalı olabilir.

Edify söz dizimi

Edify komut dosyası, tüm değerlerin dize olduğu tek bir ifadedir. Boş dizelerin bağlamı boole ise false, diğer tüm dizelerin bağlamı ise true olur. 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

a-z, A-Z, 0-9, _, :, /, . karakterlerinden oluşan herhangi bir dize ayrılmış bir kelime olmayanlar dize değişmez ifadesi olarak kabul edilir. (Ayrılmış kelimeler if else ve ardından endif'dir.) Dize literalları çift tırnak içinde de görünebilir. Bu şekilde, boşluk ve yukarıdaki grupta bulunmayan diğer karakterler içeren değerler oluşturulur. \n, \t, \" ve \\, tırnak içine alınmış dizelerde \x## gibi çıkış karakteri olarak kullanılır.

&& ve || operatörleri kısa devre yapar; 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ın, ardından sağ tarafın değerlendirilmesi anlamına gelir. Değeri, sağ taraftaki ifadenin değeridir. Bir noktalı virgül, ifadenin ardından da görünebilir. Bu durumda, C tarzı ifadelerin etkisi simüle edilir:

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

Yerleşik işlevler

Güncelleme işlevlerinin çoğu, komut dosyaları tarafından yürütülebilen işlevlerde bulunur. (Bağımsız değişkenlerinin tümünü değerlendirmeleri gerekmediğinden, bunlar Lisp bağlamında işlev yerine makro olarak adlandırılır.) Aksi belirtilmediği sürece işlevler, başarılı olduğunda true, hata oluştuğunda false değerini döndürür. Hataların komut dosyasının yürütülmesini iptal etmesini istiyorsanız abort() ve/veya assert() işlevlerini kullanın. Güncelleyicide bulunan işlev grubu, cihazlara özel işlevler sağlamak için de genişletilebilir.

abort([msg])
İsteğe bağlı msg ile komut dosyasının yürütülmesini hemen durdurur. Kullanıcı metin görüntülemeyi açtıysa msg, kurtarma günlüğünde ve ekranda görünür.
assert(expr[, expr, ...])
Her expr değerini sırayla değerlendirir. Bunlardan herhangi biri yanlışsa "assert failed" mesajı ve başarısız ifadenin kaynak metniyle birlikte yürütmeyi hemen durdurur.
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
tgt_file oluşturmak için src_file dosyasına ikili bir yamalı uygular. İstenilen hedef kaynakla aynıysa tgt_file için "-" değerini iletin. tgt_sha1 ve tgt_size, hedef dosyanın beklenen nihai SHA1 karması ve boyutudur. Kalan bağımsız değişkenler, SHA1 karması (40 karakterlik onaltılık dize) ve bir blob olmak üzere çiftler halinde gelmelidir. Blob, kaynak dosyanın mevcut içeriği belirli bir SHA1'e sahip olduğunda uygulanacak yamayı ifade eder.

Yamalama işlemi, hedef dosyanın istenen SHA1 karmasına ve boyutuna sahip olmasını veya dosyaya dokunulmadığını garanti edecek şekilde güvenli bir şekilde yapılır. Dosya, kurtarılamaz bir ara durumda bırakılmaz. Yama işlemi kesintiye uğrarsa hedef dosya ara durumda olabilir. Önbelleğe alma bölümünde bir kopya bulunduğundan güncellemeyi yeniden başlatarak dosyayı başarıyla güncelleyebilirsiniz.

Bellek Teknolojisi Cihaz (MTD) bölümlerinin içeriğinin dosya olarak değerlendirilmesi için özel söz dizimi desteklenir. Bu sayede, önyükleme gibi ham bölümlere yama uygulanabilir. MTD bölümünü okumak için, bölümde dosya sonu kavramı olmadığından ne kadar veri okumak istediğinizi bilmeniz gerekir. Belirtilen bölümü okumak için "MTD:partition:size_1:sha1_1:size_2: sha1_2" dizesini dosya adı olarak kullanabilirsiniz. En az bir (boyut, sha-1) çifti belirtmeniz gerekir. Okumayı beklediğiniz şey için birden fazla olasılık varsa birden fazla çift belirtebilirsiniz.

apply_patch_check(filename, sha1[, sha1, ...])
dosyaadı dosyasının veya önbellek bölümündeki geçici kopyanın (varsa) SHA1 sağlama toplamı, belirtilen sha1 değerlerinden birine eşitse doğru değerini döndürür. sha1 değerleri 40 onaltılık basamak olarak belirtilir. Bu işlev, önbellek bölüm kopyasını kontrol etmeyi bildiği için sha1_check(read_file(filename), sha1 [, ...])'ten farklıdır. Bu nedenle, dosya kesintiye uğrayan bir apply_patch() update nedeniyle bozulmuş olsa bile apply_patch_check() başarılı olur.
apply_patch_space(bytes)
İkili yamalar uygulamak için en az bayt boş alan varsa doğru değerini döndürür.
concat(expr[, expr, ...])
Her ifadeyi değerlendirir ve bunları birleştirir. + operatörü, iki bağımsız değişkenin özel durumunda bu işlev için sintaks şekeridir (ancak işlev formu herhangi bir sayıda ifade alabilir). İfadeler dize olmalıdır; blob'lar birleştirilemez.
file_getprop(filename, key)
Belirtilen dosya adını okur, bir özellik dosyası (ör. /system/build.prop) olarak yorumlar ve belirtilen anahtarın değerini ya da 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; burada boş bir yaffs2 dosya sistemi oluşturulur. Kalan bağımsız değişkenler kullanılmaz.
  • fs_type="ext4" ve partition_type="EMMC". Konum, bölüme ait cihaz dosyası olmalıdır. Burada boş bir ext4 dosya sistemi oluşturulur. fs_size sıfır ise dosya sistemi, bölümün tamamını 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, bölümün son |fs_size| baytı dışındaki tümünü alır.
  • fs_type="f2fs" ve partition_type="EMMC". Konum, bölüme ait cihaz dosyası olmalıdır. fs_size, negatif olmayan bir sayı olmalıdır. fs_size sıfır ise dosya sistemi, bölümün tamamını kaplar. fs_size pozitif bir sayıysa dosya sistemi, bölümün ilk fs_size baytını alır.
  • mount_point, dosya sisteminin gelecekteki ekleme noktası olmalıdır.
getprop(key)
anahtar sistem özelliğinin değerini (veya tanımlanmamışsa boş dizeyi) döndürür. Kurtarma bölümü tarafından tanımlanan sistem özelliği değerleri, ana sistemdeki değerlerle aynı olmayabilir. Bu işlev, kurtarma işleminde olan değeri döndürür.
greater_than_int(a, b)
a (tam sayı olarak yorumlanır) b (tam sayı olarak yorumlanır) değerinden büyükse ve yalnızca bu durumda doğru değerini döndürür.
ifelse(cond, e1[, e2])
cond değerini değerlendirir ve doğruysa e1 değerini değerlendirip döndürür, aksi takdirde e2 değerini (varsa) değerlendirip döndürür. "if ... else ... then ... endif" yapısı, bu işlev için yalnızca söz dizimi süslemesidir.
is_mounted(mount_point)
mount_point konumunda bir dosya sistemi monte edilmişse doğru değerini döndürür.
is_substring(needle, haystack)
needle, haystack'in alt dizesiyse doğru değerini döndürür.
less_than_int(a, b)
a (tam sayı olarak yorumlanır) b (tam sayı olarak yorumlanır) değerinden küçükse doğru değerini döndürür.
mount(fs_type, partition_type, name, mount_point)
fs_type dosya sistemini mount_point noktasına bağlar. partition_type şu değerlerden biri olmalıdır:
  • MTD. Ad, MTD bölümünün adıdır (ör. sistem, kullanıcı verileri; tam liste için cihazdaki /proc/mtd bölümüne bakın).
  • EMMC.

Kurtarma işlemi varsayılan olarak herhangi bir dosya sistemini bağlamaz (kullanıcı SD karttan manuel olarak paket yükleme yapıyorsa SD kart hariç). Komut dosyanız, değiştirmesi gereken tüm bölümleri bağlamalıdır.

package_extract_dir(package_dir, dest_dir)
package_dir altındaki paketteki tüm dosyaları ayıklayıp 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 dest_file dosyasına yazar. dest_file bağımsız değişkeni olmadan, paket dosyasının içeriğini ikili program blob'u olarak döndürür.
read_file(filename)
dosya adı dosyasını okur ve içeriğini ikili bir blob olarak döndürür.
run_program(path[, arg, ...])
Arg'leri ileterek path adresindeki 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 parça içindeki ilerleme çubuğunun konumunu belirler. frac, [0,0; 1,0] aralığında olmalıdır. İlerleme göstergesi asla geriye doğru hareket etmez. Geriye doğru hareket ettirme girişimleri yoksayılır.
sha1_check(blob[, sha1])
Blob bağımsız değişkeni, read_file() tarafından döndürülen türde bir blob veya package_extract_file() 'in tek bağımsız değişkenli biçimidir. sha1 bağımsız değişkeni olmadan bu işlev, blob'un SHA1 karmasını (40 haneli bir onaltılık dize olarak) döndürür. Bir veya daha fazla sha1 bağımsız değişkeni varsa bu işlev, bağımsız değişkenlerden birine eşitse SHA1 karmasını, hiçbirine eşit değilse boş dizeyi döndürür.
show_progress(frac, secs)
İlerleme çubuğunu, secs saniye boyunca uzunluğunun sonraki frac kadarını ilerletir (tam sayı olmalıdır). secs 0 olabilir. Bu durumda ilerleme çubuğu otomatik olarak değil, yukarıda tanımlanan set_progress() işlevi kullanılarak ilerletilir.
sleep(secs)
secs saniye boyunca uykuda kalır (tam sayı olmalıdır).
stdout(expr[, expr, ...])
Her ifadeyi değerlendirir ve değerini stdout'a aktarır. Hata ayıklama için yararlıdır.
tune2fs(device[, arg, …])
Cihaz üzerinde ayarlanabilir parametreleri args 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 görüntülemeyi açtıysa burada görünür).
unmount(mount_point)
mount_point adresinde monte edilmiş dosya sisteminin bağlantısını kaldırır.
wipe_block_device(block_dev, len)
Belirli bir blok cihazın (block_dev) len baytını temizler.
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 adlı resim dosyasını MTD bölümüne yazar. dosya_adı_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 dosyayı bölüme kopyalamak için: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Not: Android 4.1'den önce yalnızca dosya adları kabul edildiğinden, bu işlemin yapılabilmesi için verilerin önce geçici bir yerel dosyaya arşivden çıkarılması gerekiyordu.