Fastboot'u Kullanıcı Alanına Taşıma

Android 10 ve üstü, fastboot uygulamasını önyükleyiciden kullanıcı alanına taşıyarak yeniden boyutlandırılabilir bölümleri destekler. Bu yer değiştirme, bir donanım soyutlama katmanı (HAL) tarafından uygulanan fastboot'un yalnızca satıcıya özel bölümleriyle, yanıp sönen kodun bakımı yapılabilir ve test edilebilir bir ortak konuma taşınmasını sağlar. Ek olarak, Android 12 ve sonraki sürümler, eklenen bir fastboot komutu aracılığıyla ramdisklerin yanıp sönmesini destekler.

Fastboot ve kurtarmayı birleştirme

Kullanıcı alanı hızlı başlatma ve kurtarma benzer olduğundan, bunları bir bölüm veya ikili dosyada birleştirebilirsiniz. Bu, daha az alan kullanma, genel olarak daha az bölüme sahip olma ve hızlı başlatma ve kurtarma işleminin çekirdeklerini ve kitaplıklarını paylaşması gibi avantajlar sağlar.

fastbootd desteklemek için, önyükleyici, boot-fastboot için yeni bir önyükleme kontrol bloğu (BCB) komutu uygulamalıdır. fastbootd moduna girmek için, bootloader, BCB mesajının komut alanına boot-fastboot yazar ve BCB'nin recovery alanını değiştirmeden bırakır (kesilmiş kurtarma görevlerinin yeniden başlatılmasını sağlamak için). status , stage ve reserved alanlar da değişmeden kalır. Bootloader, BCB komut alanında boot-fastboot gördükten sonra kurtarma görüntüsüne yüklenir ve önyükleme yapar. Recovery daha sonra BCB mesajını ayrıştırır ve fastbootd moduna geçer.

ADB komutları

Bu bölüm, fastbootd entegre etmek için adb komutunu açıklar. Komutun sistem tarafından mı yoksa kurtarma tarafından mı yürütüldüğüne bağlı olarak farklı sonuçları vardır.

Emretmek Tanım
reboot fastboot
  • fastbootd (sistem) yeniden başlatılır.
  • Yeniden başlatma (kurtarma) olmadan doğrudan fastbootd girer.

Hızlı başlatma komutları

Bu bölümde, mantıksal bölümlerin yanıp sönmesi ve yönetilmesi için yeni komutlar da dahil olmak üzere fastbootd tümleştirmek için fastboot komutları açıklanmaktadır. Bazı komutların, bootloader tarafından mı yoksa fastbootd tarafından mı yürütüldüklerine bağlı olarak farklı sonuçları vardır.

Emretmek Tanım
reboot recovery
  • Kurtarmaya yeniden başlar (önyükleyici).
  • Yeniden başlatma olmadan doğrudan kurtarmaya girer ( fastbootd ).
reboot fastboot fastbootd yeniden başlatılır.
getvar is-userspace
  • yes ( fastbootd ) döndürür.
  • no (önyükleyici) döndürür.
getvar is-logical: <partition> Verilen bölüm mantıksal bir bölümse yes , aksi takdirde no 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, geçerli yuva son ekini içerir.
create-logical-partition <partition> <size> Verilen ad ve boyutta mantıksal bir bölüm oluşturur. Ad, mantıksal bölüm olarak zaten mevcut olmamalıdır.
delete-logical-partition <partition> Verilen mantıksal bölümü siler (bölümü etkin bir şekilde siler).
resize-logical-partition <partition> <size> İçeriğini değiştirmeden mantıksal bölümü yeni boyuta yeniden boyutlandırır. Yeniden boyutlandırmayı gerçekleştirmek için yeterli alan yoksa başarısız olur.
update-super <partition> Süper bölüm meta verilerindeki 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 gerçekleştirmek yerine aygıtın meta verilerinin üzerine yazar.
flash <partition> [ <filename> ] Flash bölümüne bir dosya yazar. Cihaz kilidi açık durumda olmalıdır.
erase <partition> Bir bölümü siler (güvenli silme için gerekli değildir). Cihaz kilidi açık durumda olmalıdır.
getvar <variable> | all Bir önyükleyici 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>

