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, fastboot uygulamasını önyükleyiciden kullanıcı alanına taşıyarak yeniden boyutlandırılabilir bölümleri destekler. 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 sonraki sürümler, eklenen bir hızlı önyükleme komutu aracılığıyla ramdisklerin yanıp sönmesini 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 hızlı önyükleme ile kurtarma modunun çekirdeğini ve kitaplıklarını paylaşmasını sağlayabilirsiniz.

Fastbootd, kullanıcı alanı daemon'unun ve modunun 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 önyükleyici, BCB mesajının komut alanına boot-fastboot yazar ve BCB'nin recovery alanını değiştirmeden bırakır (kesintiye uğrayan kurtarma görevlerini yeniden başlatmayı etkinleştirmek için). 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üne önyükleme yapar. 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. Komut, sistem tarafından mı yoksa kurtarma tarafından mı yürütüldüğüne bağlı olarak farklı sonuçlar verir.

Komut Açıklama
reboot fastboot
  • fastbootd (sistem) olarak yeniden başlatılır.
  • Yeniden başlatmadan doğrudan fastbootd'e girer (kurtarma).

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. Bazı komutların sonuçları, önyükleyici tarafından mı yoksa fastbootd tarafından mı çalıştırıldığına bağlı olarak farklıdır.

Komut Açıklama
reboot recovery
  • Cihazı kurtarma moduna (bootloader) yeniden başlatır.
  • Yeniden başlatmadan doğrudan kurtarma moduna girer (fastbootd).
reboot fastboot fastbootd olarak 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, aksi takdirde 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 A/B bölümüyse (genellikle değildir) ad, geçerli yuva son ekini içerir.
create-logical-partition <partition> <size> Belirtilen ada ve boyuta sahip 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ü, 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.
flash <partition><filename> ] Bir dosyayı flash bölümüne yazar. Cihazın kilidi açık olmalıdır.
erase <partition> Bir bölümü siler (güvenli silme olması gerekmez). Cihazın kilidi açık olmalıdır.
getvar <variable> | all Bir önyükleme değişkenini veya tüm değişkenleri gösterir. Değişken mevcut değilse hata döndürülür.
set_active <slot>

Belirtilen A/B önyükleme yuvasını active olarak ayarlar. Bir sonraki başlatma denemesinde sistem, belirtilen yuvadan açılır.

A/B desteği için yuvalar, bağımsız olarak önyüklenebilen kopyalanmış bölüm gruplarıdır. 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 ş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>

Tedarikçi firma ramdisk'lerinin yanıp sönmesini 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önen yeni vendor_boot resmi, önyükleme başlığı sürümünün 3. sürüm mü yoksa 4. sürüm mü olduğuna bağlıdı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 tedarikçi ramdisk fragment'ini (varsa) bulur. Bu resmi, belirtilen resimle değiştirir, boyutları ve ofsetleri yeniden hesaplar ve yeni vendor_boot image'ü gösterir.

Ayrıntılar için şu makaleyi inceleyin: 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. Önyükleme programı 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 önyükleyiciyi işler.
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> OEM tarafından tanımlanan komut.

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, fastboot 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, bölümün önyükleyici tarafından (fastbootd yerine) yanıp sönmesini sağlar.

Kapalı modda şarj etme

Bir cihaz kapalıyken şarjı destekliyorsa veya güç uygulandığında özel bir modda otomatik olarak açılırsa fastboot oem off-mode-charge 0 komutunun uygulanması, cihazın kullanıcı güç düğmesine basmış gibi açılması için bu özel modları atlamalıdır.

Fastboot OEM HAL

Önyükleme yükleyici fastboot'unu tamamen değiştirmek için fastboot'un mevcut tüm fastboot komutlarını işlemesi gerekir. Bu komutların çoğu OEM'lerden gelir ve belgelenmiştir ancak özel bir uygulama gerektirir. OEM'ye özgü birçok komut belgelenmemiştir. Fastboot HAL, bu tür komutları işlemek için gerekli OEM komutlarını belirtir. 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'de PRODUCT_PACKAGES'a fastbootd eklendi: 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. Ayrıca, fastboot HAL uygulaması için cihaza özel izinler de gerekebilir.

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

Flash tedarikçisi ramdisk'leri

Android 12 ve sonraki sürümler, ramdisk'leri flaşlama için destek sağlar. Bu destek, bir cihazdan vendor_boot görüntüsünün tamamını çeken ek bir hızlı önyükleme komutuyla sağlanır. Komut, ana makine tarafındaki hızlı önyükleme aracından tedarikçi önyükleme başlığını okumasını, yeniden görüntü oluşturmasını ve yeni görüntüyü yüklemesini ister.

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. fastbootd'nin bunu uyguladığını ancak önyükleyicinin uygulamayabileceğini unutmayın. 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.

Önyükleme değiştirici değişiklikleri

getvar:max-fetch-size ve fetch:name komutları fastbootd'de uygulanır. Önyükleyicide tedarikçi ramdisk'lerinin yanıp sönmesini desteklemek için bu iki komutu uygulamanız gerekir.

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 getirmemelidir.

fetch:name[:offset[:size]], cihazda bir dizi kontrol gerçekleştirir. Aşağıdakilerin tümü doğruysa fetch:name[:offset[:size]] komutu veri 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 ve ofseti döndürür. Aşağıdakileri göz önünde bulundurun:

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

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

offset veya partition_size (veya ikisi birden) belirtilmediğinde varsayılan değerler kullanılır. offset için varsayılan değer 0, size için ise partition_size - offset'ın hesaplanmış değeridir.

  • 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, foo bölümünün tamamını 0 ofsetinde 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

    • Parça boyutunu belirlemek için getvar max-fetch-size çağrısı yapar.
    • Tüm bölümün boyutunu 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. (Blok boyutu vendor_boot boyutundan büyük olduğundan genellikle yalnızca bir blok vardır.)
    • 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 önyüklemesi başlık 3 sürümüne sahipse aşağıdakileri yapar:
      • Tedarikçi firma ramdisk'ini belirtilen 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:
      • Tedarikçi firma ramdisk'inin tamamını belirtilen resimle değiştirir. Böylece, belirtilen resim vendor_boot resmindeki tek tedarikçi firma ramdisk parçası olur.
      • Tedarikçi firma ramdisk tablosundaki boyutu ve ofseti yeniden hesaplar.
      • Yeni vendor_boot resmini gösterir.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

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

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

      • ramdisk_<var>&lt;foo></var> adlı tedarikçi ramdisk parçasını bulur. Bulunmazsa veya birden fazla eşleşme varsa hata döndürülür.
      • Tedarikçi firma ramdisk parçasını belirtilen resimle değiştirir.
      • Tedarikçi firma ramdisk tablosundaki her 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ümlerde tedarikçi ramdisk parçalarını adlandırmak için ayrılmıştır. 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

Tedarikçi firmanın ramdisk'lerini flaşlamayı desteklemek için fastbootd.te sürümünde bir değişiklik yapıldı.