Merge "Do not report boot timings on first boot or runtime restart"
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index fb8a815..d879919 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -35,13 +35,15 @@
private final Context mContext;
private boolean mSafeMode;
+ private boolean mRuntimeRestarted;
+ private boolean mFirstBoot;
// Services that should receive lifecycle events.
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
private int mCurrentPhase = -1;
- public SystemServiceManager(Context context) {
+ SystemServiceManager(Context context) {
mContext = context;
}
@@ -235,7 +237,7 @@
}
/** Sets the safe mode flag for services to query. */
- public void setSafeMode(boolean safeMode) {
+ void setSafeMode(boolean safeMode) {
mSafeMode = safeMode;
}
@@ -248,6 +250,28 @@
}
/**
+ * @return true if runtime was restarted, false if it's normal boot
+ */
+ public boolean isRuntimeRestarted() {
+ return mRuntimeRestarted;
+ }
+
+ void setRuntimeRestarted(boolean runtimeRestarted) {
+ mRuntimeRestarted = runtimeRestarted;
+ }
+
+ /**
+ * @return true if it's first boot after OTA
+ */
+ public boolean isFirstBoot() {
+ return mFirstBoot;
+ }
+
+ void setFirstBoot(boolean firstBoot) {
+ mFirstBoot = firstBoot;
+ }
+
+ /**
* Outputs the state of this manager to the System log.
*/
public void dump() {
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 45e06b0..71ebad9 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -255,10 +255,11 @@
// storage is already unlocked.
if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) {
mInjector.getUserManagerInternal().setUserState(userId, uss.state);
-
- int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
- MetricsLogger.histogram(mInjector.getContext(), "framework_locked_boot_completed",
- uptimeSeconds);
+ if (!mInjector.isRuntimeRestarted() && !mInjector.isFirstBoot()) {
+ int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
+ MetricsLogger.histogram(mInjector.getContext(),
+ "framework_locked_boot_completed", uptimeSeconds);
+ }
mHandler.sendMessage(mHandler.obtainMessage(REPORT_LOCKED_BOOT_COMPLETE_MSG,
userId, 0));
@@ -429,9 +430,11 @@
}
Slog.d(TAG, "Sending BOOT_COMPLETE user #" + userId);
- int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
- MetricsLogger.histogram(mInjector.getContext(), "framework_boot_completed",
- uptimeSeconds);
+ if (!mInjector.isRuntimeRestarted() && !mInjector.isFirstBoot()) {
+ int uptimeSeconds = (int) (SystemClock.elapsedRealtime() / 1000);
+ MetricsLogger.histogram(mInjector.getContext(), "framework_boot_completed",
+ uptimeSeconds);
+ }
final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
@@ -1696,6 +1699,14 @@
mService.mSystemServiceManager.stopUser(userId);
}
+ boolean isRuntimeRestarted() {
+ return mService.mSystemServiceManager.isRuntimeRestarted();
+ }
+
+ boolean isFirstBoot() {
+ return mService.mSystemServiceManager.isFirstBoot();
+ }
+
void sendPreBootBroadcast(int userId, boolean quiet, final Runnable onFinish) {
new PreBootBroadcaster(mService, userId, null, quiet) {
@Override
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 283de42..68cb0c5 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -278,7 +278,7 @@
Slog.i(TAG, "Entered the Android system server!");
int uptimeMillis = (int) SystemClock.elapsedRealtime();
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, uptimeMillis);
- if (!mRuntimeRestart) {
+ if (!mRuntimeRestart && !mFirstBoot) {
MetricsLogger.histogram(null, "boot_system_server_init", uptimeMillis);
// Also report when first stage of init has started
long initStartNs = SystemProperties.getLong("ro.boottime.init", -1);
@@ -352,6 +352,8 @@
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
+ mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
+ mSystemServiceManager.setFirstBoot(mFirstBoot);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
@@ -378,7 +380,7 @@
if (StrictMode.conditionallyEnableDebugLogging()) {
Slog.i(TAG, "Enabled StrictMode for system server main thread.");
}
- if (!mRuntimeRestart) {
+ if (!mRuntimeRestart && !mFirstBoot) {
MetricsLogger.histogram(null, "boot_system_server_ready",
(int) SystemClock.elapsedRealtime());
}
@@ -520,7 +522,7 @@
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
traceEnd();
- if (!mRuntimeRestart) {
+ if (!mRuntimeRestart && !mFirstBoot) {
MetricsLogger.histogram(null, "boot_package_manager_init_ready",
(int) SystemClock.elapsedRealtime());
}