Verilen A/B önyükleme yuvasını active olarak ayarlar. Bir sonraki önyükleme denemesinde, sistem belirtilen yuvadan önyüklenir.

A/B desteği için yuvalar, bağımsız olarak önyüklenebilen yinelenen bölüm kümeleridir. Yuvalar a , b vb. olarak adlandırılır ve bölüm adına _a , _b vb. sonekler eklenerek farklılaştırılır.

reboot Cihazı normal şekilde yeniden başlatır.
reboot-bootloader (veya reboot bootloader ) Aygıtı önyükleyiciye yeniden başlatır.
fastboot fetch vendor_boot <out.img>

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

Tüm bölüm boyutunu ve yığın boyutunu alır. Her yığın için veri alır, ardından verileri <out.img> birleştirir

Ayrıntılar için, bkz. fastboot fetch vendor_boot <out.img> .

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

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

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

Ayrıntılar için, bkz. fastboot flash vendor_boot:default <vendor-ramdisk.img> .

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

vendor_boot görüntüsünü getirir. Satıcı önyükleme başlığı sürüm 3 ise bir hata döndürür. Bu sürüm 4 ise, doğru satıcı ramdisk parçasını (varsa) bulur. Bunu verilen görüntüyle değiştirir, boyutları ve ofsetleri yeniden hesaplar ve yeni vendor_boot image yanıp söner.

Ayrıntılar için, bkz. fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

Fastboot ve önyükleyici

Önyükleyici, bootloader , radio ve boot/recovery bölümlerini yanıp söner, ardından aygıt hızlı önyüklemeye (kullanıcı alanı) önyükleme yapar ve diğer tüm bölümleri yanıp söner. Önyükleyici aşağıdaki komutları desteklemelidir.

Emretmek Tanım
download Görüntüyü flaşa indirir.
flash recovery <image> / flash boot <image> / flash bootloader <image> / recovery/boot bölümünü ve önyükleyiciyi yanıp söner.
reboot Cihazı yeniden başlatır.
reboot fastboot Fastboot için yeniden başlatır.
reboot recovery Kurtarma 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 önyükleyici değişkenini alır (örneğin, current-slot ve max-download-size ).
oem <command> OEM tarafından tanımlanan komut.

Dinamik bölümler

Önyükleyici, dinamik bölümlerin yanıp sönmesine veya silinmesine izin vermemeli ve bu işlemler denenirse bir hata döndürmelidir. Güçlendirilmiş dinamik bölümleme aygıtları için, fastboot aracı (ve önyükleyici), önyükleyici modundayken dinamik bölümü doğrudan flaşlamak için bir zorlama modunu destekler. Örneğin system , sonradan takılan aygıtta dinamik bir bölümse, fastboot --force flash system komutunun kullanılması, önyükleyicinin ( fastbootd yerine) bölümü flash etmesini sağlar.

Kapalı modda şarj

Bir cihaz kapalı modda şarjı destekliyorsa veya güç uygulandığında otomatik olarak özel bir moda otomatik olarak açılıyorsa, fastboot oem off-mode-charge 0 komutunun uygulanması bu özel modları atlamalıdır, böylece cihaz sanki kullanıcı basmış gibi başlatılır. güç düğmesi.

Fastboot OEM HAL'ı

Bootloader fastboot'u tamamen değiştirmek için fastboot'un mevcut tüm fastboot komutlarını işlemesi gerekir. Bu komutların çoğu OEM'lerdendir ve belgelenmiştir ancak özel bir uygulama gerektirir. OEM'e özgü birçok komut belgelenmemiştir. Bu tür komutları işlemek için fastboot HAL, 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'yi etkinleştirme

Bir cihazda fastbootd etkinleştirmek için:

  1. device.mk içindeki PRODUCT_PACKAGES dosyasına fastbootd ekleyin: PRODUCT_PACKAGES += fastbootd fastbootd .

  2. Fastboot HAL, önyükleme denetimi HAL ve sistem durumu HAL'inin kurtarma görüntüsünün parçası olarak paketlendiğinden emin olun.

  3. fastbootd için gerekli olan herhangi bir cihaza özel fastbootd izinlerini ekleyin. Örneğin, fastbootd , o bölümü flaş etmek için cihaza özel bir bölüme yazma erişimi gerektirir. Ek olarak, fastboot HAL uygulaması ayrıca cihaza özel izinler gerektirebilir.

