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

Fastboot, bir önyükleyici modülünün ve modunun adıdır. Android 10 ve sonraki sürümlerde, fastboot uygulaması bootloader'dan kullanıcı alanına taşınarak yeniden boyutlandırılabilir bölümler desteklenir. Bu taşıma işlemi, yanıp sönen kodu, yalnızca donanım soyutlama katmanı (HAL) tarafından uygulanan satıcıya özel fastboot bölümleriyle birlikte, bakımı ve testi yapılabilir ortak bir konuma taşımayı sağlar. Ayrıca Android 12 ve sonraki sürümlerde, eklenen bir fastboot komutu aracılığıyla ramdisk'lerin yüklenmesi desteklenir.

Fastboot ve kurtarma modunu birleştirme

Kullanıcı alanı hızlı başlatma ve kurtarma benzer olduğundan bunları tek bir bölüme veya ikiliye birleştirebilirsiniz. Bu, daha az alan kullanma, daha az bölüm oluşturma ve fastboot ile kurtarmanın çekirdeklerini ve kitaplıklarını paylaşma gibi avantajlar sağlar.

Fastbootd, kullanıcı alanı daemon'unun ve modunun adıdır. fastbootd'yı desteklemek için önyükleyicinin boot-fastboot yeni bir önyükleme kontrol bloğu (BCB) komutunu uygulaması gerekir. fastbootd moduna girmek için önyükleyici, BCB iletisinin komut alanına boot-fastboot yazar ve BCB'nin recovery alanını değiştirmez (kesintiye uğrayan kurtarma görevlerinin yeniden başlatılmasını sağlamak için). status, stage ve reserved alanları da değişmeden kalır. Önyükleyici, BCB komut alanında boot-fastboot işaretini gördüğünde kurtarma görüntüsünü yükler ve başlatır. Kurtarma daha sonra BCB mesajını ayrıştırır ve fastbootd moduna geçer.

ADB komutları

Bu bölümde, fastbootd'yi entegre etmek için kullanılan adb komutu açıklanmaktadır. Komut, sistem veya kurtarma tarafından yürütülmesine bağlı olarak farklı sonuçlar verir.

Komut Açıklama
reboot fastboot
  • fastbootd (sistem) bölümüne yeniden başlatılıyor.
  • Yeniden başlatma (kurtarma) olmadan doğrudan fastbootd girer.

Fastboot komutları

Bu bölümde, fastbootd'ı entegre etmeye yönelik fastboot komutları (mantıksal bölümleri flash'leme ve yönetmeye yönelik yeni komutlar dahil) açıklanmaktadır. Bazı komutlar, önyükleyici veya fastbootd tarafından yürütülmelerine bağlı olarak farklı sonuçlar verir.

Komut Açıklama
reboot recovery
  • Kurtarma modunda (bootloader) yeniden başlatılır.
  • Yeniden başlatmadan doğrudan kurtarma moduna girer (fastbootd).
reboot fastboot fastbootd içine yeniden başlatılır.
getvar is-userspace
  • İadeler yes (fastbootd).
  • Dönen no (bootloader).
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 Üst bölümün adını döndürür. Süper bölüm bir A/B bölümüyse (genellikle böyle değildir) ad, geçerli yuva sonekini içerir.
create-logical-partition <partition> <size> Belirtilen ad ve boyutta mantıksal bir bölüm oluşturur. Ad, mantıksal bölüm olarak mevcut olmamalıdır.
delete-logical-partition <partition> Belirtilen mantıksal bölümü siler (bölümü etkili bir şekilde temizler).
resize-logical-partition <partition> <size> İçeriğini değiştirmeden mantıksal bölümü yeni boyuta yeniden boyutlandırır. Yeniden boyutlandırma işlemini gerçekleştirmek için yeterli alan yoksa işlem 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 gerekli değildir). Cihazın kilidi açık 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 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 başlatılır.

A/B desteği için yuvalar, birbirinden bağımsız olarak başlatılabilen, yinelenen bölüm kümeleridir. Yuvalar a, b vb. olarak adlandırılır ve bölüm adına _a, _b vb. sonekleri eklenerek 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 ramdisk'lerinin yüklenmesini desteklemek için Android 12 ve sonraki sürümlerde kullanın.

Bölümün tamamının boyutunu ve parça boyutunu alır. Her parça için verileri alır, ardından verileri birleştirerek <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>

Satıcı ramdisklerinin yanıp sönmesini desteklemek için Android 12 ve sonraki sürümlerde kullanılır.

Bu, flash komutunun özel bir varyantıdır. fetch vendor_boot işlevi, fastboot fetch çağrılmış gibi bir görüntü işlevi gerçekleştirir. Yeni vendor_boot görüntüsünün yanıp sönmesi, başlatma 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> Android 12 ve sonraki sürümlerde, satıcı ramdisk'lerinin yüklenmesini desteklemek için kullanılır.

vendor_boot resmini getirir. Satıcı önyükleme üstbilgisi sürüm 3 ise hata döndürür. 4. sürümse doğru satıcı ramdisk parçasını (varsa) bulur. Bu resim, verilen resimle değiştirilir, boyutlar ve uzaklıklar yeniden hesaplanır ve yeni vendor_boot image yanıp söner.

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

Fastboot ve bootloader

Bootloader, bootloader, radio ve boot/recovery bölümlerini yükler. Ardından cihaz, fastboot (kullanıcı alanı) modunda başlatılır ve diğer tüm bölümler yüklenir. Önyükleyici aşağıdaki komutları desteklemelidir.

