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
veinit
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 fazladetail
.- 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. Birdetail
hangi spesifik sisteminsubreason
yol açtığını belirlemeye yardımcı olacak bir alt sisteme işaret edebilir. Genellikle bir önem hiyerarşisini takip etmesi gereken birden çokdetail
değeri belirtebilirsiniz. Ancak eşit öneme sahip birden fazladetail
değerinin raporlanması da kabul edilebilir.
- Cihazın neden yeniden başlatılması veya kapatılması gerektiğinin en yüksek öncelikli nedenini temsil eden gerekli bir
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ı veramoops
kalıcı içeriği koruması gerektiğini belirtir. -
"warm"
. Genellikle belleğin ve aygıtların bazı durumları koruduğunu veramoops
(çekirdektekipstore
sürücüsüne bakın) yedekleme deposunun kalıcı içerik içerdiğini belirtir. -
"shutdown"
-
"reboot"
. Genellikleramoops
durumunun bilinmediği ve donanım durumunun bilinmediği anlamına gelir.cold
,hard
vewarm
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 kanoniksystem_boot_reason_prop
olarak hassaslaştırmak içinramoops
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çtareason
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 vekBootReasonMap
listeye ekleyin. - Teknolojiye aşina olmayanlar için
"bark"
ne anlama geldiğini düşünün ve daha anlamlı birsubreason
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.