Fastboot'u kullanıcı alanına taşı

Android 10 ve sonraki sürümler, fastboot uygulamasını bootloader'dan kullanıcı alanına taşıyarak yeniden boyutlandırılabilir bölümleri destekler. Bu yer değiştirme, yanıp sönen kodun sürdürülebilir ve test edilebilir bir ortak konuma taşınmasını sağlar. Bu ortak konuma, yalnızca donanım soyutlama katmanı (HAL) tarafından uygulanan fastboot'un yalnızca satıcıya özgü kısımları bulunur. Ayrıca Android 12 ve sonraki sürümler, ek bir fastboot komutuyla yanıp sönen ramdisk'leri destekler.

Fastboot ve kurtarma özelliklerini birleştirin

Kullanıcı alanı hızlı başlatma ve kurtarma işlemleri benzer olduğundan bunları tek bir bölüm veya ikili programda birleştirebilirsiniz. Bu, daha az alan kullanma, genel olarak daha az bölüme sahip olma ve fastboot ve kurtarma işlevlerinin çekirdek ile kitaplıklarını paylaşma gibi avantajlar sağlar.

Bootloader'ın fastbootd özelliğini desteklemek için boot-fastboot adlı yeni bir başlatma kontrol bloğu (BCB) komutunu uygulaması gerekir. Bootloader, fastbootd moduna girmek için BCB mesajının komut alanına boot-fastboot yazar ve BCB'nin recovery alanını değiştirmeden bırakır (kesintisiz kurtarma görevlerinin yeniden başlatılmasını sağlamak için). status, stage ve reserved alanları da değişmez. Bootloader, BCB komut alanında boot-fastboot ifadesini gördükten sonra yüklenir ve kurtarma görüntüsünün içinde başlatılır. Daha sonra kurtarma işlemi BCB mesajını ayrıştırır ve fastbootd moduna geçer.

ADB komutları

Bu bölümde, fastbootd entegrasyonu için adb komutu açıklanmaktadır. Komutun, sistem veya kurtarma tarafından yürütülmesine bağlı olarak farklı sonuçları vardır.

Komut Açıklama
reboot fastboot
  • fastbootd (sistem) konumunda yeniden başlatılır.
  • fastbootd değerini yeniden başlatmadan (kurtarma) doğrudan girer.

Fastboot komutları

Bu bölümde, mantıksal bölümleri yanıp söndürmeye ve yönetmeye yönelik yeni komutlar dahil olmak üzere fastbootd entegrasyonu için kullanılan fastboot komutları açıklanmaktadır. Bazı komutların, bootloader tarafından mı yoksa fastbootd tarafından mı yürütüldüğüne bağlı olarak farklı sonuçları olur.

Komut Açıklama
reboot recovery
  • Kurtarma işleminde yeniden başlatılır (bootloader).
  • Kurtarma işlemine, yeniden başlatmadan doğrudan girer (fastbootd).
reboot fastboot fastbootd modunda yeniden başlatılır.
getvar is-userspace
  • yes (fastbootd) değerini döndürür.
  • no (bootloader) değerini döndürür.
getvar is-logical:<partition> Belirtilen bölüm mantıksal bir bölümse yes değerini, aksi halde no değerini döndürür. Mantıksal bölümler aşağıda listelenen tüm komutları destekler.
getvar super-partition-name Süper bölümün adını döndürür. Süper bölüm bir A/B bölümüyse (genellikle değildir) ad, mevcut alan son ekini içerir.
create-logical-partition <partition> <size> Belirtilen ad ve boyutla mantıksal bir bölüm oluşturur. Ad mantıksal bir bölüm olarak zaten bulunmamalıdır.
delete-logical-partition <partition> Verilen mantıksal bölümü siler (bölümü etkili bir şekilde siler).
resize-logical-partition <partition> <size> Mantıksal bölümü, içeriğini değiştirmeden yeni boyuta yeniden boyutlandırır. Yeniden boyutlandırma işlemini gerçekleştirmek için yeterli alan yoksa başarısız olur.
update-super <partition> Süper bölüm meta verilerinde yapılan değişiklikleri birleştirir. Birleştirme mümkün değilse (örneğin, cihazdaki biçim desteklenmeyen bir sürümse) bu komut başarısız olur. İsteğe bağlı bir wipe parametresi, birleştirme işlemi gerçekleştirmek yerine cihazın meta verilerinin üzerine yazar.
flash <partition><filename> ] Bir dosyayı Flash bölümüne yazar. Cihaz kilitli durumda olmalıdır.
erase <partition> Bir bölümü siler (güvenli silme için gerekli değildir). Cihaz, kilitsiz durumda olmalıdır.
getvar <variable> | all Bootloader değişkenini veya tüm değişkenleri görüntüler. Değişken yoksa bir hata döndürür.
set_active <slot>

