Kanonik Önyükleme Nedeni

Android 9, önyükleyici önyükleme nedeni spesifikasyonunda aşağıdaki değişiklikleri içerir.

Önyükleme nedenleri

Bir önyükleyici, bir cihazın neden yeniden başlatıldığını belirlemek için benzersiz donanım ve bellek kaynaklarını kullanır, ardından başlatılması için androidboot.bootreason=<reason> Android çekirdek komut satırına ekleyerek bu belirlemeyi iletir. init daha sonra bu komut satırını bootloader_boot_reason_prop ( ro.boot.bootreason ) Android özelliğine yaymak için çevirir. Android 12 veya sonraki sürümlerle başlatılan ve çekirdek sürümü 5.10 veya üstünü kullanan cihazlar için, çekirdek komut satırı yerine androidboot.bootreason=<reason> bootconfig'e eklenir.

Önyükleme nedeni özellikleri

Android'in önceki sürümleri, boşluk kullanmayan, tümü küçük harften oluşan, birkaç gereksinim içeren ( kernel_panic , watchdog , cold / warm / hard raporlaması gibi) ve diğer benzersiz nedenlere izin veren bir önyükleme nedeni formatı belirliyordu. Bu gevşek spesifikasyon, yüzlerce özel (ve bazen anlamsız) önyükleme nedeni dizisinin çoğalmasına neden oldu ve bu da yönetilemez bir duruma yol açtı. Mevcut Android sürümünden itibaren, önyükleyici tarafından dosyalanan neredeyse ayrıştırılamaz veya anlamsız içeriğin büyük ivmesi, bootloader_boot_reason_prop için uyumluluk sorunları yarattı.

Android 9 sürümüyle birlikte Android ekibi, eski bootloader_boot_reason_prop dosyasının önemli bir ivmeye sahip olduğunu ve çalışma zamanında yeniden yazılamadığını fark etti. Bu nedenle, önyükleme nedeni spesifikasyonunda yapılacak herhangi bir iyileştirme, önyükleyici geliştiricileriyle olan etkileşimlerden ve mevcut sistemde yapılan ayarlamalardan gelmelidir. Bu amaçla Android ekibi:

  • Önyükleyici geliştiricilerini aşağıdakileri yapmaya teşvik etmek için onlarla etkileşime geçmek:
    • bootloader_boot_reason_prop için kurallı, ayrıştırılabilir ve tanınabilir nedenler sağlayın.
    • system/core/bootstat/bootstat.cpp kBootReasonMap listesine katılın.
  • system_boot_reason_prop ( sys.boot.reason ) kontrollü ve çalışma zamanında yeniden yazılabilir bir kaynağının eklenmesi. Sınırlı sayıda sistem uygulaması ( bootstat ve init gibi) bu özelliği yeniden yazabilir, ancak tüm uygulamalara bunu okumaları için sepolicy hakları verilebilir.
  • Sistem önyükleme nedeni özelliğindeki system_boot_reason_prop içeriğine güvenmeden önce, kullanıcı verileri bağlanıncaya kadar beklemeleri gereken önyükleme nedeni konusunda kullanıcıları bilgilendirmek.

Neden bu kadar geç? bootloader_boot_reason_prop , önyüklemenin başlarında kullanılabilir olsa da, yanlış, ayrıştırılamaz ve kurallı olmayan bilgileri temsil ettiğinden Android güvenlik politikası tarafından ihtiyaç halinde engellenir. Çoğu durumda, yalnızca önyükleme sistemi hakkında derin bilgiye sahip geliştiricilerin bu bilgilere erişmesi gerekir. system_boot_reason_prop aracılığıyla önyükleme amacıyla geliştirilmiş, 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 bağlanmadan önce system_boot_reason_prop , bootloader_boot_reason_prop gelen değeri içerecektir.
  • Kullanıcı verileri bağlandıktan sonra system_boot_reason_prop uyumlu olacak veya daha doğru bilgiler bildirecek şekilde güncellenebilir.

Bu nedenle Android 9, önyükleme nedeninin resmi olarak edinilmesinden önceki süreyi uzatarak, önyükleme nedeninin ( bootloader_boot_reason_prop ile) hemen doğru olmasını, yalnızca kullanıcı verileri bağlandıktan sonra ( system_boot_reason_prop ile) kullanılabilir olmasını sağlar.

Bootsstat mantığı daha bilgilendirici ve uyumlu bir bootloader_boot_reason_prop bağlıdır. Bu özellik öngörülebilir bir format 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 doğruluğunu ve anlamını hassaslaştırır ve genişletir.

Kanonik önyükleme nedeni biçimi

Android 9'daki bootloader_boot_reason_prop için kurallı önyükleme nedeni biçimi aşağıdaki sözdizimini kullanır:

<reason>,<subreason>,<detail>…

Biçimlendirme kuralları:

  • Küçük harf
  • Boşluk yok (altı çizili kullanın)
  • Tüm yazdırılabilir karakterler
  • Virgülle ayrılmış reason , subreason ve bir veya daha fazla detail .
    • Cihazın neden yeniden başlatılması veya kapatılması gerektiğinin en yüksek öncelikli nedenini temsil eden gerekli bir reason .
    • Cihazın neden yeniden başlatılması veya kapatılması gerektiğine (veya cihazı kimin yeniden başlattığı veya kapattığı) ilişkin 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 spesifik sistemin subreason yol açtığını belirlemeye yardımcı olacak bir alt sisteme işaret edebilir. Genellikle bir önem hiyerarşisini takip etmesi gereken birden çok detail değeri belirtebilirsiniz. Ancak eşit öneme sahip birden fazla detail değerinin 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 olaydan sonra bir önyükleme nedeni eklemesine olanak tanır).

