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

Fastboot, bir önyükleme modülü ve modunun adıdır. Android 10 ve sonraki sürümler hızlı başlatma uygulamasının yerini değiştirerek yeniden boyutlandırılabilir bölümleri destekler. bootloader'ı kullanıcı alanına yükleyin. Bu taşıma işlemi, yanıp sönme kodunun, donanım soyutlama katmanı (HAL) tarafından uygulanan yalnızca fastboot'un tedarikçiye özgü bölümleriyle birlikte bakımı yapılabilir ve test edilebilir bir ortak konuma taşınmasını sağlar. Ayrıca Android 12, ve daha yüksek sürümler, ek bir fastboot komutuyla yanıp sönen RAM'leri destekler.

Fastboot ve kurtarma modunu birleştirme

Kullanıcı alanı hızlı önyükleme ve kurtarma benzer olduğundan bunları tek bir bölüm veya ikili dosyada birleştirebilirsiniz. Bu sayede daha az alan kullanır, daha az bölüme sahip olur ve fastboot ile kurtarma modunun çekirdek ve kitaplıklarını paylaşmasını sağlayabilirsiniz.

Fastbootd, bir kullanıcı alanı arka plan programı ve modun adıdır. fastbootd'ü desteklemek için önyükleyicinin boot-fastboot için yeni bir önyükleme kontrol bloğu (BCB) komutu uygulaması gerekir. fastbootd moduna girmek için bootloader BCB mesajının komut alanına boot-fastboot yazar ve BCB'nin recovery alanında değişiklik yapıldı (kesilen herhangi bir kurtarma işleminin yeniden başlatılmasını sağlamak için) görevler). status, stage ve reserved alanları da değişmez. Bootloader, BCB komut alanında boot-fastboot gördüğünde yüklenir ve kurtarma görüntüsünü başlatır. Ardından kurtarma, 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. İlgili içeriği oluşturmak için kullanılan komutu tarafından yürütülmesine bağlı olarak farklı sonuçlar verir. geri kazanılabilir.

Komut Açıklama
reboot fastboot
  • fastbootd (sistem) olarak 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 flaşlama ve yönetmeye yönelik yeni komutlar da dahil olmak üzere fastbootd'ü entegre etmek için kullanılan fastboot komutları açıklanmaktadır. Biraz komutların farklı web süreçleri tarafından yürütülüp yürütülmediğine bağlı olarak bootloader'ı veya fastbootd tarafından değiştirildi.

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ümlendirme ise yes değerini döndürür Aksi takdirde no. 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. Ad, mevcut zaman aralığını içeriyor son ek, süper bölüm bir A/B bölümüyse sonektir (genellikle değildir).
create-logical-partition <partition> <size> Belirtilen ad ve boyutla mantıksal bir bölüm oluşturur. Ad, mantıksal bölüm olarak zaten mevcut olmamalıdır.
delete-logical-partition <partition> Belirtilen mantıksal bölümü siler (bölümü etkili bir şekilde siler).
resize-logical-partition <partition> <size> Mantıksal bölümün boyutunu, içeriğini değiştirmeden yeni boyuta ayarlar. 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 yapılamıyorsa (örneğin, cihazdaki biçim desteklenmeyen bir sürümse) bu komut başarısız olur. İsteğe bağlı bir wipe parametresi, cihazın meta verileri kullanır.
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ın kilidi açık olmalıdır.
getvar <variable> | all Bootloader değişkenini veya tüm değişkenleri görüntüler. Değişken mevcut değilse hata döndürülür.
set_active <slot>

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

A/B desteği için yuvalar, başlatılabilen yinelenen bölüm gruplarıdır olabilir. Yuvalar a, b vb. şeklinde adlandırılır ve bölüm adına _a, _b vb. son ekler eklenerek birbirinden 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>

Tedarikçi firma ramdisk'lerinin yanıp sönmesini 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 bir parçanın verilerini alır, ardından verileri <out.img>

Ayrıntılı bilgi 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 gibi bir fetch vendor_boot resim işlevi gerçekleştirir çağrıldı. Yanıp söndüğü yeni vendor_boot resmi, önyükleme üstbilgisi sürüm 3 veya sürüm 4'tür.

Ayrıntılı bilgi için fastboot flash vendor_boot:default <vendor-ramdisk.img> başlıklı makaleyi inceleyin.

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Tedarikçi firma ramdisk'lerinin yanıp sönmesini desteklemek için Android 12 ve sonraki sürümlerde kullanın.

vendor_boot resmini getirir. Tedarikçi firma önyükleme üstbilgisi 3. sürümse hata döndürülür. Sürüm 4 ise doğru sürümü bulur ve tedarikçi firma ramdisk parçası (varsa). Bu resmi, belirtilen resimle değiştirir, boyutları ve ofsetleri yeniden hesaplar ve yeni vendor_boot image'yi gösterir.

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

Fastboot ve bootloader

Önyükleyici, bootloader, radio ve boot/recovery bölümlerinin yanı sıra diğer tüm bölümleri de yükler. Bootloader aşağıdaki komutları desteklemelidir.

Komut Açıklama
download Resmi Flash'a 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 yeniden başlatılır.
reboot recovery Cihazı kurtarma moduna yeniden başlatır.
getvar Kurtarma/önyükleme görüntüsünün yanıp sönmesi için gereken bir önyükleme değişkeni alır (örneğin, current-slot ve max-download-size).
oem <command> Komut, OEM tarafından tanımlanır.

Dinamik bölümler

