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());
         }