Android 9, önyükleyici başlatma nedeni spesifikasyonunda aşağıdaki değişiklikleri içerir.
Başlatma nedenleri
Bir önyükleyici, cihazın neden yeniden başlatıldığını belirlemek için benzersiz şekilde kullanılabilen donanım ve bellek kaynaklarını kullanır. Ardından, başlatma için Android çekirdek komut satırına androidboot.bootreason=<reason>
ekleyerek bu belirlemeyi bildirir. init
ardından bu komut satırını Android özelliğine yaymak için çevirir
bootloader_boot_reason_prop
(ro.boot.bootreason
).
Android 12 veya sonraki sürümlerle başlatılan, 5.10 veya sonraki çekirdek sürümlerini kullanan cihazlarda androidboot.bootreason=<reason>
çekirdek komut satırı yerine bootconfig'e eklenir.
Başlatma nedeni özellikleri
Android'in önceki sürümlerinde, boşluk içermeyen, tamamen küçük harflerden oluşan, az sayıda şart (ör. kernel_panic
, watchdog
, cold
/warm
/hard
raporlama) içeren ve diğer benzersiz nedenlere izin veren bir başlatma nedeni biçimi belirtiliyordu. Bu gevşek spesifikasyon, yüzlerce özel (ve bazen anlamsız) önyükleme nedeni dizisinin çoğalmasına ve bunun sonucunda yönetilemeyen bir duruma yol açtı. Mevcut Android sürümünde, bootloader tarafından gönderilen neredeyse ayrıştırılamayan veya anlamsız içeriklerin çok fazla olması bootloader_boot_reason_prop
için uygunluk sorunları oluşturdu.
Android 9'un yayınlanmasıyla birlikte Android Ekibi, eski bootloader_boot_reason_prop
'nın önemli bir ivme kazandığını ve çalışma zamanında yeniden yazılamayacağını kabul etti. Bu nedenle, önyükleme nedeni spesifikasyonunda yapılacak iyileştirmeler, önyükleyici geliştiricilerle etkileşimlerden ve mevcut sistemde yapılacak ince ayarlardan kaynaklanmalıdır. Bu amaçla Android Ekibi:
- Bootloader geliştiricileriyle etkileşime geçerek onları şunları yapmaya teşvik edin:
bootloader_boot_reason_prop
için standart, ayrıştırılabilir ve tanınabilir nedenler sunun.system/core/bootstat/bootstat.cpp
kBootReasonMap
listesine katılın.
system_boot_reason_prop
(sys.boot.reason
) için kontrollü ve çalışma zamanında yeniden yazılabilir bir kaynak ekleme. Sınırlı sayıda sistem uygulaması (ör.bootstat
veinit
) bu özelliği yeniden yazabilir ancak tüm uygulamalara okuma için sepolicy hakları verilebilir.- Kullanıcıları, sistem başlatma nedeni özelliğindeki içeriğe güvenmeden önce kullanıcı verileri monte edilene kadar beklemeleri için başlatma nedeni hakkında bilgilendirin.
system_boot_reason_prop
.
Neden bu kadar geç? bootloader_boot_reason_prop
, başlatma sırasında erken bir aşamada kullanılabilir olsa da yanlış, ayrıştırılamayan ve standart olmayan bilgileri temsil ettiğinden Android güvenlik politikası tarafından gerektiğinde engellenir.
Çoğu durumda, bu bilgilere yalnızca önyükleme sistemi hakkında derinlemesine bilgi sahibi olan geliştiricilerin erişmesi gerekir. system_boot_reason_prop
ile önyükleme nedeni için hassas, ayrıştırılabilir ve kanonik bir API, yalnızca kullanıcı verileri bağlandıktan sonra güvenilir ve doğru bir şekilde alınabilir.
Özellikle:
- Kullanıcı verileri yerleştirilmeden önce,
system_boot_reason_prop
,bootloader_boot_reason_prop
değerini içerir. - Kullanıcı verileri bağlandıktan sonra,
system_boot_reason_prop
uyumlu olacak veya daha doğru bilgiler raporlayacak şekilde güncellenebilir.
Bu nedenle Android 9, önyükleme nedeninin resmi olarak alınabileceği süreyi uzatır. Bu süre, önyüklemede anında doğru olmaktan (bootloader_boot_reason_prop
ile) yalnızca kullanıcı verileri bağlandıktan sonra kullanılabilir olmaya (system_boot_reason_prop
ile) değiştirilir.
Bootstat mantığı, daha bilgilendirici ve uyumlu bir bootloader_boot_reason_prop
'ya bağlıdır. Bu özellik, tahmin edilebilir bir biçim kullandığında tüm kontrollü yeniden başlatma ve kapatma senaryolarının doğruluğunu artırır. Bu da system_boot_reason_prop
'nın doğruluğunu ve anlamını iyileştirip genişletir.
Standart başlatma nedeni biçimi
Android 9'da bootloader_boot_reason_prop
için standart başlatma nedeni biçimi şu söz dizimini kullanır:
<reason>,<subreason>,<detail>…
Biçimlendirme kuralları:
- Küçük harf
- Boşluk yok (alt çizgi kullanın)
- Yazdırılabilir tüm karakterler
- Virgülle ayrılmış
reason
,subreason
ve bir veya daha fazladetail
örneği.- Cihazın yeniden başlatılması veya kapatılması gereken en yüksek öncelikli nedeni temsil eden zorunlu bir
reason
. - Cihazın neden yeniden başlatılması veya kapatılması gerektiği (ya da cihazı kimin yeniden başlattığı veya kapattığı) ile ilgili kısa bir özeti temsil eden isteğe bağlı bir
subreason
. - Bir veya daha fazla isteğe bağlı
detail
değeri. Birdetail
, hangi sisteminsubreason
ile sonuçlandığını belirlemeye yardımcı olmak için bir alt sistemi işaret edebilir. Birden fazladetail
değeri belirtebilirsiniz. Bu değerler genellikle önem sırasına göre bir hiyerarşi izlemelidir. Ancak, eşit öneme sahip birden fazladetail
değerin raporlanması da kabul edilebilir.
- Cihazın yeniden başlatılması veya kapatılması gereken en yüksek öncelikli nedeni temsil eden zorunlu bir
bootloader_boot_reason_prop
için boş bir değer, yasa dışı kabul edilir (çünkü bu, diğer aracıların sonradan bir başlatma nedeni eklemesine olanak tanır).
Neden koşulları
reason
(ilk aralık, sonlandırmadan veya virgül öncesi) için verilen değer, temel, güçlü ve zayıf nedenler olarak ayrılan aşağıdaki kümeden olmalıdır:
- kernel set:
- "
watchdog"
"kernel_panic"
- "
- güçlü set:
"recovery"
"bootloader"
- blunt set:
"cold"
. Genellikle bellek de dahil olmak üzere tüm cihazların tamamen sıfırlandığını gösterir."hard"
. Genellikle donanımın durumunun sıfırlandığını veramoops
öğesinin kalıcı içeriği koruması gerektiğini gösterir."warm"
. Genellikle belleğin ve cihazların bir durumu koruduğunu,ramoops
(pstore
sürücüsüne bakın) yedekleme deposunun ise kalıcı içerik barındırdığını gösterir."shutdown"
"reboot"
. Genellikleramoops
durumunun bilinmediği ve donanım durumunun bilinmediği anlamına gelir.cold
,hard
vewarm
değerleri, cihazın sıfırlama derinliği hakkında ipuçları verdiğinden bu değer genel bir değerdir.
Önyükleyiciler bir çekirdek kümesi veya küt bir küme reason
sağlamalıdır ve belirlenebiliyorsa subreason
sağlamaları kesinlikle önerilir. Örneğin, yedekli veya yedeksiz uzun güç tuşu basma işleminde başlatma nedeni "reboot,longkey"
olur.ramoops
Birinci kapsamlı reason
, herhangi bir subreason
veya detail
'nin parçası olamaz. Ancak çekirdek ayarı nedenleri kullanıcı alanı tarafından oluşturulamadığından, "watchdog"
, kaynakla ilgili ayrıntılarla (ör. "reboot,watchdog,service_manager_unresponsive"
veya "reboot,software,watchdog"
) birlikte, net bir ayar nedeninden sonra yeniden kullanılabilir.
Önyükleme nedenlerinin anlaşılması için uzmanlık düzeyinde şirket içi bilgi gerekmemeli ve/veya sezgisel bir raporla okunabilir olmalıdır. Örnekler:
"shutdown,vbxd"
(kötü), "shutdown,uv"
(daha iyi),
"shutdown,undervoltage"
(tercih edilen).
Neden-alt neden kombinasyonları
Android, normal kullanımda aşırı yüklenmemesi gereken ancak kombinasyon ilişkili durumu doğru şekilde yansıtıyorsa duruma özel olarak kullanılabilecek bir dizi reason
-subreason
kombinasyonu ayırır. Ayrılmış kombinasyonlara örnek olarak aşağıdakiler verilebilir:
"reboot,userrequested"
"shutdown,userrequested"
"shutdown,thermal"
(thermald
tarafından)"shutdown,battery"
"shutdown,battery,thermal"
(BatteryStatsService
tarafından)"reboot,adb"
"reboot,shell"
"reboot,bootloader"
"reboot,recovery"
Daha fazla bilgi için kBootReasonMap
bölümüne ve Android kaynak deposundaki ilişkili git değişiklik günlüğü geçmişine bakın.system/core/bootstat/bootstat.cpp
Yeniden başlatma nedenlerini bildirme
Önyükleyiciden kaynaklanan veya standart önyükleme nedenine kaydedilen tüm önyükleme nedenleri, system/core/bootstat/bootstat.cpp
dosyasının kBootReasonMap
bölümüne kaydedilmelidir. kBootReasonMap
listesi, uyumlu ve eski uyumsuz nedenlerin bir karışımıdır. Önyükleyici geliştiriciler, yalnızca yeni ve uygunluk koşullarını karşılayan nedenleri buraya kaydetmelidir (ve ürün zaten gönderilmişse ve değiştirilemiyorsa uygunluk koşullarını karşılamayan nedenleri kaydetmemelidir).
system/core/bootstat/bootstat.cpp
içinde mevcut ve uyumlu girişleri kullanmanızı, uyumlu olmayan bir dize kullanmadan önce dikkatli olmanızı önemle tavsiye ederiz. Genel olarak:
"kernel_panic"
'ı önyükleyiciden bildirmek için Tamam'ı tıklayın.bootstat
, alt nedenleri kanoniksystem_boot_reason_prop
'e dönüştürmek içinramoops
'ikernel_panic signatures
açısından inceleyebilir.kBootReasonMap
içinde uyumlu olmayan bir dizeyi bildirmek uygun değildir (ör.reason
'yi hassaslaştırma özelliğini bozacağından, önyükleyiciden gelen"panic")
).
Örneğin, kBootReasonMap
, "wdog_bark"
içeriyorsa:
Önyükleyici geliştiricisi şunları yapmalıdır:
"watchdog,bark"
olarak değiştirin vekBootReasonMap
listesine ekleyin.- Teknolojiye aşina olmayanlar için
"bark"
ne anlama geliyor? Daha anlamlı birsubreason
var mı?
Başlatma nedeni uygunluğunu doğrulama
Android şu anda bir önyükleyicinin sağlayabileceği olası tüm başlatma nedenlerini doğru şekilde tetikleyebilen veya inceleyebilen etkin bir CTS testi sunmamaktadır. İş ortakları, uyumluluğu belirlemek için pasif bir test çalıştırmayı deneyebilir.
Bu nedenle, önyükleyici uyumluluğu için önyükleyici geliştiricilerin yukarıda açıklanan kuralların ve yönergelerin ruhuna gönüllü olarak uyması gerekir.
Bu tür geliştiricileri AOSP'ye (özellikle system/core/bootstat/bootstat.cpp
) katkıda bulunmaya ve bu fırsatı başlatma nedeni sorunlarıyla ilgili tartışmalar için bir forum olarak kullanmaya teşvik ediyoruz.