Önyükleyici, dinamik bölümlerin yanıp sönmesine veya silinmesine izin vermemelidir ve bu işlemler denendiğinde hata döndürmelidir. Dinamik bölüme sonradan sahip olan cihazlarda, hızlı önyükleme aracı (ve önyükleyici), önyükleyici modundayken dinamik bir bölümü doğrudan flaşlamak için zorunlu modu destekler. Örneğin, system, sonradan takılan cihazdaki dinamik bir bölümse fastboot --force flash system komutunu kullanmak, bootloader'ın (fastbootd yerine) bölümü flaşlamasını sağlar.

Kapalı modda şarj etme

Bir cihaz kapalı modda şarjı destekliyorsa veya başka bir şekilde özel bir modunda olduğunda, fastboot oem off-mode-charge 0 komutu bu özel modları atlar ve böylece cihaz, kullanıcı basmış güç düğmesine basın.

Fastboot OEM HAL

Bootloader'ı tamamen değiştirmek için fastboot'un mevcut tüm öğeleri işlemesi gerekir hızlı başlatma komutları. Bu komutların çoğu OEM'ler tarafından sağlanır ve belgelenmiş olsa da özel uygulama gerektirir. OEM'ye özgü birçok komut kullanılamaz belgelendirir. Fastboot HAL, bu tür komutları işlemek için gereken OEM komutları: OEM'ler kendi komutlarını da uygulayabilir.

Fastboot HAL'in tanımı şu şekildedir:

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 bölgesinde PRODUCT_PACKAGES grubuna fastbootd ekleyin: PRODUCT_PACKAGES += fastbootd.

  2. Hızlı başlatma HAL'inin, önyükleme kontrolü HAL'inin ve sağlık HAL'inin, kurtarma görüntüsünün bir parçası olarak paketlendiğinden emin olun.

  3. fastbootd tarafından gereken cihaza özgü SEPolicy izinlerini ekleyin. Örneğin, fastbootd, cihaza özgü bir bölümü flaşlamak için söz konusu bölüme yazma erişimi gerektirir. Ek olarak, fastboot HAL uygulaması da cihaza özel izinler gerektirir.

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

Flash satıcı diskleri

Android 12 ve sonraki sürümler Bir cihazdan vendor_boot resim. Komut, ana makine tarafında fastboot komutunu ister aracını kullanın.

vendor_boot resminin tamamını almak için Android 12'de hem fastboot protokolüne hem de protokolün fastbootd uygulamasına fetch:vendor_boot komutu eklendi. Fastboot özelliğinin yaptığını ancak bootloader'ın kendisi uygulamayabilir. OEM'ler, protokolün önyükleyici uygulamasına fetch:vendor_boot komutunu ekleyebilir. Ancak komut, önyükleme modunda tanınmıyorsa önyükleme modunda tek tek tedarikçi ramdisk'lerini flaşlamak tedarikçi firma tarafından desteklenmeyen bir seçenektir.

Bootloader değişiklikleri

getvar:max-fetch-size ve fetch:name komutları şurada uygulanır: fastbootd. Bootloader'da yanıp sönen satıcı RAM'lerini desteklemek için bu iki komutu uygulayın.

Fastbootd değişiklikleri

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

fetch:name[:offset[:size]], cihazda bir dizi kontrol gerçekleştirir. Tümü fetch:name[:offset[:size]] komutu verileri döndürür:

  • Cihazda hata ayıklama yapılabilir bir derleme çalışıyor.
  • Cihazın kilidi açık (açılış durumu turuncu).
  • Getirilen bölüm adı: vendor_boot.
  • size değeri 0 < size <= max-fetch-size aralığına girmelidir.

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

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

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

offset veya partition_size (ya da her ikisi) belirtilmediyse varsayılan değerler kullanılır (offset için 0, size için ise hesaplanan partition_size - offset değeri.

  • Ofset belirtilmiş, boyut belirtilmemiş: size = partition_size - offset
  • İkisi de belirtilmemişse her ikisi için de varsayılan değerler kullanılır: 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, Hızlı Önyükleme komutları tablosundaki tam tanımına bağlanır.

  • fastboot fetch vendor_boot out.img

    • Yığın boyutunu belirlemek için getvar max-fetch-size öğesini çağırır.
    • Bölümün tamamını belirlemek için getvar partition-size:vendor_boot[_a] işlevini çağırır.
    • Her bir parça için fastboot fetch vendor_boot[_a]:offset:size çağrısı yapar. (Parça boyutu, vendor_boot boyutundan büyükse) bu nedenle normalde yalnızca bir yığın bulunur.)
    • Verileri out.img olarak bir araya getirir.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

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

    • Tedarikçi firma başlatması üstbilgi sürümüyse 3, şunları yapar:
      • Tedarikçi firma ramdisk'ini verilen resimle değiştirir.
      • Yeni vendor_boot resmini gösterir.
    • Tedarikçi firma önyükleme başlığı 4. sürüm ise aşağıdakileri yapar:
      • Tüm tedarikçi firma ramdisk'ini verilen resimle değiştirir. Böylece, verilen tek tedarikçi firma ramdisk parçası haline gelir. vendor_boot resim.
      • Tedarikçi firma ramdisk tablosundaki boyutu ve ofseti yeniden hesaplar.
      • Yeni vendor_boot resmini gösterir.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

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

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

      • ramdisk_<var>&lt;foo></var> adlı tedarikçi ramdisk parçasını bulur. Bulunamazsa veya varsa bir 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 gösterir.
    • <foo> belirtilmezse ramdisk_ değerini bulmaya çalışır.

mkbootimg

default adı, Android 12 ve sonraki sürümler. Hızlı önyükleme flash vendor_boot:default semantikleri aynı kalmasına rağmen, ramdisk parçalarınızı default olarak adlandırmamanız gerekir.

SELinux değişiklikleri

Şu tarihte bir değişiklik yapıldı: fastbootd.te tampon çalışmasını sağlamak.