Android 9, bootloader başlatma 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
'a (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 belirtiliyordu. 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, başlatma nedeni spesifikasyonundaki tüm iyileştirmeler, bootloader geliştiricileriyle etkileşimlerden ve mevcut sistemde yapılan düzenlemelerden gelmelidir. 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
öğesine 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 başlatma sistemi hakkında derinlemesine bilgi sahibi olan geliştiricilerin bu bilgilere erişmesi gerekir. system_boot_reason_prop
ile başlatma 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:
- Kullanıcı verileri eklenmeden önce
system_boot_reason_prop
,bootloader_boot_reason_prop
değerini 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ılmasını gerektirir. 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ının en yüksek öncelikli nedenini temsil eden gerekli
reason
. - Cihazın neden yeniden başlatılmasının veya kapatılmasının (ya da kimin yeniden başlatılmasının veya kapatılmasının) kısa bir özetini temsil eden 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. Bunlar genellikle bir önem hiyerarşisini izlemelidir. Ancak eşit öneme sahip birden fazladetail
değerinin raporlanması da kabul edilir.
- Cihazın yeniden başlatılması veya kapatılmasının en yüksek öncelikli nedenini temsil eden gerekli
bootloader_boot_reason_prop
için boş bir değer, diğer aracıların daha sonra bir önyükleme nedeni eklemesine izin verdiğinden yasa dışı kabul edilir.
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 koruyacağını gösterir."warm"
. Genellikle belleğin ve cihazların bazı durumları koruduğunu,ramoops
(bkz. çekirdektekipstore
sürücü) 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 sıfırlama işleminin derinliği hakkında ipuçları sağladığından bu değer geniş kapsamlıdır.
Ö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ği uzun basılan güç düğmesi için "reboot,longkey"
önyükleme nedeni olur.
Hiçbir ilk span reason
, subreason
veya detail
'nin parçası olamaz. Bununla birlikte, çekirdek grubu nedenleri kullanıcı alanı tarafından üretilemeyeceğinden "watchdog"
, künt olarak ayarlanan bir nedenden sonra kaynağın ayrıntısıyla (örneğin, "reboot,watchdog,service_manager_unresponsive"
veya "reboot,software,watchdog"
) tekrar 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
dosyasını ve Android kaynak deposundaki ilişkili git changelog geçmişini inceleyin.
Başlatma nedenlerini raporla
Önyükleme nedenlerinin tümü (önyükleme yükleyiciden veya standart önyükleme nedeni olarak kaydedilenler) system/core/bootstat/bootstat.cpp
dosyasının kBootReasonMap
bölümüne kaydedilmelidir. kBootReasonMap
listesi, uyumlu ve eski uyumlu olmayan nedenlerin bir karışımıdır. Bootloader geliştiricileri buraya yalnızca yeni uyumlu nedenleri kaydetmelidir (ve ürün daha önce gönderilmiş ve değiştirilemediği sürece uyumlu olmayan nedenler kaydetmemelidir).
system/core/bootstat/bootstat.cpp
'de mevcut, uyumlu girişleri kullanmanızı ve uyumlu olmayan bir dize kullanmadan önce dikkatli olmanızı önemle tavsiye ederiz. Yönerge olarak şu şekildedir:
bootstat
, alt nedenleri standartsystem_boot_reason_prop
içinde ayrıntılandırmak amacıylakernel_panic signatures
içinramoops
öğesini inceleyebilir. Bu nedenle, bootloader'dan"kernel_panic"
dosyasını bildirmek için tamam.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
alanında "wdog_bark"
varsa bootloader geliştiricisi:
"watchdog,bark"
olarak değiştirin vekBootReasonMap
bölgesindeki 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 nedeni uygunluğunu doğrulayın
Şu anda Android, 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.