Belirtilen A/B başlatma yuvasını active olarak ayarlar. Bir sonraki başlatma denemesinde sistem belirtilen yuvadan başlatılır.

A/B desteği için slotlar, bağımsız olarak başlatılabilen, kopya bölüm gruplarıdır. Alanlar a, b vb. olarak adlandırılır ve bölüm adına _a, _b ve benzer son eklerin eklenmesiyle ayırt edilir.

reboot Cihazı normal bir şekilde yeniden başlatır.
reboot-bootloader (veya reboot bootloader) Cihazı bootloader'da yeniden başlatır.
fastboot fetch vendor_boot <out.img>

Yeni çıkan satıcı disklerini desteklemek için Android 12 ve sonraki sürümlerde kullanın.

Tüm bölüm boyutunu ve parça boyutunu alır. Her parça için verileri alır ve ardından verileri <out.img> ile birleştirir

Ayrıntılar için fastboot fetch vendor_boot <out.img> başlıklı makaleyi inceleyin.

fastboot flash vendor_boot:default <vendor-ramdisk.img>

Yanıp sönen satıcı RAM'lerini desteklemek için Android 12 ve sonraki sürümlerde kullanın.

Bu, flash komutunun özel bir varyantıdır. fastboot fetch çağrılmış gibi bir fetch vendor_boot resim işlevi gerçekleştirir. Yanıp söndüğü yeni vendor_boot görüntüsü, başlatma üst bilgisi sürümünün 3 veya sürüm 4 olmasına bağlıdır.

Ayrıntılar için fastboot flash vendor_boot:default <vendor-ramdisk.img> sayfasına göz atın.

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Yanıp sönen satıcı RAM'lerini desteklemek için Android 12 ve sonraki sürümlerde kullanın.

vendor_boot görselini getirir. Tedarikçi firma başlatma başlığı sürüm 3 ise hata döndürür. Sürüm 4 ise doğru tedarikçi firma ramdisk parçasını (varsa) bulur. Bunu belirtilen resimle değiştirir, boyutları ve ofsetleri yeniden hesaplar ve yeni vendor_boot image yanıp söner.

Ayrıntılar için fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> sayfasını inceleyin.

Fastboot ve bootloader

Bootloader bootloader, radio ve boot/recovery bölümlerini günceller. Ardından cihaz, fastboot (kullanıcı alanı) bölümünde başlatılır ve diğer tüm bölümleri yanıp söner. Bootloader aşağıdaki komutları desteklemelidir.

Komut Açıklama
download Resmi yüklemek üzere indirir.
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ recovery/boot bölümünü ve bootloader'ı yanıp söner.
reboot Cihazı yeniden başlatır.
reboot fastboot Fastboot moduna geçmek için yeniden başlatılır.
reboot recovery Kurtarma işlemi için yeniden başlatılır.
getvar Kurtarma/önyükleme görüntüsünün yanıp sönmesi için gerekli olan bir bootloader değişkenini alır (örneğin, current-slot ve max-download-size).
oem <command> Komut, OEM tarafından tanımlanır.

Dinamik bölümler

Bootloader, dinamik bölümlerin yanıp sönmesine veya silinmesine izin vermemeli ve bu işlemler denenmesi halinde hata döndürmelidir. İleriye dönük dinamik bölümlendirmeli cihazlarda, fastboot aracı (ve bootloader), bootloader modundayken dinamik bölümü doğrudan yüklemek için bir güç modunu destekler. Örneğin system, geriye dönük yapılmış cihazdaki dinamik bir bölümse fastboot --force flash system komutunun kullanılması, fastbootd yerine bootloader'ın bölümü yenilemesini sağlar.

Çevrimdışı modda şarj

Bir cihaz kapalı modda şarjı destekliyor veya başka bir şekilde, güç uygulandığında özel bir modda otomatik olarak açılıyorsa fastboot oem off-mode-charge 0 komutunun uygulanması, bu özel modları atlayarak cihazın, kullanıcı güç düğmesine basmış gibi başlatılması gerekir.

