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şlatılması için Android çekirdek komut satırına androidboot.bootreason=<reason> ekleyerek bu belirlemeyi bildirir. init daha sonra 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 ve çekirdek sürümü 5.10 ya da daha yeni olan 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 neden oldu. Bu da 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'nin ö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 userdata'nın bağlanmasını bekleme konusunda bilgilendirme system_boot_reason_prop.

Neden bu kadar geç? bootloader_boot_reason_prop, başlatma sırasında erken bir aşamada kullanılabilir ancak 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 ve önyüklemede anında doğru olan (bootloader_boot_reason_prop ile) durumu, yalnızca kullanıcı verileri bağlandıktan sonra kullanılabilir (system_boot_reason_prop ile) duruma getirir.

Bootstat mantığı, daha bilgilendirici ve uyumlu bir bootloader_boot_reason_prop bağlıdır. Bu özellik, öngörülebilir 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ğerini raporlamak 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, fesih 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ü küme:
    • "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 kaba bir küme reason sağlamalıdır ve belirlenebiliyorsa subreason sağlamaları kesinlikle önerilir. Örneğin, yedekli veya yedeksiz uzun süreli güç tuşu basma işleminde başlatma nedeni "reboot,longkey" olur.ramoops

Birinci kapsam reason, herhangi bir subreason veya detail kapsamının 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, açık 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 koşulu doğru şekilde yansıtıyorsa duruma göre 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, buraya yalnızca yeni ve uygunluk koşullarını karşılayan nedenleri 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. Kılavuz olarak şunları söyleyebiliriz:

  • "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 iyileştirme ö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 sağlamamaktadı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.