Loading bootstat/boot_reason_test.sh +44 −36 Original line number Diff line number Diff line Loading @@ -480,23 +480,25 @@ properties test - (wait until screen is up, boot has completed) - adb shell getprop ro.boot.bootreason (bootloader reason) - adb shell getprop persist.sys.boot.reason (last reason) - adb shell getprop sys.boot.reason.last (last last reason) - adb shell getprop sys.boot.reason (system reason) - NB: all should have a value that is compliant with our known set." ] test_properties() { duration_test 1 wait_for_screen retval=0 check_set="ro.boot.bootreason persist.sys.boot.reason sys.boot.reason" check_set="ro.boot.bootreason sys.boot.reason.last sys.boot.reason" bootloader="" # NB: this test could fail if performed _after_ optional_factory_reset test # and will report # ERROR: expected "reboot" got "" # for Android property persist.sys.boot.reason # for Android property sys.boot.reason.last # following is mitigation for the persist.sys.boot.reason, skip it if [ "reboot,factory_reset" = "`validate_property ro.boot_bootreason`" ]; then check_set="ro.boot.bootreason sys.boot.reason" bootloader="bootloader" fi EXPECT_PROPERTY persist.sys.boot.reason "" for prop in ${check_set}; do reason=`validate_property ${prop}` EXPECT_PROPERTY ${prop} ${reason} || retval=${?} Loading Loading @@ -554,7 +556,8 @@ test_ota() { popd >&2 wait_for_screen EXPECT_PROPERTY sys.boot.reason "\(reboot,ota\|bootloader\)" EXPECT_PROPERTY persist.sys.boot.reason bootloader EXPECT_PROPERTY sys.boot.reason.last bootloader EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,ota bootloader } Loading @@ -568,7 +571,8 @@ test_optional_ota() { adb reboot ota wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,ota EXPECT_PROPERTY persist.sys.boot.reason reboot,ota EXPECT_PROPERTY sys.boot.reason.last reboot,ota EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,ota } Loading @@ -593,9 +597,15 @@ blind_reboot_test() { wait_for_screen bootloader_reason=`validate_property ro.boot.bootreason` EXPECT_PROPERTY ro.boot.bootreason ${bootloader_reason} EXPECT_PROPERTY sys.boot.reason ${reason} EXPECT_PROPERTY persist.sys.boot.reason ${reason} report_bootstat_logs ${reason} # to make sys.boot.reason report user friendly reasons=${reason} if [ "${bootloader_reason}" != "${reason}" -a -n "${bootloader_reason}" ]; then reasons="\(${reason}\|${bootloader_reason}\)" fi EXPECT_PROPERTY sys.boot.reason ${reasons} EXPECT_PROPERTY sys.boot.reason.last ${reason} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs ${reason} ${bootloader_reason} } [ "USAGE: test_cold Loading Loading @@ -627,7 +637,8 @@ test_factory_reset() { adb reboot >&2 wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,factory_reset EXPECT_PROPERTY persist.sys.boot.reason "reboot,.*" EXPECT_PROPERTY sys.boot.reason.last "reboot,.*" EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,factory_reset reboot, reboot,adb \ "-bootstat: Failed to read /data/misc/bootstat/build_date: No such file or directory" \ "-bootstat: Failed to parse boot time record: /data/misc/bootstat/build_date" Loading Loading @@ -658,6 +669,7 @@ test_optional_factory_reset() { wait_for_screen ( exit ${save_ret} ) # because one can not just do ?=${save_ret} EXPECT_PROPERTY sys.boot.reason reboot,factory_reset EXPECT_PROPERTY sys.boot.reason.last "" EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,factory_reset bootloader \ "-bootstat: Failed to read /data/misc/bootstat/last_boot_time_utc: No such file or directory" \ Loading Loading @@ -731,7 +743,8 @@ test_battery() { ) EXPECT_PROPERTY sys.boot.reason shutdown,battery EXPECT_PROPERTY persist.sys.boot.reason cold EXPECT_PROPERTY sys.boot.reason.last cold EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,battery "-bootstat: Battery level at shutdown 2%" exitPstore } Loading @@ -752,7 +765,8 @@ test_optional_battery() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,battery EXPECT_PROPERTY persist.sys.boot.reason shutdown,battery EXPECT_PROPERTY sys.boot.reason.last shutdown,battery EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,battery } Loading @@ -772,7 +786,8 @@ test_optional_battery_thermal() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,thermal,battery EXPECT_PROPERTY persist.sys.boot.reason shutdown,thermal,battery EXPECT_PROPERTY sys.boot.reason.last shutdown,thermal,battery EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,thermal,battery } Loading Loading @@ -808,7 +823,8 @@ test_kernel_panic() { echo c | adb shell su root tee /proc/sysrq-trigger >/dev/null wait_for_screen EXPECT_PROPERTY sys.boot.reason ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason ${panic_msg} EXPECT_PROPERTY sys.boot.reason.last ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs kernel_panic,sysrq exitPstore } Loading @@ -835,7 +851,8 @@ test_kernel_panic_subreason() { echo c | adb shell su root tee /proc/sysrq-trigger >/dev/null wait_for_screen EXPECT_PROPERTY sys.boot.reason ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason ${panic_msg} EXPECT_PROPERTY sys.boot.reason.last ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs kernel_panic,sysrq,test \ "-bootstat: Unknown boot reason: kernel_panic,sysrq,test" exitPstore Loading Loading @@ -865,7 +882,8 @@ test_kernel_panic_hung() { adb reboot warm wait_for_screen EXPECT_PROPERTY sys.boot.reason ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason ${panic_msg} EXPECT_PROPERTY sys.boot.reason.last ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs kernel_panic,hung exitPstore } Loading Loading @@ -897,7 +915,8 @@ test_thermal_shutdown() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,thermal EXPECT_PROPERTY persist.sys.boot.reason shutdown,thermal EXPECT_PROPERTY sys.boot.reason.last shutdown,thermal EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,thermal } Loading @@ -917,7 +936,8 @@ test_userrequested_shutdown() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,userrequested EXPECT_PROPERTY persist.sys.boot.reason shutdown,userrequested EXPECT_PROPERTY sys.boot.reason.last shutdown,userrequested EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,userrequested } Loading @@ -933,7 +953,8 @@ test_shell_reboot() { adb shell reboot wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,shell EXPECT_PROPERTY persist.sys.boot.reason reboot,shell EXPECT_PROPERTY sys.boot.reason.last reboot,shell EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,shell } Loading @@ -949,7 +970,8 @@ test_adb_reboot() { adb reboot wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,adb EXPECT_PROPERTY persist.sys.boot.reason reboot,adb EXPECT_PROPERTY sys.boot.reason.last reboot,adb EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,adb } Loading Loading @@ -984,23 +1006,8 @@ test_Its_Just_So_Hard_reboot() { adb shell 'reboot "Its Just So Hard"' wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,its_just_so_hard EXPECT_PROPERTY persist.sys.boot.reason "reboot,Its Just So Hard" # Do not leave this test with an illegal value in persist.sys.boot.reason save_ret=${?} # hold on to error code from above two lines if isDebuggable; then # can do this easy, or we can do this hard. adb shell su root setprop persist.sys.boot.reason reboot,its_just_so_hard ( exit ${save_ret} ) # because one can not just do ?=${save_ret} else report_bootstat_logs reboot,its_just_so_hard # report what we have so far # user build mitigation adb shell reboot its_just_so_hard wait_for_screen ( exit ${save_ret} ) # because one can not just do ?=${save_ret} EXPECT_PROPERTY sys.boot.reason reboot,its_just_so_hard fi # Ensure persist.sys.boot.reason now valid, failure here acts as a signal # that we could choke up following tests. For example test_properties. EXPECT_PROPERTY persist.sys.boot.reason reboot,its_just_so_hard ${flag} EXPECT_PROPERTY sys.boot.reason.last reboot,its_just_so_hard EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,its_just_so_hard } Loading Loading @@ -1049,7 +1056,8 @@ run_bootloader() { # Check values EXPECT_PROPERTY ro.boot.bootreason "${bootloader_expected}" EXPECT_PROPERTY sys.boot.reason "${sys_expected}" EXPECT_PROPERTY persist.sys.boot.reason "${last_expected}" EXPECT_PROPERTY sys.boot.reason.last "${last_expected}" EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs "${sys_expected}" } Loading bootstat/bootstat.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -735,6 +735,7 @@ bool addKernelPanicSubReason(const std::string& content, std::string& ret) { const char system_reboot_reason_property[] = "sys.boot.reason"; const char last_reboot_reason_property[] = LAST_REBOOT_REASON_PROPERTY; const char last_last_reboot_reason_property[] = "sys.boot.reason.last"; const char bootloader_reboot_reason_property[] = "ro.boot.bootreason"; // Scrub, Sanitize, Standardize and Enhance the boot reason string supplied. Loading Loading @@ -985,10 +986,6 @@ std::string BootReasonStrToReason(const std::string& boot_reason) { } LOG(INFO) << "Canonical boot reason: " << ret; if (isKernelRebootReason(ret) && (GetProperty(last_reboot_reason_property) != "")) { // Rewrite as it must be old news, kernel reasons trump user space. SetProperty(last_reboot_reason_property, ret); } return ret; } Loading Loading @@ -1118,6 +1115,15 @@ void SetSystemBootReason() { const std::string system_boot_reason(BootReasonStrToReason(bootloader_boot_reason)); // Record the scrubbed system_boot_reason to the property SetProperty(system_reboot_reason_property, system_boot_reason); // Shift last_reboot_reason_property to last_last_reboot_reason_property std::string last_boot_reason(GetProperty(last_reboot_reason_property)); if (last_boot_reason.empty() || isKernelRebootReason(system_boot_reason)) { last_boot_reason = system_boot_reason; } else { transformReason(last_boot_reason); } SetProperty(last_last_reboot_reason_property, last_boot_reason); SetProperty(last_reboot_reason_property, ""); } // Records several metrics related to the time it takes to boot the device, Loading Loading
bootstat/boot_reason_test.sh +44 −36 Original line number Diff line number Diff line Loading @@ -480,23 +480,25 @@ properties test - (wait until screen is up, boot has completed) - adb shell getprop ro.boot.bootreason (bootloader reason) - adb shell getprop persist.sys.boot.reason (last reason) - adb shell getprop sys.boot.reason.last (last last reason) - adb shell getprop sys.boot.reason (system reason) - NB: all should have a value that is compliant with our known set." ] test_properties() { duration_test 1 wait_for_screen retval=0 check_set="ro.boot.bootreason persist.sys.boot.reason sys.boot.reason" check_set="ro.boot.bootreason sys.boot.reason.last sys.boot.reason" bootloader="" # NB: this test could fail if performed _after_ optional_factory_reset test # and will report # ERROR: expected "reboot" got "" # for Android property persist.sys.boot.reason # for Android property sys.boot.reason.last # following is mitigation for the persist.sys.boot.reason, skip it if [ "reboot,factory_reset" = "`validate_property ro.boot_bootreason`" ]; then check_set="ro.boot.bootreason sys.boot.reason" bootloader="bootloader" fi EXPECT_PROPERTY persist.sys.boot.reason "" for prop in ${check_set}; do reason=`validate_property ${prop}` EXPECT_PROPERTY ${prop} ${reason} || retval=${?} Loading Loading @@ -554,7 +556,8 @@ test_ota() { popd >&2 wait_for_screen EXPECT_PROPERTY sys.boot.reason "\(reboot,ota\|bootloader\)" EXPECT_PROPERTY persist.sys.boot.reason bootloader EXPECT_PROPERTY sys.boot.reason.last bootloader EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,ota bootloader } Loading @@ -568,7 +571,8 @@ test_optional_ota() { adb reboot ota wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,ota EXPECT_PROPERTY persist.sys.boot.reason reboot,ota EXPECT_PROPERTY sys.boot.reason.last reboot,ota EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,ota } Loading @@ -593,9 +597,15 @@ blind_reboot_test() { wait_for_screen bootloader_reason=`validate_property ro.boot.bootreason` EXPECT_PROPERTY ro.boot.bootreason ${bootloader_reason} EXPECT_PROPERTY sys.boot.reason ${reason} EXPECT_PROPERTY persist.sys.boot.reason ${reason} report_bootstat_logs ${reason} # to make sys.boot.reason report user friendly reasons=${reason} if [ "${bootloader_reason}" != "${reason}" -a -n "${bootloader_reason}" ]; then reasons="\(${reason}\|${bootloader_reason}\)" fi EXPECT_PROPERTY sys.boot.reason ${reasons} EXPECT_PROPERTY sys.boot.reason.last ${reason} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs ${reason} ${bootloader_reason} } [ "USAGE: test_cold Loading Loading @@ -627,7 +637,8 @@ test_factory_reset() { adb reboot >&2 wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,factory_reset EXPECT_PROPERTY persist.sys.boot.reason "reboot,.*" EXPECT_PROPERTY sys.boot.reason.last "reboot,.*" EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,factory_reset reboot, reboot,adb \ "-bootstat: Failed to read /data/misc/bootstat/build_date: No such file or directory" \ "-bootstat: Failed to parse boot time record: /data/misc/bootstat/build_date" Loading Loading @@ -658,6 +669,7 @@ test_optional_factory_reset() { wait_for_screen ( exit ${save_ret} ) # because one can not just do ?=${save_ret} EXPECT_PROPERTY sys.boot.reason reboot,factory_reset EXPECT_PROPERTY sys.boot.reason.last "" EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,factory_reset bootloader \ "-bootstat: Failed to read /data/misc/bootstat/last_boot_time_utc: No such file or directory" \ Loading Loading @@ -731,7 +743,8 @@ test_battery() { ) EXPECT_PROPERTY sys.boot.reason shutdown,battery EXPECT_PROPERTY persist.sys.boot.reason cold EXPECT_PROPERTY sys.boot.reason.last cold EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,battery "-bootstat: Battery level at shutdown 2%" exitPstore } Loading @@ -752,7 +765,8 @@ test_optional_battery() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,battery EXPECT_PROPERTY persist.sys.boot.reason shutdown,battery EXPECT_PROPERTY sys.boot.reason.last shutdown,battery EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,battery } Loading @@ -772,7 +786,8 @@ test_optional_battery_thermal() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,thermal,battery EXPECT_PROPERTY persist.sys.boot.reason shutdown,thermal,battery EXPECT_PROPERTY sys.boot.reason.last shutdown,thermal,battery EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,thermal,battery } Loading Loading @@ -808,7 +823,8 @@ test_kernel_panic() { echo c | adb shell su root tee /proc/sysrq-trigger >/dev/null wait_for_screen EXPECT_PROPERTY sys.boot.reason ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason ${panic_msg} EXPECT_PROPERTY sys.boot.reason.last ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs kernel_panic,sysrq exitPstore } Loading @@ -835,7 +851,8 @@ test_kernel_panic_subreason() { echo c | adb shell su root tee /proc/sysrq-trigger >/dev/null wait_for_screen EXPECT_PROPERTY sys.boot.reason ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason ${panic_msg} EXPECT_PROPERTY sys.boot.reason.last ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs kernel_panic,sysrq,test \ "-bootstat: Unknown boot reason: kernel_panic,sysrq,test" exitPstore Loading Loading @@ -865,7 +882,8 @@ test_kernel_panic_hung() { adb reboot warm wait_for_screen EXPECT_PROPERTY sys.boot.reason ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason ${panic_msg} EXPECT_PROPERTY sys.boot.reason.last ${panic_msg} EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs kernel_panic,hung exitPstore } Loading Loading @@ -897,7 +915,8 @@ test_thermal_shutdown() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,thermal EXPECT_PROPERTY persist.sys.boot.reason shutdown,thermal EXPECT_PROPERTY sys.boot.reason.last shutdown,thermal EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,thermal } Loading @@ -917,7 +936,8 @@ test_userrequested_shutdown() { echo -n "WARNING: Please power device back up, waiting ... " >&2 wait_for_screen -n >&2 EXPECT_PROPERTY sys.boot.reason shutdown,userrequested EXPECT_PROPERTY persist.sys.boot.reason shutdown,userrequested EXPECT_PROPERTY sys.boot.reason.last shutdown,userrequested EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs shutdown,userrequested } Loading @@ -933,7 +953,8 @@ test_shell_reboot() { adb shell reboot wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,shell EXPECT_PROPERTY persist.sys.boot.reason reboot,shell EXPECT_PROPERTY sys.boot.reason.last reboot,shell EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,shell } Loading @@ -949,7 +970,8 @@ test_adb_reboot() { adb reboot wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,adb EXPECT_PROPERTY persist.sys.boot.reason reboot,adb EXPECT_PROPERTY sys.boot.reason.last reboot,adb EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,adb } Loading Loading @@ -984,23 +1006,8 @@ test_Its_Just_So_Hard_reboot() { adb shell 'reboot "Its Just So Hard"' wait_for_screen EXPECT_PROPERTY sys.boot.reason reboot,its_just_so_hard EXPECT_PROPERTY persist.sys.boot.reason "reboot,Its Just So Hard" # Do not leave this test with an illegal value in persist.sys.boot.reason save_ret=${?} # hold on to error code from above two lines if isDebuggable; then # can do this easy, or we can do this hard. adb shell su root setprop persist.sys.boot.reason reboot,its_just_so_hard ( exit ${save_ret} ) # because one can not just do ?=${save_ret} else report_bootstat_logs reboot,its_just_so_hard # report what we have so far # user build mitigation adb shell reboot its_just_so_hard wait_for_screen ( exit ${save_ret} ) # because one can not just do ?=${save_ret} EXPECT_PROPERTY sys.boot.reason reboot,its_just_so_hard fi # Ensure persist.sys.boot.reason now valid, failure here acts as a signal # that we could choke up following tests. For example test_properties. EXPECT_PROPERTY persist.sys.boot.reason reboot,its_just_so_hard ${flag} EXPECT_PROPERTY sys.boot.reason.last reboot,its_just_so_hard EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs reboot,its_just_so_hard } Loading Loading @@ -1049,7 +1056,8 @@ run_bootloader() { # Check values EXPECT_PROPERTY ro.boot.bootreason "${bootloader_expected}" EXPECT_PROPERTY sys.boot.reason "${sys_expected}" EXPECT_PROPERTY persist.sys.boot.reason "${last_expected}" EXPECT_PROPERTY sys.boot.reason.last "${last_expected}" EXPECT_PROPERTY persist.sys.boot.reason "" report_bootstat_logs "${sys_expected}" } Loading
bootstat/bootstat.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -735,6 +735,7 @@ bool addKernelPanicSubReason(const std::string& content, std::string& ret) { const char system_reboot_reason_property[] = "sys.boot.reason"; const char last_reboot_reason_property[] = LAST_REBOOT_REASON_PROPERTY; const char last_last_reboot_reason_property[] = "sys.boot.reason.last"; const char bootloader_reboot_reason_property[] = "ro.boot.bootreason"; // Scrub, Sanitize, Standardize and Enhance the boot reason string supplied. Loading Loading @@ -985,10 +986,6 @@ std::string BootReasonStrToReason(const std::string& boot_reason) { } LOG(INFO) << "Canonical boot reason: " << ret; if (isKernelRebootReason(ret) && (GetProperty(last_reboot_reason_property) != "")) { // Rewrite as it must be old news, kernel reasons trump user space. SetProperty(last_reboot_reason_property, ret); } return ret; } Loading Loading @@ -1118,6 +1115,15 @@ void SetSystemBootReason() { const std::string system_boot_reason(BootReasonStrToReason(bootloader_boot_reason)); // Record the scrubbed system_boot_reason to the property SetProperty(system_reboot_reason_property, system_boot_reason); // Shift last_reboot_reason_property to last_last_reboot_reason_property std::string last_boot_reason(GetProperty(last_reboot_reason_property)); if (last_boot_reason.empty() || isKernelRebootReason(system_boot_reason)) { last_boot_reason = system_boot_reason; } else { transformReason(last_boot_reason); } SetProperty(last_last_reboot_reason_property, last_boot_reason); SetProperty(last_reboot_reason_property, ""); } // Records several metrics related to the time it takes to boot the device, Loading