From ee016ce0b3cecde031c1d5463edcc1473b63bc39 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Thu, 23 May 2019 10:00:34 -0700 Subject: [PATCH] bootstat: enhance last reboot reason property with file backing Helps with support of recovery and rollback boot reason history, by also using /metadata/bootstat/persist.sys.boot.reason to file the reboot reason. Test: manual Bug: 129007837 Change-Id: Id1d21c404067414847bef14a0c43f70cafe1a3e2 --- bootstat/bootstat.cpp | 11 +++++++++-- init/reboot.cpp | 1 + libcutils/include/cutils/android_reboot.h | 1 + rootdir/init.rc | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp index 9ffe5dd34..a9c1676d9 100644 --- a/bootstat/bootstat.cpp +++ b/bootstat/bootstat.cpp @@ -870,6 +870,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_reboot_reason_file[] = LAST_REBOOT_REASON_FILE; const char last_last_reboot_reason_property[] = "sys.boot.reason.last"; constexpr size_t history_reboot_reason_size = 4; const char history_reboot_reason_property[] = LAST_REBOOT_REASON_PROPERTY ".history"; @@ -1059,7 +1060,9 @@ std::string BootReasonStrToReason(const std::string& boot_reason) { if (isBluntRebootReason(ret)) { // Content buffer no longer will have console data. Beware if more // checks added below, that depend on parsing console content. - content = android::base::GetProperty(last_reboot_reason_property, ""); + if (!android::base::ReadFileToString(last_reboot_reason_file, &content)) { + content = android::base::GetProperty(last_reboot_reason_property, ""); + } transformReason(content); // Anything in last is better than 'super-blunt' reboot or shutdown. @@ -1233,7 +1236,10 @@ void SetSystemBootReason() { // Record the scrubbed system_boot_reason to the property BootReasonAddToHistory(system_boot_reason); // Shift last_reboot_reason_property to last_last_reboot_reason_property - auto last_boot_reason = android::base::GetProperty(last_reboot_reason_property, ""); + std::string last_boot_reason; + if (!android::base::ReadFileToString(last_reboot_reason_file, &last_boot_reason)) { + last_boot_reason = android::base::GetProperty(last_reboot_reason_property, ""); + } if (last_boot_reason.empty() || isKernelRebootReason(system_boot_reason)) { last_boot_reason = system_boot_reason; } else { @@ -1241,6 +1247,7 @@ void SetSystemBootReason() { } android::base::SetProperty(last_last_reboot_reason_property, last_boot_reason); android::base::SetProperty(last_reboot_reason_property, ""); + unlink(last_reboot_reason_file); } // Gets the boot time offset. This is useful when Android is running in a diff --git a/init/reboot.cpp b/init/reboot.cpp index 38e822711..97d40b749 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -548,6 +548,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str skip = strlen("reboot,"); } SetProperty(LAST_REBOOT_REASON_PROPERTY, reason.c_str() + skip); + WriteStringToFile(reason.c_str() + skip, LAST_REBOOT_REASON_FILE); sync(); bool is_thermal_shutdown = cmd == ANDROID_RB_THERMOFF; diff --git a/libcutils/include/cutils/android_reboot.h b/libcutils/include/cutils/android_reboot.h index cd27eef88..24e32d560 100644 --- a/libcutils/include/cutils/android_reboot.h +++ b/libcutils/include/cutils/android_reboot.h @@ -31,6 +31,7 @@ __BEGIN_DECLS /* Android reboot reason stored in this property */ #define LAST_REBOOT_REASON_PROPERTY "persist.sys.boot.reason" +#define LAST_REBOOT_REASON_FILE "/metadata/bootstat/" LAST_REBOOT_REASON_PROPERTY /* Reboot or shutdown the system. * This call uses ANDROID_RB_PROPERTY to request reboot to init process. diff --git a/rootdir/init.rc b/rootdir/init.rc index 782f96701..77860f625 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -496,6 +496,7 @@ on post-fs mkdir /metadata/vold chmod 0700 /metadata/vold mkdir /metadata/password_slots 0771 root system + mkdir /metadata/bootstat 0750 system log mkdir /metadata/ota 0700 root system mkdir /metadata/ota/snapshots 0700 root system