Sebep gereksinimleri

reason için verilen değer (ilk aralık, sonlandırma veya virgülden önce), çekirdek, güçlü ve kesin sebeplere bölünmüş aşağıdaki gruptan olmalıdır:

  • çekirdek seti:
    • " watchdog"
    • "kernel_panic"
  • güçlü küme:
    • "recovery"
    • "bootloader"
  • künt set:
    • "cold" . Genellikle bellek dahil tüm cihazların tamamen sıfırlandığını gösterir.
    • "hard" . Genellikle donanımın durumunun sıfırlandığını ve ramoops kalıcı içeriği koruması gerektiğini belirtir.
    • "warm" . Genellikle belleğin ve aygıtların bazı durumları koruduğunu ve ramoops (çekirdekteki pstore sürücüsüne bakın) yedekleme deposunun kalıcı içerik içerdiğini belirtir.
    • "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ğine ilişkin ipuçları sağladığından bu değer kapsamlıdır.

Önyükleyiciler bir çekirdek kümesi veya kesin bir küme reason sağlamalıdır ve belirlenebilirse bir subreason sağlamaları şiddetle tavsiye edilir. Örneğin, ramoops yedeğine sahip olan veya olmayan bir güç tuşuna uzun basıldığında, önyükleme nedeni "reboot,longkey" olacaktır.

Hiçbir ilk aralık reason herhangi bir subreason veya detail parçası olamaz. Bununla birlikte, çekirdek seti nedenleri kullanıcı alanı tarafından üretilemediğinden, "watchdog" kaynağın bir ayrıntısıyla birlikte açık bir set nedeninden sonra yeniden kullanılabilir (örn. "reboot,watchdog,service_manager_unresponsive" veya "reboot,software,watchdog" ).

Önyükleme nedenlerinin çözülmesi için dahili uzman bilgisi gerektirmemeli ve/veya sezgisel bir raporla insanlar tarafından okunabilir olmalıdır. Örnekler: "shutdown,vbxd" (kötü), "shutdown,uv" (daha iyi), "shutdown,undervoltage" (tercih edilir).

Sebep-Alt Sebep kombinasyonları

Android, normal kullanımda aşırı yüklenmemesi gereken, ancak kombinasyonun ilişkili durumu doğru bir şekilde yansıtması durumunda duruma göre kullanılabilen bir dizi reason - subreason kombinasyonlarını saklı tutar. Ayrılmış kombinasyonların örnekleri şunları içerir:

  • "reboot,userrequested"
  • "shutdown,userrequested"
  • "shutdown,thermal" ( thermald )
  • "shutdown,battery"
  • "shutdown,battery,thermal" ( BatteryStatsService )
  • "reboot,adb"
  • "reboot,shell"
  • "reboot,bootloader"
  • "reboot,recovery"

Daha fazla ayrıntı için system/core/bootstat/bootstat.cpp kBootReasonMap ve Android kaynak deposundaki ilgili git changelog geçmişine bakın.

Önyükleme nedenlerini bildirme

Önyükleyiciden gelen veya kurallı ö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, uyumluluk ve eski uyumsuzluk nedenlerinin bir karışımıdır. Bootloader geliştiricileri buraya yalnızca yeni uyumluluk nedenlerini kaydetmelidir (ve ürün zaten gönderilmediği ve değiştirilemediği sürece uyumsuz nedenleri kaydetmemelidir).

system/core/bootstat/bootstat.cpp dosyasındaki mevcut, uyumlu girişleri kullanmanızı ve uyumlu olmayan bir dize kullanmadan önce dikkatli olmanızı önemle tavsiye ederiz. Bir kılavuz olarak şöyledir:

  • bootstat , alt nedenleri kanonik system_boot_reason_prop olarak hassaslaştırmak için ramoops kernel_panic signatures açısından inceleyebileceğinden, önyükleyiciden "kernel_panic" raporunu bildirmeniz tamamdır .
  • Önyükleyiciden kBootReasonMap uyumlu olmayan bir dizeyi ( "panic") bildirmek doğru değildir , çünkü bu sonuçta reason düzeltme yeteneğini bozacaktır.

Örneğin, kBootReasonMap "wdog_bark" içeriyorsa, bir önyükleyici geliştiricisi şunları yapmalıdır:

  • "watchdog,bark" olarak değiştirin ve kBootReasonMap listeye ekleyin.
  • Teknolojiye aşina olmayanlar için "bark" ne anlama geldiğini düşünün ve daha anlamlı bir subreason mevcut olup olmadığını belirleyin.

Önyükleme nedeni uyumluluğunun doğrulanması

Şu anda Android, bir önyükleyicinin sağlayabileceği tüm olası önyükleme nedenlerini doğru bir şekilde tetikleyebilecek veya denetleyebilecek aktif bir CTS testi sağlamamaktadır; iş ortakları yine de uyumluluğu belirlemek için pasif bir test çalıştırmayı deneyebilir.

Sonuç olarak, önyükleyici uyumluluğu, önyükleyici geliştiricilerinin yukarıda açıklanan kuralların ve yönergelerin ruhuna gönüllü olarak uymasını gerektirir. Bu tür geliştiricileri AOSP'ye (özellikle system/core/bootstat/bootstat.cpp dosyasına) katkıda bulunmaya ve bu fırsatı önyükleme nedeni sorunları hakkındaki tartışmalar için bir forum olarak kullanmaya davet ediyoruz.