Fastboot OEM HAL'si

Bootloader'ın hızlı önyüklemesini tamamen değiştirmek için fastboot'un mevcut tüm fastboot komutlarını işlemesi gerekir. Bu komutların çoğu OEM'ler tarafından sağlanır ve belgelenmiştir ancak özel bir uygulama gerektirir. OEM'ye özgü birçok komut için belge yoktur. Fastboot HAL, bu tür komutları işlemek için gerekli OEM komutlarını belirtir. OEM'ler kendi komutlarını da uygulayabilir.

Fastboot HAL'nin tanımı aşağıdaki gibidir:

import IFastbootLogger;

/**
 * IFastboot interface implements vendor specific fastboot commands.
 */
interface IFastboot {
    /**
     * Returns a bool indicating whether the bootloader is enforcing verified
     * boot.
     *
     * @return verifiedBootState True if the bootloader is enforcing verified
     * boot and False otherwise.
     */
    isVerifiedBootEnabled() generates (bool verifiedBootState);

    /**
     * Returns a bool indicating the off-mode-charge setting. If off-mode
     * charging is enabled, the device autoboots into a special mode when
     * power is applied.
     *
     * @return offModeChargeState True if the setting is enabled and False if
     * not.
     */
    isOffModeChargeEnabled() generates (bool offModeChargeState);

    /**
     * Returns the minimum battery voltage required for flashing in mV.
     *
     * @return batteryVoltage Minimum battery voltage (in mV) required for
     * flashing to be successful.
     */
    getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

    /**
     * Returns the file system type of the partition. This is only required for
     * physical partitions that need to be wiped and reformatted.
     *
     * @return type Can be ext4, f2fs or raw.
     * @return result SUCCESS if the operation is successful,
     * FAILURE_UNKNOWN if the partition is invalid or does not require
     * reformatting.
     */
    getPartitionType(string partitionName) generates (FileSystemType type, Result result);

    /**
     * Executes a fastboot OEM command.
     *
     * @param oemCmd The oem command that is passed to the fastboot HAL.
     * @response result Returns the status SUCCESS if the operation is
     * successful,
     * INVALID_ARGUMENT for bad arguments,
     * FAILURE_UNKNOWN for an invalid/unsupported command.
     */
    doOemCommand(string oemCmd) generates (Result result);

};

Fastbootd'u etkinleştir

Bir cihazda fastbootd iznini etkinleştirmek için:

  1. device.mk bölgesinde PRODUCT_PACKAGES grubuna fastbootd ekleyin: PRODUCT_PACKAGES += fastbootd.

  2. Fastboot HAL, başlatma kontrolü HAL ve durum HAL'lerinin, kurtarma görüntüsünün bir parçası olarak paketlendiğinden emin olun.

  3. fastbootd tarafından gereken cihaza özel SEPolicy izinlerini ekleyin. Örneğin, fastbootd, bu bölümü yüklemek için cihaza özel bir bölüme yazma erişimi gerektirir. Ayrıca, fastboot HAL uygulaması için cihaza özel izinler de gerekebilir.

Kullanıcı alanı hızlı önyüklemesini doğrulamak için Tedarikçi Test Paketi'ni (VTS) çalıştırın.

Flash satıcı diskleri

Android 12 ve sonraki sürümler, bir cihazdan tam vendor_boot görüntüsünü çeken ek bir fastboot komutuyla yanıp sönen ramdiskleri destekler. Bu komut, ana makine tarafı fastboot aracından tedarikçi başlatma üst bilgisini okumasını, yeniden görüntüsünü ve yeni görüntüyü yüklemesini ister.

Tam vendor_boot görüntüsünü almak için Android 12'de hem fastboot protokolüne hem de protokolün fastbootd uygulamasına fetch:vendor_boot komutu eklendi. Fastbootd'ın bunu uyguladığını ancak bootloader'ın kendisinin uygulamayabileceğini unutmayın. OEM'ler, fetch:vendor_boot komutunu protokolün bootloader uygulamasına ekleyebilir. Ancak, komut bootloader modunda tanınmazsa bootloader modunda tek tek satıcı ramdislerinin yanıp sönmesi satıcı tarafından desteklenen bir seçenek değildir.

Bootloader değişiklikleri

getvar:max-fetch-size ve fetch:name komutları fastbootd içinde uygulanır. Bootloader'da yanıp sönen satıcı RAM'lerini desteklemek için aşağıdaki iki komutu uygulamanız gerekir.

