Standart önyükleme nedeni

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 ve init) 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 fazla detail ö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. Bir detail , hangi sistemin subreason ile sonuçlandığını belirlemeye yardımcı olmak için bir alt sistemi işaret edebilir. Birden fazla detail değeri belirtebilirsiniz. Bu değerler genellikle önem sırasına göre bir hiyerarşi izlemelidir. Ancak, eşit öneme sahip birden fazla detail değerin raporlanması da kabul edilebilir.

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ı ve ramoops öğ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". Genellikle ramoops durumunun bilinmediği ve donanım durumunun bilinmediği anlamına gelir. cold, hard ve warm 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 kanonik system_boot_reason_prop'e dönüştürmek için ramoops'i kernel_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 ve kBootReasonMap listesine ekleyin.
  • Teknolojiye aşina olmayanlar için "bark" ne anlama geliyor? Daha anlamlı bir subreason 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.