On Android, the browser process can be killed anytime by the system.
For stability purposes, we count a crash when the browser process dies when the app is in the foreground. We call MetricsService::OnAppEnterForeground (which sets kStabilityExitedCleanly to false) and OnAppEnterBackground (which sets it to true).
If the process dies (for any reason) after OnAppEnterBackground has been called, it is not counted as a crash.
The browser process can also be started while the app is in the background (to service a sync or bookmark widget request), we do not want to modify the kStabilityExitedCleanly in this case, because we won't get a chance to mark clean shutdown.
BUG=179143
Review URL: https://chromiumcodereview.appspot.com/12326114
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@185611 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc
index fc1bded..d452d95 100644
--- a/chrome/browser/metrics/metrics_service.cc
+++ b/chrome/browser/metrics/metrics_service.cc
@@ -370,6 +370,13 @@
return codes;
}
+void MarkAppCleanShutdownAndCommit() {
+ PrefService* pref = g_browser_process->local_state();
+ pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
+ // Start writing right away (write happens on a different thread).
+ pref->CommitPendingWrite();
+}
+
} // namespace
// static
@@ -806,8 +813,7 @@
void MetricsService::OnAppEnterBackground() {
scheduler_->Stop();
- PrefService* pref = g_browser_process->local_state();
- pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
+ MarkAppCleanShutdownAndCommit();
// At this point, there's no way of knowing when the process will be
// killed, so this has to be treated similar to a shutdown, closing and
@@ -820,9 +826,6 @@
// process is killed.
OpenNewLog();
}
-
- // Start writing right away (write happens on a different thread).
- pref->CommitPendingWrite();
}
void MetricsService::OnAppEnterForeground() {
@@ -831,7 +834,14 @@
StartSchedulerIfNecessary();
}
-#endif
+#else
+void MetricsService::LogNeedForCleanShutdown() {
+ PrefService* pref = g_browser_process->local_state();
+ pref->SetBoolean(prefs::kStabilityExitedCleanly, false);
+ // Redundant setting to be sure we call for a clean shutdown.
+ clean_shutdown_status_ = NEED_TO_SHUTDOWN;
+}
+#endif // defined(OS_ANDROID) || defined(OS_IOS)
void MetricsService::RecordBreakpadRegistration(bool success) {
if (!success)
@@ -1715,13 +1725,6 @@
IncrementPrefValue(prefs::kStabilityRendererHangCount);
}
-void MetricsService::LogNeedForCleanShutdown() {
- PrefService* pref = g_browser_process->local_state();
- pref->SetBoolean(prefs::kStabilityExitedCleanly, false);
- // Redundant setting to be sure we call for a clean shutdown.
- clean_shutdown_status_ = NEED_TO_SHUTDOWN;
-}
-
bool MetricsService::UmaMetricsProperlyShutdown() {
CHECK(clean_shutdown_status_ == CLEANLY_SHUTDOWN ||
clean_shutdown_status_ == NEED_TO_SHUTDOWN);
@@ -1730,9 +1733,8 @@
void MetricsService::LogCleanShutdown() {
// Redundant hack to write pref ASAP.
- PrefService* pref = g_browser_process->local_state();
- pref->SetBoolean(prefs::kStabilityExitedCleanly, true);
- pref->CommitPendingWrite();
+ MarkAppCleanShutdownAndCommit();
+
// Redundant setting to assure that we always reset this value at shutdown
// (and that we don't use some alternate path, and not call LogCleanShutdown).
clean_shutdown_status_ = CLEANLY_SHUTDOWN;