Android 9 menyertakan perubahan berikut pada spesifikasi alasan booting bootloader.
Alasan booting
Bootloader menggunakan hardware dan resource memori yang tersedia secara unik untuk
menentukan alasan perangkat melakukan reboot, lalu mengomunikasikan penentuan tersebut dengan
menambahkan androidboot.bootreason=<reason>
ke command line kernel Android
untuk peluncurannya. init
kemudian menerjemahkan command line ini untuk disebarkan ke properti Android bootloader_boot_reason_prop
(ro.boot.bootreason
).
Untuk perangkat yang diluncurkan dengan Android 12 atau yang lebih tinggi, menggunakan kernel versi 5.10 atau yang lebih baru, androidboot.bootreason=<reason>
ditambahkan ke bootconfig, bukan command line kernel.
Spesifikasi alasan booting
Rilis Android sebelumnya menentukan format alasan booting yang tidak menggunakan
spasi, semuanya huruf kecil, mencakup beberapa persyaratan (seperti untuk pelaporan
kernel_panic
, watchdog
,
cold
/warm
/hard
), dan yang memberikan
kelonggaran untuk alasan unik lainnya. Spesifikasi yang tidak ketat ini menyebabkan
munculnya ratusan string alasan booting kustom (dan terkadang tidak bermakna), yang pada gilirannya menyebabkan situasi yang tidak dapat dikelola. Mulai rilis Android saat ini, momentum besar konten yang hampir tidak dapat diuraikan atau tidak bermakna yang dicatat oleh bootloader telah menimbulkan masalah kepatuhan untuk bootloader_boot_reason_prop
.
Dengan rilis Android 9, tim Android menyadari bahwa bootloader_boot_reason_prop
lama memiliki momentum yang besar dan tidak dapat ditulis ulang saat runtime. Oleh karena itu, setiap peningkatan pada spesifikasi alasan booting harus berasal dari interaksi dengan developer bootloader dan penyesuaian pada sistem yang ada. Untuk itu, tim Android:
- Berinteraksi dengan developer bootloader untuk mendorong mereka:
- Berikan alasan kanonis, yang dapat diuraikan, dan dapat dikenali untuk
bootloader_boot_reason_prop
. - Berpartisipasi dalam daftar
system/core/bootstat/bootstat.cpp
kBootReasonMap
.
- Berikan alasan kanonis, yang dapat diuraikan, dan dapat dikenali untuk
- Menambahkan sumber yang dapat ditulis ulang saat runtime dan dikontrol untuk
system_boot_reason_prop
(sys.boot.reason
). Sejumlah aplikasi sistem terbatas (sepertibootstat
daninit
) dapat menulis ulang properti ini, tetapi semua aplikasi dapat diberi hak sepolicy untuk membacanya. - Memberi tahu pengguna tentang alasan booting untuk menunggu hingga userdata dipasang
sebelum memercayai konten dalam properti alasan booting sistem
system_boot_reason_prop
.
Mengapa terlambat? Meskipun bootloader_boot_reason_prop
tersedia lebih awal
saat booting, bootloader_boot_reason_prop
diblokir oleh kebijakan keamanan Android sesuai kebutuhan
karena menampilkan informasi yang tidak akurat, tidak dapat diuraikan, dan non-kanonis.
Dalam sebagian besar situasi, hanya developer dengan pengetahuan mendalam tentang sistem booting
yang perlu mengakses informasi ini. API yang disempurnakan, dapat diuraikan, dan kanonis
untuk alasan booting dengan system_boot_reason_prop
dapat diambil secara andal
dan akurat hanya setelah data pengguna terpasang.
Khususnya:
- Sebelum data pengguna dimuat,
system_boot_reason_prop
akan berisi nilai daribootloader_boot_reason_prop
. - Setelah data pengguna terpasang,
system_boot_reason_prop
dapat diperbarui agar sesuai atau untuk melaporkan informasi yang lebih akurat.
Oleh karena itu, Android 9 memperpanjang jangka waktu sebelum alasan booting dapat diperoleh secara resmi, mengubahnya dari yang langsung akurat saat booting (dengan bootloader_boot_reason_prop
) menjadi hanya tersedia setelah userdata terpasang (dengan system_boot_reason_prop
).
Logika Bootstat bergantung pada bootloader_boot_reason_prop
yang lebih informatif dan sesuai. Jika properti tersebut menggunakan
format yang dapat diprediksi, akurasi semua skenario reboot dan
penonaktifan yang dikontrol akan meningkat, yang pada gilirannya akan meningkatkan dan memperluas akurasi serta makna
system_boot_reason_prop
.
Format alasan booting kanonis
Format alasan booting kanonis untuk bootloader_boot_reason_prop
di Android 9 menggunakan sintaksis berikut:
<reason>,<subreason>,<detail>…
Aturan pemformatan:
- Huruf kecil
- Tidak ada spasi (gunakan garis bawah)
- Semua karakter yang dapat dicetak
reason
,subreason
, dan satu atau lebih instancedetail
yang dipisahkan koma.reason
yang diperlukan yang menunjukkan prioritas tertinggi alasan perangkat harus di-reboot atau dimatikan.subreason
opsional yang merepresentasikan ringkasan singkat tentang alasan perangkat harus di-reboot atau dimatikan (atau siapa yang me-reboot atau mematikan perangkat).- Satu atau beberapa nilai
detail
opsional.detail
dapat mengarah ke subsistem untuk membantu menentukan sistem spesifik mana yang menghasilkansubreason
. Anda dapat menentukan beberapa nilaidetail
, yang umumnya harus mengikuti hierarki kepentingan. Namun, Anda juga dapat melaporkan beberapa nilaidetail
yang sama pentingnya.
Nilai kosong untuk bootloader_boot_reason_prop
dianggap
ilegal (karena memungkinkan agen lain menyisipkan alasan booting setelahnya).
Persyaratan alasan
Nilai yang diberikan untuk reason
(rentang pertama, sebelum penghentian atau
koma) harus berupa set berikut yang dibagi menjadi alasan kernel, kuat, dan tidak jelas:
- kernel set:
- "
watchdog"
"kernel_panic"
- "
- strong set:
"recovery"
"bootloader"
- kumpulan tumpul:
"cold"
. Umumnya menunjukkan reset penuh semua perangkat, termasuk memori."hard"
. Umumnya menunjukkan bahwa hardware telah direset statusnya danramoops
harus mempertahankan konten persisten."warm"
. Umumnya menunjukkan bahwa memori dan perangkat mempertahankan beberapa status, dan penyimpanan pendukungramoops
(lihat driverpstore
di kernel) berisi konten persisten."shutdown"
"reboot"
. Umumnya berarti statusramoops
tidak diketahui dan status hardware tidak diketahui. Nilai ini adalah nilai umum karena nilaicold
,hard
, danwarm
memberikan petunjuk tentang kedalaman reset untuk perangkat.
Bootloader harus menyediakan set kernel atau set tumpul reason
, dan
sangat disarankan untuk menyediakan subreason
jika dapat
ditentukan. Misalnya, penekanan lama tombol daya yang mungkin atau mungkin tidak memiliki
cadangan ramoops
akan memiliki alasan booting
"reboot,longkey"
.
Tidak ada reason
rentang pertama yang dapat menjadi bagian dari subreason
atau
detail
. Namun, karena alasan set kernel tidak dapat dihasilkan oleh
ruang pengguna, "watchdog"
dapat digunakan kembali setelah alasan set tumpul,
bersama dengan detail sumber (misalnya,
"reboot,watchdog,service_manager_unresponsive"
, atau
"reboot,software,watchdog"
).
Alasan booting tidak boleh memerlukan pengetahuan internal ahli untuk diuraikan dan/atau
harus dapat dibaca oleh manusia dengan laporan yang intuitif. Contoh:
"shutdown,vbxd"
(buruk), "shutdown,uv"
(lebih baik),
"shutdown,undervoltage"
(lebih disarankan).
Kombinasi alasan-subalasan
Android mencadangkan serangkaian kombinasi reason
-subreason
yang tidak boleh kelebihan beban dalam penggunaan normal, tetapi dapat digunakan berdasarkan
kasus per kasus jika kombinasi tersebut secara akurat mencerminkan kondisi
terkait. Contoh kombinasi yang dicadangkan meliputi:
"reboot,userrequested"
"shutdown,userrequested"
"shutdown,thermal"
(darithermald
)"shutdown,battery"
"shutdown,battery,thermal"
(dariBatteryStatsService
)"reboot,adb"
"reboot,shell"
"reboot,bootloader"
"reboot,recovery"
Untuk mengetahui detail selengkapnya, lihat kBootReasonMap
di
system/core/bootstat/bootstat.cpp
dan histori log perubahan git terkait di repositori sumber Android.
Melaporkan alasan booting
Semua alasan booting, baik dari bootloader atau yang dicatat dalam alasan booting kanonis, harus dicatat di bagian kBootReasonMap
dari system/core/bootstat/bootstat.cpp
. Daftar
kBootReasonMap
adalah campuran alasan patuh dan tidak patuh
lama. Developer bootloader hanya boleh mendaftarkan alasan kepatuhan baru di sini (dan tidak boleh mendaftarkan alasan ketidakpatuhan kecuali jika produk telah dikirim dan tidak dapat diubah).
Sebaiknya gunakan entri yang ada dan sesuai di
system/core/bootstat/bootstat.cpp
dan tunjukkan kehati-hatian sebelum
menggunakan string yang tidak sesuai. Sebagai panduan, berikut adalah:
- OK untuk melaporkan
"kernel_panic"
dari bootloader, karenabootstat
mungkin dapat memeriksaramoops
untukkernel_panic signatures
guna menyempurnakan sub-alasan menjadisystem_boot_reason_prop
kanonis. - Tidak Boleh melaporkan string yang tidak mematuhi kebijakan di
kBootReasonMap
(seperti"panic")
dari bootloader, karena pada akhirnya akan merusak kemampuan untuk menyempurnakanreason
.
Misalnya, jika kBootReasonMap
berisi "wdog_bark"
,
developer bootloader harus:
- Ubah ke
"watchdog,bark"
dan tambahkan ke daftar dikBootReasonMap
. - Pertimbangkan arti
"bark"
bagi orang yang belum memahami teknologi tersebut dan tentukan apakahsubreason
yang lebih bermakna tersedia.
Memverifikasi kepatuhan alasan booting
Saat ini, Android tidak menyediakan pengujian CTS aktif yang dapat secara akurat memicu atau memeriksa semua kemungkinan alasan booting yang dapat diberikan bootloader; partner masih dapat mencoba menjalankan pengujian pasif untuk menentukan kompatibilitas.
Oleh karena itu, kepatuhan bootloader mengharuskan developer bootloader untuk
secara sukarela mematuhi semangat aturan dan panduan yang dijelaskan di atas.
Kami mendesak developer tersebut untuk berkontribusi pada AOSP (khususnya pada
system/core/bootstat/bootstat.cpp
) dan menggunakan kesempatan ini sebagai
forum untuk diskusi tentang masalah alasan booting.