OTA güncellemelerini uygulama

Kablosuz (OTA) güncellemeleri uygulamak için bootloader'ın başlatma sırasında kurtarma RAM diskine erişebilmesi gerekir. Cihaz, değiştirilmemiş bir AOSP kurtarma görüntüsü kullanıyorsa bootloader, misc bölümündeki ilk 32 baytı okur. Buradaki veriler boot-recovery ile eşleşirse bootloader, recovery görüntüsüne önyükleme yapar. Bu yöntem, bekleyen kurtarma işlemlerinin (ör. OTA uygulama veya veri kaldırma) tamamlanmasını sağlar.

Kurtarma ve önyükleyici tarafından iletişim için kullanılan flaş bellekteki bir bloğun içeriğiyle ilgili ayrıntılar için bootable/recovery/bootloader_message/bootloader_message.h adresine bakın.

A/B güncellemeleri olan cihazlar

A/B güncellemelerini kullanan cihazlarda OTA güncellemelerini desteklemek için cihaz önyükleyicisinin aşağıdaki ölçütleri karşıladığından emin olun.

Genel ölçütler

  • OTA üzerinden güncellenen tüm bölümler, ana sistem başlatılırken (ve kurtarma modunda güncellenmezken) güncellenebilir olmalıdır.

  • Önyükleyici, system bölümünü önyüklemek için çekirdek komut satırında şu değeri iletir: ro root=/dev/[node] rootwait init=/init.

  • HAL'den markBootSuccessful işlevini çağırmak Android çerçevesinin sorumluluğundadır. Bootloader, hiçbir zaman bir bölümü başarıyla başlatılmış olarak işaretlememelidir.

Önyükleme kontrolü HAL'si için destek

Bootloader, boot_control HAL'ı desteklemelidir. Bu HAL, hardware/libhardware/include/hardware/boot_control.h içinde tanımlanmıştır. Güncelleyici, boot control HAL'yi sorgular, kullanılmayan önyükleme yuvasını günceller, HAL'yi kullanarak etkin yuvayı değiştirir ve güncellenen işletim sisteminde yeniden başlatılır. Ayrıntılı bilgi için Başlatma kontrolü HAL'sini uygulama başlıklı makaleyi inceleyin.

Slotlar için destek

Bootloader, aşağıdakiler de dahil olmak üzere bölümler ve yuvalarla ilgili işlevleri desteklemelidir:

  • Bölüm adları, hangi bölümlerin önyükleyicideki belirli bir yuvaya ait olduğunu tanımlayan bir sonek içermelidir. Bu tür her bölüm için has-slot:partition base name değerine sahip bir değişken yes vardır. Aralıklar, _a, _b, _c vb. sonekine sahip bölümlere karşılık gelecek şekilde alfabetik olarak adlandırılır. Önyükleyici, androidboot.slot_suffix komut satırı özelliğini kullanarak hangi aralığın başlatıldığını işletim sistemine bildirmelidir. Bu özellik, Android 12 veya sonraki sürümlerle kullanıma sunulan cihazlar için bootconfig üzerinden ayarlanır.

  • slot-retry-count değeri, setActiveBootSlot geri çağırma yoluyla önyükleme kontrolü HAL'si veya fastboot set_active komutu aracılığıyla pozitif bir değere (genellikle 3) sıfırlanır. Bir yuvaya ait olan bölüm değiştirildiğinde önyükleyici, "başarıyla başlatıldı"yı temizler ve yuvanın yeniden deneme sayısını sıfırlar.

Bootloader, hangi yuvanın yükleneceğini de belirlemelidir. Şekilde örnek bir karar verme süreci gösterilmektedir.

Bootloader yuvalama akışı
1. şekil. Önyükleyici yuvalama akışı
  1. Hangi yerin denenmesi gerektiğini belirleyin. slot-unbootable olarak işaretlenmiş bir yuva yüklemeye çalışmayın. Bu yuva, fastboot tarafından döndürülen değerlerle tutarlı olmalı ve mevcut yuva olarak adlandırılır.

  2. Mevcut yuva slot-successful olarak işaretlenmemişse ve slot-retry-count = 0 içeriyorsa mevcut yuvayı slot-unbootable olarak işaretleyin. Ardından, unbootable olarak işaretlenmemiş ve slot-successful olarak işaretlenmiş farklı bir yuva seçin. Bu yuva artık seçili yuvadır. Mevcut bir yuva yoksa kurtarma modunda başlatın veya kullanıcıya anlamlı bir hata mesajı gösterin.

  3. Uygun boot.img seçeneğini belirleyin ve çekirdek komut satırında doğru sistem bölümünün yolunu ekleyin.

  4. Çekirdek komut satırı slot_suffix parametresini doldurun.

  5. Başlatma slot-successful olarak işaretlenmemişse slot-retry-count değerini azaltın.

fastboot yardımcı programı, herhangi bir flash komutu çalıştırıldığında hangi bölümün flash'leneceğini belirler. Örneğin, fastboot flash system system.img komutunu çalıştırmak önce current-slot değişkenini sorgular, ardından sonucu birleştirerek sisteme aktarılacak bölümün adını oluşturur (system_a, system_b vb.).

Geçerli yuva, fastboot set_active komutu veya boot control HAL setActiveBootSlot komutu kullanılarak ayarlandığında önyükleyici geçerli yuvayı güncellemeli, slot-unbootable ve slot-successful değerlerini temizlemeli ve yeniden deneme sayısını sıfırlamalıdır (slot-unbootable değerini temizlemenin tek yolu budur).

A/B güncellemeleri olmayan cihazlar

A/B güncellemelerini kullanmayan cihazlarda OTA güncellemelerini desteklemek için (bkz. Non-A/B updatable devices) cihaz önyükleyicisinin aşağıdaki ölçütleri karşıladığından emin olun.

  • recovery bölümü, desteklenen bir bölümden (cache, userdata) sistem görüntüsünü okuyabilen ve system bölümüne yazabilen bir görüntü içermelidir.

  • Bootloader, doğrudan kurtarma moduna önyüklemeyi desteklemelidir.

  • Radyo görüntüsü güncellemeleri destekleniyorsa recovery bölümü de radyoyu flaşlayabilmelidir. Bu işlem iki şekilde yapılabilir:

    • Bootloader, radyoyu flaşlar. Bu durumda, güncellemeyi tamamlamak için kurtarma bölümünden yeniden başlatarak bootloader'a geri dönmek mümkün olmalıdır.

    • Kurtarma görüntüsü, radyoyu yanıp söner. Bu işlev, ikili kitaplık veya yardımcı program olarak sağlanabilir.