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 yer değiştirme, yanıp sönen kodun sürdürülebilir ve test edilebilir bir ortak konuma taşınmasını sağlar. Bu ortak konuma, yalnızca donanım soyutlama katmanı (HAL) tarafından uygulanan fastboot'un yalnızca satıcıya özgü kısımları bulunur. 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 fastboot ile kurtarma modunun çekirdek 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ü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. Komutun, sistem veya kurtarma tarafından yürütülmesine bağlı olarak farklı sonuçları vardır.
Komut | Açıklama |
---|---|
reboot fastboot |
|
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 |
|
reboot fastboot |
fastbootd modunda yeniden başlatılır. |
getvar is-userspace |
|
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 bir bölüm olarak zaten bulunmamalı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. |
update-super <partition> |
Süper bölüm meta verilerindeki 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ı wipe parametresi, birleştirme yapmak yerine cihazın meta verilerinin üzerine yazar. |
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 |
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ı A/B desteği için yuvalar, bağımsız olarak önyüklenebilen kopyalanmış bölüm gruplarıdır. Yuvalar |
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
Ayrıntılı bilgi için |
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.
Ayrıntılar için |
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.
Ayrıntılar için şu makaleyi inceleyin:
|
Fastboot ve bootloader
Bootloader bootloader
, radio
ve boot/recovery
bölümlerini günceller. Ardından cihaz, fastboot (kullanıcı alanı) bölümünde başlatılır ve diğer tüm bölümleri yanıp söner. Önyükleyici 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 gerekli olan 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 denendiğinde hata döndürmelidir. İleriye dönük dinamik bölümlendirmeli cihazlarda, fastboot aracı (ve bootloader), bootloader modundayken dinamik bölümü doğrudan yüklemek için bir zorla 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 arızası 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 için belge yoktur. 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:
device.mk
bölgesindePRODUCT_PACKAGES
grubunafastbootd
ekleyin:PRODUCT_PACKAGES += fastbootd
.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.
fastbootd
tarafından gereken cihaza özel SEPolicy izinlerini ekleyin. Örneğin,fastbootd
, bu bölümü yüklemek için cihaza özel 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ı önyüklemesini doğrulamak için Tedarikçi Test Paketi (VTS)'yi ç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ı alan 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'ın bunu uyguladığını ancak bootloader'ın kendisinin 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. Bootloader'da yanıp sönen tedarikçi firma RAM'lerini desteklemek için aşağıdaki 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:
- Cihaz, hata ayıklaması yapılabilir bir derleme çalıştırı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
isefetch: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, Fastboot 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. - Bölümün tamamını belirlemek için
getvar partition-size:vendor_boot[_a]
işlevini çağırır. - Her parça için
fastboot fetch vendor_boot[_a]:offset:size
öğesini çağırır. (Blok boyutuvendor_boot
boyutundan büyük olduğundan genellikle yalnızca bir blok vardır.) - Verileri
out.img
olarak bir araya getirir.
- Parça boyutunu belirlemek için
fastboot flash vendor_boot:default vendor-ramdisk.img
Bu, flash komutunun özel bir varyantıdır.
fastboot fetch
çağrılmış gibivendor_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 başlatma başlığı sürüm 4 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 yanıp söner.
- Tedarikçi firma ramdisk'inin tamamını belirtilen resimle değiştirir. Böylece, belirtilen resim
- Tedarikçi firma önyüklemesi başlık 3 sürümüne sahipse aşağıdakileri yapar:
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.
Satıcı önyükleme başlığı 4. sürümse aşağıdakileri yapar:
ramdisk_<var><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_
bulmaya çalışı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
anlamı aynı kalsa da 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ı.