Kullanıcı alanı hızlı başlatmasını doğrulamak için Vendor Test Suite'i (VTS) çalıştırın.

Yanıp sönen satıcı ramdiskleri

Android 12 ve sonraki sürümler, bir cihazdan tam vendor_boot görüntüsünü çeken ek bir fastboot komutuyla ramdisklerin yanıp sönmesi için destek sağlar. Komut, ana bilgisayar tarafındaki hızlı önyükleme aracından satıcı önyükleme üstbilgisini okumasını, yeniden görüntülenmesini ve yeni görüntüyü flaş etmesini ister.

Tam vendor_boot görüntüsünü çekmek için, hem fastboot protokolüne hem de Android 12'deki protokolün fastbootd uygulamasına fetch:vendor_boot komutu eklendi. Fastbootd'nin bunu uyguladığını, ancak önyükleyicinin kendisinin yapmayabileceğini unutmayın. OEM'ler, protokolün önyükleyici uygulamalarına fetch:vendor_boot komutunu ekleyebilir. Ancak, komut önyükleyici modunda tanınmıyorsa, o zaman tek tek satıcı ram disklerinin önyükleyici modunda yanıp sönmesi satıcı tarafından desteklenen bir seçenek değildir.

Önyükleyici değişiklikleri

getvar:max-fetch-size ve fetch:name komutları fastbootd içinde uygulanır. Önyükleyicide yanıp sönen satıcı ramdisklerini desteklemek için bu iki komutu uygulamalısınız.

Fastbootd değişiklikleri

getvar:max-fetch-size max-download-size size ile benzerdir. 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ıklanabilir bir yapı çalıştırıyor.
  • Aygıtın kilidi açıldı (önyükleme durumu turuncu).
  • Getirilen bölüm adı, vendor_boot .
  • size değeri 0 < size <= max-fetch-size içindedir.

Bunlar doğrulandığında, fetch:name[:offset[:size]] , bölüm boyutunu ve ofseti döndürür. Aşağıdakilere dikkat et:

  • fetch:name , fetch:name:0 ile eşdeğerdir, bu da fetch:name:0:partition_size ile eşdeğerdir.
  • fetch:name:offset , fetch:name:offset:(partition_size - offset) ile eşdeğerdir

Bu nedenle fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

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

  • Ofset belirtildi, boyut belirtilmedi: size = partition_size - offset
  • Hiçbiri belirtilmedi: her ikisi için de kullanılan varsayılan değerler, size = partition_size - 0.

Örneğin, fetch:foo , foo bölümünün tamamını 0 uzaklığında 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

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

    Bu, flash komutunun özel bir çeşididir. fastboot fetch çağrılmış gibi vendor_boot görüntüsünü getirir.

    • Satıcı önyüklemesi başlık sürümü 3 ise, aşağıdakileri yapar:
      • Satıcı ramdiskini verilen görüntüyle değiştirir.
      • Yeni vendor_boot görüntüsünü yanıp söner.
    • Satıcı önyükleme başlığı sürüm 4 ise, aşağıdakileri yapar:
      • Tüm satıcı ramdiskini verilen imajla değiştirir, böylece verilen imaj, vendor_boot imajındaki tek satıcı ramdisk parçası olur.
      • Satıcı ramdisk tablosundaki boyutu ve ofseti yeniden hesaplar.
      • Yeni vendor_boot görüntüsünü yanıp söner.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

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

    • Satıcı önyükleme başlığı sürüm 3 ise, bir hata döndürür.
    • Satıcı önyükleme başlığı sürüm 4 ise, aşağıdakileri yapar:

      • foo adlı satıcı ramdisk parçasını bulur. Bulunamazsa veya birden fazla eşleşme varsa, bir hata döndürür.
      • Satıcı ramdisk parçasını verilen görüntüyle değiştirir.
      • Satıcı ramdisk tablosundaki her boyutu ve ofseti yeniden hesaplar.
      • Yeni vendor_boot görüntüsünü 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. flash vendor_boot:default semantiği aynı kalsa da, ramdisk parçalarınızı default olarak adlandırmamalısınız.

SELinux değişiklikleri

fastbootd.te , yanıp sönen satıcı ramdisklerini desteklemek için bir değişiklik yapıldı.