Fastbootd değişiklikleri

getvar:max-fetch-size, max-download-size ile benzer. Cihazın bir DATA yanıtında gönderebileceği maksimum boyutu belirtir. Sürücü, bu değerden daha büyük bir boyut getirmemelidir.

fetch:name[:offset[:size]], cihazda bir dizi kontrol gerçekleştirir. Aşağıdakilerin tümü doğruysa fetch:name[:offset[:size]] komutu verileri döndürür:

  • Cihaz, hata ayıklaması yapılabilir bir derleme çalıştırıyor.
  • Cihazın kilidi açık (önyükleme durumu turuncu).
  • Getirilen bölüm adı: vendor_boot.
  • size değeri 0 < size <= max-fetch-size aralığındadır.

Bunlar doğrulandığında fetch:name[:offset[:size]], bölüm boyutunu ve ofseti döndürür. Aşağıdakileri göz önünde bulundurun:

  • fetch:name, fetch:name:0:partition_size ile eşdeğer olan fetch:name:0 öğesinin eşdeğeridir.
  • fetch:name:offset, fetch:name:offset:(partition_size - offset) ile eşdeğerdir

Dolayısıyla fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset) olur.

offset veya partition_size (ya da her ikisi) belirtilmediğinde offset için 0 ve size için partition_size - offset değeri olarak hesaplanan varsayılan değerler kullanılır.

  • Zaman farkı belirtildi, boyut belirtilmemiş: size = partition_size - offset
  • İkisi de belirtilmedi: Her ikisi için de varsayılan değerler kullanıldı, size = partition_size - 0.

Örneğin, fetch:foo, ofset 0 olduğunda foo bölümünün tamamını getirir.

Sürücü değişiklikleri

Sürücü değişikliklerini uygulamak için fastboot aracına komutlar eklendi. Her biri Fastboot komutları tablosundaki tam tanımına bağlıdır.

  • fastboot fetch vendor_boot out.img

    • Yığın boyutunu belirlemek için getvar max-fetch-size öğesini çağırır.
    • Tüm bölümün boyutunu belirlemek için getvar partition-size:vendor_boot[_a] öğesini çağırır.
    • Her parça için fastboot fetch vendor_boot[_a]:offset:size öğesini çağırır. (Parça boyutu, vendor_boot boyutundan büyüktür, bu nedenle normalde yalnızca bir parça bulunur.)
    • Verileri birbirine ekler: out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Bu, flash komutunun özel bir varyantıdır. vendor_boot resmini, fastboot fetch çağrılmış gibi getirir.

    • Tedarikçi firma başlatması başlık sürümü ise aşağıdakileri yapar:
      • Tedarikçi firma ramdisk'ini verilen resimle değiştirir.
      • Yeni vendor_boot resmini yanıp söner.
    • Tedarikçi firma başlatma başlığı sürüm 4 ise aşağıdakileri yapar:
      • Tüm tedarikçi firma RAM'ini verilen görüntüyle değiştirir. Böylece, belirtilen resim vendor_boot görüntüsünde tek tedarikçi firma ramdisk parçası olur.
      • Tedarikçi firma ramdisk tablosundaki boyutu ve ofseti yeniden hesaplar.
      • Yeni vendor_boot resmini yanıp söner.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    vendor_boot image öğesini, fastboot fetch çağrılmış gibi getirir.

    • Tedarikçi firma başlatma başlığı sürüm 3 ise hata döndürür.
    • Tedarikçi firma başlatma başlığı sürüm 4 ise aşağıdakileri yapar:

      • foo adlı tedarikçi firma ramdisk parçasını bulur. Bulunamazsa veya birden fazla eşleşme varsa hata döndürür.
      • Tedarikçi firma ramdisk parçasını belirtilen resimle değiştirir.
      • Tedarikçi firma ramdisk tablosundaki her bir boyutu ve ofseti yeniden hesaplar.
      • Yeni vendor_boot resmini yanıp söner.

mkbootimg

default adı, Android 12 ve sonraki sürümlerde satıcı ramdisk parçalarını adlandırmak için ayrılmıştır. Fastboot flash vendor_boot:default anlamı aynı kalsa da ramdisk parçalarınızı default olarak adlandırmamanız gerekir.

SELinux değişiklikleri

Yanıp sönen tedarikçi ramdisk'lerini desteklemek için fastbootd.te ürününde değişiklik yapıldı.