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

Android 10 ve üzeri, fastboot uygulamasını önyükleyiciden kullanıcı alanına taşıyarak yeniden boyutlandırılabilir bölümleri destekler. Bu yeniden konumlandırma, yanıp sönen kodun, bir donanım soyutlama katmanı (HAL) tarafından uygulanan fastboot'un yalnızca satıcıya özel parçalarıyla bakımı yapılabilir ve test edilebilir ortak bir konuma taşınmasını sağlar. Ayrıca Android 12 ve üzeri, eklenen bir fastboot komutu aracılığıyla ramdisklerin yanıp sönmesini destekler.

Fastboot ve kurtarmanın birleştirilmesi

Kullanıcı alanı fastboot ve kurtarma benzer olduğundan, bunları tek bir bölüm veya ikili dosyada birleştirebilirsiniz. Bu, daha az alan kullanılması, genel olarak daha az bölüme sahip olunması ve hızlı başlatma ile kurtarmanın çekirdek ve kitaplıklarını paylaşması gibi avantajlar sağlar.

fastbootd 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 mesajının komut alanına boot-fastboot yazar ve BCB'nin recovery alanını değiştirmeden bırakır (kesilen 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 gördükten sonra kurtarma görüntüsünü yükler ve önyükleme yapar. Recovery daha sonra 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 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ı önyükleme komutları

Bu bölümde, mantıksal bölümlerin yanıp sönmesine ve yönetilmesine yönelik yeni komutlar da dahil olmak üzere, fastbootd entegrasyonuna yönelik fastboot komutları açıklanmaktadır. Bazı komutların bootloader veya fastbootd tarafından yürütülmesine bağlı olarak farklı sonuçları olur.

Emretmek Tanım
reboot recovery
  • Kurtarma işleminde yeniden başlatılır (önyükleyici).
  • Yeniden başlatmaya ( fastbootd ) gerek kalmadan doğrudan kurtarma işlemine girer.
reboot fastboot fastbootd yeniden başlatılır.
getvar is-userspace
  • yes ( fastbootd ) değerini döndürür.
  • no (önyükleyici) değerini döndürür.
getvar is-logical: <partition> Belirtilen bölüm mantıksal bir bölümse yes döndürür, no halde hayır değerini döndürür. Mantıksal bölümler aşağıda listelenen komutların tümünü 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ü ise (genellikle değildir), ad geçerli yuva son ekini içerir.
create-logical-partition <partition> <size> Verilen ad ve boyuta sahip mantıksal bir bölüm oluşturur. Adın zaten mantıksal bir bölüm olarak mevcut olmaması gerekir.
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ı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 format 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 cihazın meta verilerinin üzerine yazar.
flash <partition> [ <filename> ] Bir dosyayı flash bölümüne yazar. Cihaz kilidi açık durumda olmalıdır.
erase <partition> Bir bölümü siler (güvenli silme işlemi 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 mevcut değilse 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ükleme yapar.

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 ) Cihazı önyükleyicide yeniden başlatır.
fastboot fetch vendor_boot <out.img>

Satıcının ram disklerinin yanıp sönmesini 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 parça için veri alır ve ardından verileri <out.img> de birleştirir

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

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

Satıcının ram disklerinin yanıp sönmesini 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ü getirme 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 fastboot flash vendor_boot:default <vendor-ramdisk.img> bakın.

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> Satıcının ram disklerinin yanıp sönmesini desteklemek için Android 12 ve sonraki sürümlerde kullanın.

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

Ayrıntılar için 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 fastboot'a (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ü flash'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ılıyor.
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 . Sonradan takılan dinamik bölümleme aygıtları için fastboot aracı (ve önyükleyici), önyükleyici modundayken dinamik bir 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ü flaş etmesini sağlar.

Kapalı mod şarjı

Bir cihaz kapalı mod şarjını destekliyorsa veya güç uygulandığında özel bir modda otomatik olarak başlatılıyorsa, fastboot oem off-mode-charge 0 komutunun uygulanmasının bu özel modları atlaması gerekir; böylece cihaz, kullanıcı düğmeye basmış gibi önyüklenir. Güç düğmesi.

Fastboot OEM HAL

Önyü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 gelmektedir 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 ayrıca kendi komutlarını da uygulayabilirler.

Fastboot HAL 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'u etkinleştirme

Bir cihazda fastbootd etkinleştirmek için:

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

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

  3. fastbootd gerektirdiği cihaza özel SEPolicy izinlerini ekleyin. Örneğin, fastbootd aygıta özel bir bölümün flaşlanması için bu bölüme yazma erişimi gerektirir. Ayrıca fastboot HAL uygulaması cihaza özel izinler de gerektirebilir.

Kullanıcı alanı fastboot'unu doğrulamak için Vendor Test Suite'i (VTS) çalıştırın.

Yanıp sönen satıcı ramdiskleri

Android 12 ve üzeri, bir cihazdan vendor_boot görüntüsünün tamamını çeken ek bir fastboot komutuyla ramdisklerin yanıp sönmesi için destek sağlar. Komut, ana bilgisayar tarafındaki fastboot aracının satıcının önyükleme başlığını okumasını, yeniden imaj oluşturmasını ve yeni imajı flaşlamasını ister.

vendor_boot görüntüsünün tamamını çekmek için fetch:vendor_boot komutu hem fastboot protokolüne hem de Android 12'deki protokolün fastbootd uygulamasına eklendi. Fastbootd'un bunu uyguladığını ancak önyükleyicinin kendisinin bunu yapmayabileceğini unutmayın. OEM'ler, protokolün önyükleyici uygulamasına fetch:vendor_boot komutunu ekleyebilir. Ancak, komut önyükleyici modunda tanınmazsa, satıcının ramdisklerinin önyükleyici modunda ayrı ayrı 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 fastbootd uygulanır. Önyükleyicide satıcının ramdisklerinin yanıp sönmesini desteklemek için bu iki komutu uygulamanız gerekir.

Hızlı önyükleme değişiklikleri

getvar:max-fetch-size max-download-size 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 beden 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.
  • Cihazın kilidi açık (önyükleme durumu turuncu).
  • Getirilen bölümün 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ün boyutunu ve uzaklığını 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 varsayılan değerler kullanılır; offset için 0, size için ise partition_size - offset hesaplanan değeridir.

  • Uzaklık belirtildi, boyut belirtilmedi: size = partition_size - offset
  • İkisi de 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 konumunda 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 getvar max-fetch-size ç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 çağırır. (Yığın boyutu, vendor_boot boyutundan daha büyüktür, dolayısıyla normalde yalnızca bir yığın vardır.)
    • Verileri out.img olarak birleştirir.
  • 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ının 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:
      • Satıcının ramdisk'inin tamamını verilen görüntüyle değiştirir, böylece verilen görüntü, vendor_boot görüntüsündeki tek satıcı ramdisk parçası olur.
      • Satıcının ramdisk tablosundaki boyutu ve uzaklığı 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ının ö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 adındaki satıcının ramdisk parçasını bulur. Bulunamazsa veya birden fazla eşleşme varsa hata döndürür.
      • Satıcının ramdisk parçasını verilen görüntüyle değiştirir.
      • Satıcının ramdisk tablosundaki her boyutu ve uzaklığı 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ının 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ı default olarak adlandırmamalısınız .

SELinux değişiklikleri

fastbootd.te satıcının ramdisklerinin yanıp sönmesini desteklemek için bir değişiklik yapıldı.