OTA paketlerinin içinde

Sistem, bootable/recovery/updater kaynağından güncelleyici ikili programını oluşturur ve bunu kullanır inceleyebilirsiniz.

Paketin kendisi bir .zip dosyasıdır (ota_update.zip, incremental_ota_update.zip) kaldırın. META-INF/com/google/android/update-binary .

Güncelleyici, çeşitli yerleşik işlevler ve genişletilebilir komut dosyaları için bir çevirmen içerir dili (edify) kullanır. Güncelleyici görünümleri dosyadaki bir komut dosyası için paketin .zip dosyasında META-INF/com/google/android/updater-script

Not: edify komut dosyasını ve/veya yerleşik işlevlerini kullanmak yaygın bir uygulama değildir. etkinliğidir, ancak güncelleme dosyasında hata ayıklamanız gerektiğinde yararlı olabilir.

Söz dizimini düzenleyin

Ediify komut dosyası, tüm değerlerin dize olduğu tek bir ifadedir. Boş dizeler Boole bağlamında false ve diğer tüm dizeler true değerine ayarlanır. Edify, aşağıdaki operatörler (genel anlamları taşır):

(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, _, :, /, . karakterlerini içeren herhangi bir dize ayrılmış bir kelime değil dize değişmez değeri olarak değerlendirilir. (Ayrılmış kelimeler if else, endif şeklindedir.) İp düz değerler de çift tırnak içinde görünebilir; Boşluklar ve boşluklarla değerler nasıl oluşturulur? yukarıdaki kümede olmayan diğer karakterler. \n, \t, \" ve \\ tırnak işaretleri içinde kaçış işlevi görür dizeler ve \x## gibi öğeler içerir.

&& ve || işleçleri kısa devre yaparlar. tarafınızca sunulan mantıksal sonuç sol tarafta belirlenir. Aşağıdakiler eşdeğerdir:

e1 && e2
if e1 then e2 endif

; operatör bir sıra noktasıdır; yani önce sol tarafı, sonra da sağ taraf. Değeri, sağ taraftaki ifadenin değeridir. Noktalı virgül sonra C stili 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. (Bunlar, lisp anlamında işlevler yerine makrolardır. çünkü tüm argümanlarını değerlendirmeleri gerekmez.) Aksi belirtilmedikçe işlevler true (doğru), hata için false (yanlış) değerini alır. Hataların, komut dosyası için abort() ve/veya assert() işlevlerini kullanın. güncelleyicide bulunan işlevler de genişletilebilir. cihaza özgü işlevler.

abort([msg])
. İsteğe bağlı mesaj ile birlikte komut dosyasının yürütülmesini hemen iptal eder. Kullanıcı metin ekranı açıksa kurtarma günlüğünde ve ekranda msg görünür.
assert(expr[, expr, ...])
. Her bir expr'i sırayla değerlendirir. Herhangi bir yanlış değerdeyse "iddia başarısız" mesajı ve başarısız ifadenin kaynak metni olur.
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
. tgt_file oluşturmak için src_file öğesine bir ikili yama uygular. Öğe istenen hedef kaynakla aynıysa "-" geçirin tgt_file için. tgt_sha1 ve tgt_size, hedef dosyanın beklenen nihai SHA1 karması ve boyutudur. Kalan bağımsız değişkenler çiftler halinde olmalıdır: bir SHA1 karma (40 karakterlik bir onaltılık dize) ve bir blob. Blob kaynak dosyanın mevcut içeriği belirtilen SHA1'e sahip olduğunda uygulanacak yamadır.

Yama işlemi, hedef dosyanın istediğiniz SHA1 karması ve boyutunda olduğu ya da değiştirilmediği için kurtarılamaz durumda kalır. ara durum. Yama uygulaması sırasında işlem kesintiye uğrarsa hedef dosya Orta seviyededir; Önbellek bölümünde bir kopya bulunduğu için güncellemeyi yeniden başlatma dosyayı başarıyla güncelleyebilir.

Bellek Teknolojisi Cihazı'nın (MTD) içeriğini işlemek için özel söz dizimi desteklenir bölümlerini dosya olarak kullanarak önyükleme gibi ham bölümlerin yama uygulanmasına olanak tanır. Bir MTD okumak için bu bölümde, mevcut bir bölümde mevcut olmadığından ne kadar veri okumak istediğinizi bir dosya sonu sistemidir. Şu dizeyi kullanabilirsiniz: "ATD:partition:size_1:sha1_1:size_2: sha1_2" olarak dosya adına göre belirleyebilirsiniz. En az bir tane belirtmelisiniz (size, sha-1) pair; birden fazla öğe varsa birden fazla mümkün olduğunca fazla ihtiyaç duyabilir.

apply_patch_check(filename, sha1[, sha1, ...])
. Önbellek bölümündeki filename içeriğinin veya geçici kopyanın içeriği doğruysa doğru değerini döndürür (varsa) belirtilen sha1 değerlerinden birine eşit bir SHA1 sağlamasına sahip olmalıdır. sha1 değerleri, 40 onaltılık basamak olarak belirtilir. Bu işlev şundan farklıdır: Bildiği kadarıyla sha1_check(read_file(filename), sha1 [, ...]) önbellek bölümü kopyasını kontrol edin. Böylece apply_patch_check(), dosya, kesintiye uğrayan bir apply_patch() update nedeniyle bozulmuş.
apply_patch_space(bytes)
. İkili program uygulamak için en az bayt boş alan varsa true değerini döndürür yama uygulayın.
concat(expr[, expr, ...])
. Her ifadeyi değerlendirir ve birleştirir. Bu örnekte + operatörü söz dizimseldir iki bağımsız değişkenin özel durumunda işlev (ancak fonksiyon biçimi herhangi bir sayıda ifadeleri) kullanmalarına izin verin. İfadeler dize olmalıdır. blobları birleştiremez.
file_getprop(filename, key)
. Verilen dosya adını okur, bir özellik dosyası olarak yorumlar (ör. /system/build.prop) ve verilen key değerini veya key yoksa boş dize.
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" section_type="MTD" olarak da adlandırabilirsiniz. Konum, MTD adı olmalıdır bölüm; burada boş bir yaffs2 dosya sistemi oluşturulur. Kalan bağımsız değişkenler kullanılmıyor.
  • fs_type="ext4" section_type="EMMC" olarak da adlandırabilirsiniz. Konum, bölüm. Burada, boş bir ext4 dosya sistemi oluşturulur. fs_size sıfırsa 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 dosya sistemi, toplam |fs_size| bölüm.
  • fs_type="f2fs" section_type="EMMC" olarak da adlandırabilirsiniz. Konum, bölüm. fs_size negatif olmayan bir sayı olmalıdır. fs_size sıfırsa 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 ekleme noktası olmalıdır.
getprop(key)
. key sistem özelliği olan değerin (veya tanımlanmamışsa boş dizenin) değerini döndürür. Kurtarma bölümü tarafından tanımlanan sistem özelliği değerleri her zaman aynı olmayabilir bu değişime ayak uyduramaz. Bu işlev, kurtarma sırasındaki değeri döndürür.
greater_than_int(a, b)
. Yalnızca (iff) a (tam sayı olarak yorumlanır) şundan büyükse ve yalnızca şundan büyükse true değerini döndürür: b (tam sayı olarak yorumlanır).
ifelse(cond, e1[, e2])
. cond değerini değerlendirir ve 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 ... o zaman ... bu işlev için söz dizimsel niteliktedir.
is_mounted(mount_point)
mount_point konumuna eklenmiş bir dosya sistemi varsa true değerini döndürür.
is_substring(needle, haystack)
needle, haystack dizesinin bir alt dizesiyse true değerini döndürür.
less_than_int(a, b)
. a (tam sayı olarak yorumlanır) b'den küçükse true değerini döndürür ( bir tam sayı).
mount(fs_type, partition_type, name, mount_point)
. mount_point konumuna fs_type türünde bir dosya sistemi ekler. partition_type şöyle olmalıdır: Şunlardan biri:
  • ABB. Ad, bir YTB bölümünün adıdır (ör.sistem, kullanıcı verileri; bkz. tam liste için cihaza /proc/mtd) bakın.
  • EMMC

Kurtarma işlemi varsayılan olarak herhangi bir dosya sistemini (kullanıcı SD karttan bir paketi manuel olarak yükleme); komut dosyanız, bölmesi gerekir.

package_extract_dir(package_dir, dest_dir)
. paket_dir altındaki tüm dosyaları paketten çıkarır ve dest_dir altındaki ilgili ağacın altında bulunur. 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 bunu şuraya yazar: dest_file. Şu olmadan: dest_file bağımsız değişkeni, paket dosyasının içeriğini ikili blob olarak döndürür.
read_file(filename)
Filename'i okur ve dosyanın içeriğini ikili blob olarak döndürür.
run_program(path[, arg, ...])
. path alanındaki ikili dosyayı, bağımsız değişkenleri ileterek yürütür. Programın çıkış durumunu döndürür.
set_progress(frac)
. İlerleme ölçerin konumunu en son show_progress() sesli arama. frac, [0,0, 1,0] aralığında olmalıdır. İlerleme durumu sayaç asla geri gitmez; girişimleri dikkate alınmaz.
sha1_check(blob[, sha1])
. blob bağımsız değişkeni, read_file() veya tek bağımsız değişkenli package_extract_file() şeklindedir. sha1 bağımsız değişkenleri olmadan bu işlev, blobun 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şkenleri için, bu işlev aşağıdaki durumlardan birine eşitse SHA1 karmasını döndürür: bağımsız değişkenleri veya hiçbirine eşit değilse boş dizeyi kullanabilirsiniz.
show_progress(frac, secs)
. İlerleme sayacını, uzunluğunun bir sonraki frac'ı üzerinden secs saniye (tam sayı olmalıdır). sn 0 olabilir. Bu durumda sayaç otomatik olarak değil, daha sonra tanımlı set_progress() işlevinin kullanılmasıyla bölümünü ziyaret edin.
sleep(secs)
Sn. saniye uyur (tam sayı olmalıdır).
stdout(expr[, expr, ...])
Her bir ifadeyi değerlendirir ve değerini stdout'a atar. Hata ayıklama için kullanışlıdır.
tune2fs(device[, arg, …])
Cihazda ayarlanabilir parametrelerin bağımsız değişkenlerini ayarlar.
ui_print([text, ...])
. Tüm text bağımsız değişkenlerini birleştirir ve sonucu kullanıcı arayüzüne (burada kullanıcı metin ekranını açmışsa görünür).
unmount(mount_point)
mount_point konumuna eklenen dosya sisteminin bağlantısını keser.
wipe_block_device(block_dev, len)
Belirtilen blok cihaz block_dev'in len baytlarını siler.
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)
. Resmi filename_or_blob dosyasındaki MTD bölümüne yazar. filename_or_blob, yerel dosyayı adlandıran bir dize veya blob değerli bir bağımsız değişken olabilir veriler yer alır. OTA paketindeki bir dosyayı bir bölüme kopyalamak için şunu kullanın: write_raw_image(package_extract_file("zip_filename"), "partition_name"); .
'nı inceleyin.

Not: Android 4.1'den önce yalnızca dosya adları kabul ediliyordu. Bu nedenle bunun için verilerin ilk olarak geçici bir yerel dosyaya açılması gerekiyordu.