يتضمّن نظام التشغيل Android 9 التغييرات التالية على مواصفات سبب تشغيل برنامج الإقلاع.
أسباب إعادة التشغيل
يستخدم برنامج التشغيل الأوّلي موارد فريدة من الأجهزة والذاكرة لتحديد سبب إعادة تشغيل الجهاز، ثم يرسل هذا التحديد من خلال إضافة androidboot.bootreason=<reason>
إلى سطر أوامر نواة Android عند تشغيلها. ثم يترجم init
سطر الأوامر هذا ليتم نشره في السمة bootloader_boot_reason_prop
لنظام التشغيل Android (ro.boot.bootreason
). بالنسبة إلى الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو إصدار أحدث، والتي تستخدم الإصدار 5.10 من النواة أو إصدارًا أحدث، تتم إضافة androidboot.bootreason=<reason>
إلى bootconfig بدلاً من سطر أوامر النواة.
مواصفات سبب التشغيل
حدّدت الإصدارات السابقة من Android تنسيقًا لسبب إعادة التشغيل لا يتضمّن مسافات، ويتألف من أحرف صغيرة فقط، ويتضمّن بعض المتطلبات (مثل إعداد التقارير عن kernel_panic
وwatchdog
وcold
/warm
/hard
)، كما أنّه يتيح أسبابًا فريدة أخرى. أدّى هذا التحديد غير الدقيق إلى انتشار مئات السلاسل المخصّصة (والتي لا معنى لها أحيانًا) لأسباب إعادة التشغيل، ما أدّى بدوره إلى حدوث وضع لا يمكن التحكّم فيه. في إصدار Android الحالي، أدّى الزخم الكبير للمحتوى الذي يصعب تحليله أو الذي لا معنى له والذي تم تسجيله بواسطة برنامج الإقلاع إلى حدوث مشاكل في الامتثال لمتطلبات bootloader_boot_reason_prop
.
مع إصدار Android 9، أدرك فريق Android أنّ bootloader_boot_reason_prop
القديمة حققت رواجًا كبيرًا ولا يمكن إعادة كتابتها في وقت التشغيل. لذلك، يجب أن تأتي أي تحسينات على مواصفات سبب إعادة التشغيل من التفاعل مع مطوّري برنامج الإقلاع وإجراء تعديلات على النظام الحالي. ولتحقيق ذلك، يعمل فريق Android على ما يلي:
- التواصل مع مطوّري برامج الإقلاع لتشجيعهم على:
- قدِّم أسبابًا أساسية وقابلة للتحليل والتمييز بشأن
bootloader_boot_reason_prop
. - المشاركة في قائمة
system/core/bootstat/bootstat.cpp
kBootReasonMap
- قدِّم أسبابًا أساسية وقابلة للتحليل والتمييز بشأن
- إضافة مصدر يمكن التحكّم فيه وإعادة كتابته في وقت التشغيل
system_boot_reason_prop
(sys.boot.reason
). يمكن لمجموعة محدودة من تطبيقات النظام (مثلbootstat
وinit
) إعادة كتابة هذه السمة، ولكن يمكن منح جميع التطبيقات أذونات sepolicy لقراءتها. - إبلاغ المستخدمين بسبب إعادة التشغيل لانتظار تحميل بيانات المستخدم
قبل الوثوق بالمحتوى في خاصية سبب إعادة تشغيل النظام
system_boot_reason_prop
لماذا تأخّرنا؟ مع أنّ bootloader_boot_reason_prop
يتوفّر في وقت مبكر
أثناء عملية التشغيل، تحظره سياسة أمان Android حسب الحاجة
لأنّه يمثّل معلومات غير دقيقة وغير قابلة للتحليل وغير أساسية.
في معظم الحالات، لا يحتاج إلى الوصول إلى هذه المعلومات سوى المطوّرين الذين لديهم معرفة تفصيلية بنظام التشغيل. تتوفّر واجهة برمجة تطبيقات محسّنة وقابلة للتحليل ومعيارية لسبب إعادة التشغيل مع system_boot_reason_prop
، ويمكن الحصول عليها بشكل موثوق ودقيق بعد تحميل بيانات المستخدم فقط.
وعلى وجه التحديد:
- قبل تحميل بيانات المستخدم، سيحتوي
system_boot_reason_prop
على القيمة منbootloader_boot_reason_prop
. - بعد تحميل بيانات المستخدم، يمكن تعديل
system_boot_reason_prop
ليكون متوافقًا أو لتقديم معلومات أكثر دقة.
لهذا السبب، يمدّد نظام التشغيل Android 9 الفترة الزمنية التي يمكن خلالها الحصول على سبب إعادة التشغيل بشكل رسمي، ويغيّرها من أن تكون دقيقة على الفور عند إعادة التشغيل (باستخدام bootloader_boot_reason_prop
) إلى أن تكون متاحة فقط بعد تحميل بيانات المستخدم (باستخدام system_boot_reason_prop
).
تعتمد منطق Bootstat على bootloader_boot_reason_prop
أكثر إفادة وتوافقًا. عندما تستخدم هذه السمة تنسيقًا يمكن توقّعه، فإنّها تحسّن دقة جميع سيناريوهات إعادة التشغيل والإيقاف التي يتم التحكّم فيها، ما يؤدي بدوره إلى تحسين وتوسيع دقة ومعنى system_boot_reason_prop
.
تنسيق سبب التشغيل الأساسي
يستخدم تنسيق سبب إعادة التشغيل الأساسي bootloader_boot_reason_prop
في Android 9 البنية التالية:
<reason>,<subreason>,<detail>…
قواعد التنسيق:
- الأحرف الصغيرة
- ما مِن مساحات فارغة (استخدِم خطًا سفليًا)
- جميع الأحرف القابلة للطباعة
reason
وsubreason
مفصولتَين بفواصل، وواحدة أو أكثر منdetail
.- تمثّل
reason
المطلوبة السبب الذي أدّى إلى إعادة تشغيل الجهاز أو إيقافه، وهي السبب الأعلى أولوية. - تمثّل
subreason
اختيارية ملخّصًا موجزًا لسبب إعادة تشغيل الجهاز أو إيقافه (أو الجهة التي أعادت تشغيل الجهاز أو أوقفته). - قيمة واحدة أو أكثر من قيم
detail
الاختيارية قد يشيرdetail
إلى نظام فرعي للمساعدة في تحديد النظام المحدّد الذي أدّى إلى ظهورsubreason
. يمكنك تحديد قيمdetail
متعددة، ويجب أن تتبع هذه القيم بشكل عام تسلسلاً هرميًا حسب الأهمية. مع ذلك، يمكن أيضًا الإبلاغ عن قيمdetail
متعدّدة لها الأهمية نفسها.
- تمثّل
تُعدّ القيمة الفارغة لـ bootloader_boot_reason_prop
غير صالحة (لأنّ ذلك يسمح لبرامج أخرى بإدخال سبب إعادة التشغيل بعد حدوثها).
متطلبات السبب
يجب أن تكون القيمة المحدّدة لـ reason
(المدى الأول، قبل الإنهاء أو الفاصلة) من المجموعة التالية المقسّمة إلى أسباب أساسية وقوية ومباشرة:
- kernel set:
- "
watchdog"
"kernel_panic"
- "
- مجموعة كلمات قوية:
"recovery"
"bootloader"
- blunt set:
"cold"
. يشير هذا الرمز بشكل عام إلى إعادة ضبط جميع الأجهزة بالكامل، بما في ذلك الذاكرة."hard"
. يشير هذا الرمز عادةً إلى أنّه تمت إعادة ضبط حالة الجهاز، ويجب أن يحتفظramoops
بالمحتوى الثابت."warm"
. يشير هذا الرمز بشكل عام إلى أنّ الذاكرة والأجهزة تحتفظ ببعض الحالة، وأنّ مخزن النسخ الاحتياطيةramoops
(راجِع برنامج التشغيلpstore
في النواة) يحتوي على محتوى ثابت."shutdown"
-
"reboot"
: يعني ذلك بشكل عام أنّ حالةramoops
غير معروفة وحالة الجهاز غير معروفة. هذه القيمة هي قيمة شاملة لأنّ القيمcold
وhard
وwarm
تقدّم إشارات إلى مدى عمق عملية إعادة الضبط للجهاز.
يجب أن توفّر برامج التشغيل أداة kernel أو أداة blunt reason
،
ويُنصح بشدة بتوفير subreason
إذا كان من الممكن تحديده. على سبيل المثال، قد يكون لعملية الضغط مع الاستمرار على مفتاح التشغيل نسخة احتياطية أو لا، وفي كلتا الحالتين سيتم تسجيل سبب إعادة التشغيل
"reboot,longkey"
.ramoops
لا يمكن أن يكون أي reason
ذي مدى أول جزءًا من أي subreason
أو detail
. ومع ذلك، بما أنّه لا يمكن أن تنشأ أسباب ضبط النواة من مساحة المستخدم، يمكن إعادة استخدام "watchdog"
بعد سبب ضبط غير دقيق، مع تفاصيل عن المصدر (على سبيل المثال، "reboot,watchdog,service_manager_unresponsive"
أو "reboot,software,watchdog"
).
يجب ألا تتطلّب أسباب إعادة التشغيل معرفة داخلية متخصّصة لفهمها و/أو يجب أن تكون قابلة للقراءة من قِبل المستخدمين مع توفير تقرير سهل الاستخدام. أمثلة:
"shutdown,vbxd"
(سيئ)، "shutdown,uv"
(أفضل)،
"shutdown,undervoltage"
(مفضّل).
مجموعات السبب والسبب الفرعي
يحتفظ نظام التشغيل Android بمجموعة من التركيبات reason
-subreason
التي يجب عدم الإفراط في استخدامها في الاستخدام العادي، ولكن يمكن استخدامها بشكل فردي إذا كان التركيب يعكس الحالة المرتبطة به بدقة. تشمل أمثلة التركيبات المحجوزة ما يلي:
"reboot,userrequested"
"shutdown,userrequested"
-
"shutdown,thermal"
(منthermald
) "shutdown,battery"
"shutdown,battery,thermal"
(منBatteryStatsService
)"reboot,adb"
"reboot,shell"
"reboot,bootloader"
"reboot,recovery"
لمزيد من التفاصيل، يُرجى الرجوع إلى kBootReasonMap
في
system/core/bootstat/bootstat.cpp
وسجلّ التغييرات المرتبط به في مستودع مصدر Android.
تسجيل أسباب إعادة التشغيل
يجب تسجيل جميع أسباب إعادة التشغيل، سواء من برنامج التحميل أو المسجّلة في سبب إعادة التشغيل الأساسي، في القسم kBootReasonMap
من system/core/bootstat/bootstat.cpp
. قائمة kBootReasonMap
هي مزيج من الأسباب المتوافقة وغير المتوافقة مع الإصدارات القديمة. على مطوّري برامج الإقلاع تسجيل الأسباب الجديدة المتوافقة فقط هنا (ويجب عدم تسجيل الأسباب غير المتوافقة إلا إذا تم شحن المنتج بالفعل ولا يمكن تغييره).
ننصحك بشدة باستخدام إدخالات حالية متوافقة في
system/core/bootstat/bootstat.cpp
والتحلّي بضبط النفس قبل
استخدام سلسلة غير متوافقة. كإرشادات، يجب أن يكون:
- حسنًا للإبلاغ عن
"kernel_panic"
من برنامج تحميل التشغيل، لأنّbootstat
قد يتمكّن من فحصramoops
بحثًا عنkernel_panic signatures
لتحسين الأسباب الفرعية إلىsystem_boot_reason_prop
الأساسي. - لا يُسمح بالإبلاغ عن سلسلة غير متوافقة في
kBootReasonMap
(مثل"panic")
من برنامج التحميل الأوّلي، لأنّ ذلك سيؤدي في النهاية إلى إيقاف إمكانية تحسينreason
).
على سبيل المثال، إذا كان kBootReasonMap
يتضمّن "wdog_bark"
،
على مطوّر برنامج التشغيل الأوّلي إجراء ما يلي:
- غيِّر إلى
"watchdog,bark"
وأضِف إلى القائمة فيkBootReasonMap
. - فكِّر في معنى
"bark"
بالنسبة إلى الأشخاص الذين لا يعرفون هذه التكنولوجيا، وحدِّد ما إذا كان هناكsubreason
أكثر دلالة متاح.
التحقّق من امتثال سبب إعادة التشغيل
في الوقت الحالي، لا يوفّر نظام التشغيل Android اختبارًا نشطًا لمجموعة اختبار التوافق (CTS) يمكنه تحديد جميع أسباب إعادة التشغيل المحتملة التي يمكن أن يوفّرها برنامج التشغيل أو فحصها بدقة، ولكن لا يزال بإمكان الشركاء محاولة إجراء اختبار غير مباشر لتحديد التوافق.
ونتيجةً لذلك، يتطلّب الامتثال لمتطلبات برنامج تحميل التشغيل أن يلتزم مطوّرو برنامج تحميل التشغيل طوعًا بمضمون القواعد والإرشادات الموضّحة أعلاه.
ونحثّ هؤلاء المطوّرين على المساهمة في مشروع AOSP (وتحديدًا في system/core/bootstat/bootstat.cpp
) والاستفادة من هذه الفرصة كمنتدى للمناقشات حول مشاكل سبب إعادة التشغيل.