Android 9, önyükleyici önyükleme nedeni spesifikasyonunda aşağıdaki değişiklikleri içerir.
Başlatma nedenleri
Ö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, Android çekirdek komut satırına androidboot.bootreason=<reason>
ekleyerek bu belirlemeyi iletir. init
daha sonra bu komut satırını, Android mülkü bootloader_boot_reason_prop
'e (ro.boot.bootreason
) dağıtılacak şekilde çevirir.
Android 12 veya sonraki sürümlerle kullanıma sunulan ve 5.10 veya daha yeni bir çekirdek sürümü kullanan cihazlarda, çekirdek komut satırı yerine androidboot.bootreason=<reason>
, bootconfig'e eklenir.
Başlatma nedeni özellikleri
Android'in önceki sürümlerinde, boşluk kullanılmayan, tamamen küçük harflerden oluşan, birkaç şart içeren (ör. kernel_panic
, watchdog
, cold
/warm
/hard
bildirme) ve diğer benzersiz nedenler için izin verilen bir önyükleme nedeni biçimi belirtilmişti. Bu gevşek spesifikasyon, yüzlerce özel (ve bazen anlamsız) önyükleme nedeni dizesinin çoğalmasına neden oldu ve bu da yönetilemez bir duruma yol açtı. Mevcut Android sürümünden itibaren, bootloader tarafından gönderilen neredeyse ayrıştırılamaz veya anlamsız içeriklerin ivmesi bootloader_boot_reason_prop
için uyumluluk sorunları oluşturdu.
Android 9 sürümüyle birlikte Android ekibi, eski bootloader_boot_reason_prop
'ün önemli bir ivme kazandığını ve çalışma zamanında yeniden yazılamayacağını fark etti. Bu nedenle, önyükleme nedeni spesifikasyonunda yapılacak iyileştirmeler, önyükleme programı geliştiricileriyle etkileşimlerden ve mevcut sistemde yapılacak düzenlemelerden kaynaklanmalıdır. Bu doğrultuda Android Ekibi:
- Aşağıdakileri yapmaya teşvik etmek için önyükleme programı geliştiricileriyle etkileşim kurma:
bootloader_boot_reason_prop
için standart, 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
) için kontrollü ve çalışma zamanında yeniden yazılabilir bir kaynak ekleme. Bu mülkü, sınırlı sayıda sistem uygulaması (bootstat
veinit
gibi) yeniden yazabilir ancak tüm uygulamalara bu mülkü okumak için sepolicy hakları verilebilir.- Kullanıcıları, sistem önyükleme nedeni mülkünde bulunan içeriğe güvenmeden önce userdata'nın monte edilmesini beklemeleri konusunda bilgilendirme
system_boot_reason_prop
.
Neden bu kadar geç? bootloader_boot_reason_prop
, önyükleme işleminin başlarında kullanılabilir ancak yanlış, ayrıştırılamaz ve standart olmayan bilgiler içerdiği için Android güvenlik politikası tarafından gerektiğinde engellenir.
Çoğu durumda, yalnızca önyükleme sistemi hakkında derin bilgi sahibi olan geliştiricilerin bu bilgilere erişmesi gerekir. system_boot_reason_prop
ile önyükleme nedeni için rafine, ayrıştırılabilir ve standart bir API, yalnızca userdata yüklendikten sonra güvenilir ve doğru bir şekilde alınabilir.
Özellikle:
- userdata monte edilmeden önce,
system_boot_reason_prop
,bootloader_boot_reason_prop
'daki değeri içerir. - userdata yüklendikten sonra
system_boot_reason_prop
, uyumlu olacak veya daha doğru bilgi bildirecek şekilde güncellenebilir.
Bu nedenle Android 9, önyükleme nedeninin resmi olarak alınabilmesi için geçen süreyi uzatır. Böylece, önyüklemede hemen doğru olan (bootloader_boot_reason_prop
ile) bu bilgi, yalnızca userdata bağlandıktan sonra (system_boot_reason_prop
ile) kullanılabilir hale gelir.
Bootstat mantığı, daha bilgilendirici ve uyumlu bir bootloader_boot_reason_prop
kullanır. Bu mülk, öngörülebilir bir biçim kullandığında tüm kontrollü yeniden başlatma ve kapatma senaryolarının doğruluğu artar. Bu da system_boot_reason_prop
değerinin doğruluğunu ve anlamını hassaslaştırır ve genişletir.
Standart önyükleme nedeni biçimi
Android 9'daki bootloader_boot_reason_prop
için standart önyükleme nedeni biçiminde şu söz dizimi kullanılır:
<reason>,<subreason>,<detail>…
Biçimlendirme kuralları:
- Küçük harf
- Boşluk yok (altı çizili kullanın)
- Tüm basılabilir karakterler
- Virgülle ayrılmış
reason
,subreason
ve bir veya daha fazladetail
örneği.- Cihazın yeniden başlatılması veya kapatılmasıyla ilgili en yüksek öncelikli nedeni temsil eden zorunlu bir
reason
. - Cihazın neden yeniden başlatılması veya kapatılması gerektiğinin (veya cihazı kimin yeniden başlattığını veya kapattığının) kısa bir özetini gösteren isteğe bağlı bir
subreason
. - Bir veya daha fazla isteğe bağlı
detail
değeri.detail
,subreason
'ye yol açan belirli sistemin belirlenmesine yardımcı olmak için bir alt sistemi işaret edebilir. Birden fazladetail
değeri belirtebilirsiniz. Bu değerler genellikle önem hiyerarşisini takip etmelidir. Ancak eşit öneme sahip birden fazladetail
değerinin raporlanması da kabul edilir.
- Cihazın yeniden başlatılması veya kapatılmasıyla ilgili en yüksek öncelikli nedeni temsil eden zorunlu bir
bootloader_boot_reason_prop
için boş bir değer geçersiz kabul edilir (böylece diğer aracıların daha sonra bir önyükleme nedeni eklemesine izin verilir).
Neden şartları
reason
için verilen değer (bitiş veya virgülden önceki ilk span), çekirdek, güçlü ve keskin nedenlere ayrılmış aşağıdaki gruptan olmalıdır:
- çekirdek grubu:
- "
watchdog"
"kernel_panic"
- "
- güçlü ayar:
"recovery"
"bootloader"
- blunt 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ı veramoops
'in kalıcı içeriği"warm"
. Genellikle belleğin ve cihazların bazı durumları koruduğunu,ramoops
(bkz. çekirdektekipstore
sürücüsü) yedek deposunun ise kalıcı içerik barındırdığını gösterir."shutdown"
"reboot"
. Genellikleramoops
durumunun ve donanım durumunun bilinmediği anlamına gelir.cold
,hard
vewarm
değerleri, cihazın sıfırlanmasının kapsamı hakkında ipucu sağladığından bu değer her şeyi kapsar.
Önyükleme yükleyiciler bir çekirdek grubu veya düz grup reason
sağlamalıdır ve belirlenebiliyorsa subreason
sağlaması önemle tavsiye edilir. Örneğin, ramoops
yedeği olup olmayabileceğinden bağımsız olarak güç düğmesine uzun basıldığında "reboot,longkey"
önyükleme nedeni olur.
Hiçbir ilk span reason
, subreason
veya detail
'nin parçası olamaz. Ancak çekirdek ayarlama nedenleri kullanıcı alanı tarafından üretilemediğinden, "watchdog"
, kaynakla ilgili bir ayrıntıyla (örneğin, "reboot,watchdog,service_manager_unresponsive"
veya "reboot,software,watchdog"
) birlikte, doğrudan ayarlama nedeninin ardından yeniden kullanılabilir.
Açılış nedenlerinin anlaşılması için uzman düzeyinde şirket içi bilgi gerekmemelidir ve/veya sezgisel bir raporla kullanıcılar tarafından 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 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 system/core/bootstat/bootstat.cpp
'daki kBootReasonMap
bölümüne ve Android kaynak deposundaki ilişkili git changelog geçmişine bakın.
Açılış nedenlerini bildirme
Önyükleme nedenlerinin tümü (önyükleme yükleyiciden veya standart önyükleme nedeni olarak kaydedilenler) system/core/bootstat/bootstat.cpp
'un kBootReasonMap
bölümüne kaydedilmelidir. kBootReasonMap
listesi, uyumlu ve eski uyumlu olmayan nedenlerin bir karışımıdır. Önyükleme aygıtı geliştiricileri, yalnızca yeni uyumlu nedenleri burada kaydetmelidir (ürün gönderilmiş ve değiştirilemez durumda olmadığı sürece uyumlu olmayan nedenleri kaydetmemelidir).
system/core/bootstat/bootstat.cpp
'te mevcut, uyumlu girişleri kullanmanızı ve uyumlu olmayan bir dize kullanmadan önce dikkatli olmanızı önemle tavsiye ederiz. Bu konuda yol gösterici olacak şekilde aşağıdakileri belirtmek isteriz:
bootstat
, alt nedenleri standartsystem_boot_reason_prop
olarak hassaslaştırmak içinkernel_panic signatures
içinramoops
'i denetleyebilir. Bu nedenle,"kernel_panic"
'yi önyükleyiciden bildirmek için Tamam'ı tıklayın.kBootReasonMap
'de uyumlu olmayan bir dizenin bildirilmesi Tamam değildir (ör. bootloader'daki"panic")
). Bu,reason
'i hassaslaştırma özelliğini bozar.
Örneğin, kBootReasonMap
, "wdog_bark"
içeriyorsa bir önyükleme programı geliştiricisi:
"watchdog,bark"
olarak değiştirin vekBootReasonMap
'te listeye ekleyin."bark"
'ün teknolojiyle aşina olmayanlar için ne anlama geldiğini düşünün ve daha anlamlı birsubreason
'ün kullanılıp kullanılamayacağını belirleyin.
Başlatma nedeninin uygunluğunu doğrulama
Android şu anda, bir önyükleyicinin sağlayabileceği tüm olası önyükleme nedenlerini doğru bir şekilde tetikleyebilen veya inceleyebilecek etkin bir CTS testi sunmamaktadır. Bununla birlikte, iş ortakları uyumluluğu belirlemek için pasif bir test çalıştırmayı deneyebilir.
Bu nedenle, önyükleme yöneticisi uyumluluğu, önyükleme yöneticisi 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
'e) katkıda bulunmaya ve bu fırsatı, önyükleme nedeni sorunlarıyla ilgili tartışmalar için bir forum olarak kullanmaya çağırıyoruz.