Komut Açıklama
download Resmi flaşa indirir.
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ recovery/boot bölümünü ve bootloader'ı flaşlar.
reboot Cihazı yeniden başlatır.
reboot fastboot Fastboot modunda yeniden başlatılır.
reboot recovery Kurtarma modunda yeniden başlatılır.
getvar Kurtarma/önyükleme görüntüsünün yanıp sönmesi için gereken bir bootloader 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 vermemelidir ve bu işlemler denenirse hata döndürmelidir. Sonradan eklenen dinamik bölüm cihazlarında, fastboot aracı (ve önyükleyici), önyükleyici modundayken dinamik bir bölümü doğrudan flaşlamak için zorlama modunu destekler. Örneğin, system, sonradan eklenen cihazdaki dinamik bir bölümse fastboot --force flash system komutunun kullanılması, önyükleyicinin (fastbootd yerine) bölümü flash etmesini sağlar.

Kapalıyken şarj etme

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

Fastboot OEM HAL

Bootloader fastboot'u tamamen değiştirmek için fastboot, mevcut tüm fastboot komutlarını işlemelidir. Bu komutların çoğu OEM'lerden gelir ve belgelenmiştir ancak özel bir uygulama gerektirir. OEM'e ö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'ın tanımı şöyledir:

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 özelliğini etkinleştirmek için:

  1. fastbootd öğesini device.mk konumundaki PRODUCT_PACKAGES öğesine ekleyin: PRODUCT_PACKAGES += fastbootd.

  2. Fastboot HAL, boot control HAL ve health HAL'in kurtarma görüntüsünün bir parçası olarak paketlendiğinden emin olun.

  3. fastbootd tarafından gerekli olan cihaza özel SEPolicy izinlerini ekleyin. Örneğin, fastbootd, bölümü flashlamak için cihaza özgü 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ı başlatma özelliğini doğrulamak için Vendor Test Suite (VTS)'yi çalıştırın.

Flash sağlayıcı ramdiskleri

Android 12 ve sonraki sürümlerde, cihazdan tam vendor_boot görüntüsünü çeken ek bir fastboot komutuyla ramdisk'lerin yanıp sönmesi desteklenir. Bu komut, ana makine tarafındaki fastboot aracının satıcı önyükleme başlığını okumasını, yeniden görüntü oluşturmasını ve yeni görüntüyü flash'lemesini ister.

Tam vendor_boot görüntüsünü çekmek için fetch:vendor_boot komutu, Android 12'de hem fastboot protokolüne hem de protokolün fastbootd uygulamasına eklendi. Fastbootd'nin bunu uyguladığını ancak önyükleyicinin kendisinin uygulamayabileceğini unutmayın. OEM'ler, protokolün önyükleyici uygulamalarına fetch:vendor_boot komutunu ekleyebilir. Ancak komut, önyükleyici modunda tanınmıyorsa önyükleyici modunda tek tek tedarikçi ramdisk'lerinin yüklenmesi, tedarikçi 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. Önyükleyicide satıcı 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 ile benzer. 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ıklanabilir bir derleme çalıştırılıyor.
  • Cihazın kilidi açık (başlatma durumu turuncu).
  • Getirilen bölüm adı vendor_boot.
  • size değeri 0 < size <= max-fetch-size aralığında olmalıdır.

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

  • fetch:name, fetch:name:0 ve fetch:name:0:partition_size değerlerine eş değerdir.
  • 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 (ya da her ikisi) belirtilmediğinde varsayılan değerler kullanılır. offset için bu değer 0, size için ise partition_size - offset'ün hesaplanan değeridir.

  • Ofset belirtilmiş, boyut belirtilmemiş: size = partition_size - offset
  • İkisi de belirtilmemiş: Her ikisi için de varsayılan değerler kullanılır, size = partition_size - 0.

Örneğin, fetch:foo, 0 ofsetinde 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

    • Parça boyutunu belirlemek için yapılan çağrılar getvar max-fetch-size.
    • Tüm bölümün boyutunu belirlemek için getvar partition-size:vendor_boot[_a] çağrıları.
    • Her bir parça için fastboot fetch vendor_boot[_a]:offset:size arama. (Parça boyutu vendor_boot boyutundan büyük olduğundan normalde yalnızca bir parça bulunur.)
    • Verileri birleştirerek out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

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

    • Sağlayıcı önyüklemesi, sürüm 3 ise:
      • Tedarikçi ramdisk'ini belirtilen resimle değiştirir.
      • Yeni vendor_boot resmini gösterir.
    • Tedarikçi önyükleme başlığı sürüm 4 ise:
      • Belirtilen resmi, vendor_boot resmindeki tek satıcı ramdisk parçası olacak şekilde tüm satıcı ramdisk'iyle değiştirir.
      • Tedarikçi ramdisk tablosundaki boyutu ve dengelemeyi 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 getirilir.

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

      • Adı ramdisk_<var>&lt;foo></var> olan satıcı ramdisk parçasını bulur. Bulunamazsa veya birden fazla eşleşme varsa hata döndürür.
      • Tedarikçi ramdisk parçasını belirtilen resimle değiştirir.
      • Tedarikçi ramdisk tablosundaki her boyutu ve dengelemeyi yeniden hesaplar.
      • Yeni vendor_boot resmini gösterir.
    • <foo> belirtilmezse ramdisk_ aranır.

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 semantiği aynı kalsa da ramdisk parçalarınızı adlandırmamalısınız. default

SELinux değişiklikleri

fastbootd.te'da, tedarikçi ramdisklerinin yanıp sönmesini desteklemek için değişiklik yapıldı.