From 1d87e40d4214a7f6d20a58d6f27cca174f0d974e Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Tue, 10 Jan 2017 18:34:10 -0800 Subject: [PATCH] Do not report boot timings on first boot or runtime restart During first boot after OTA, additional dexopting has to be done during PM initialization. Timings for OTA are reported separately, so we should ignore first boot to avoid skewing the metrics. The following metrics were updated: - boot_system_server_init - check added for consistency with other metrics in SystemServer. The metric is actually unaffected by first boot, because dexopt will start later - boot_package_manager_init_ready - boot_system_server_init - framework_locked_boot_completed - framework_boot_completed Test: manual + UserControllerTest pass Bug: 32807863 Change-Id: Iff13697b7d4f9ff8439e1e932d7e276f48cd5c37 --- .../android/server/SystemServiceManager.java | 28 +++++++++++++++++-- .../com/android/server/am/UserController.java | 25 ++++++++++++----- .../java/com/android/server/SystemServer.java | 8 ++++-- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index fb8a8154e13e4..d87991908211c 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -35,13 +35,15 @@ public class SystemServiceManager { private final Context mContext; private boolean mSafeMode; + private boolean mRuntimeRestarted; + private boolean mFirstBoot; // Services that should receive lifecycle events. private final ArrayList mServices = new ArrayList(); private int mCurrentPhase = -1; - public SystemServiceManager(Context context) { + SystemServiceManager(Context context) { mContext = context; } @@ -235,7 +237,7 @@ public class SystemServiceManager { } /** Sets the safe mode flag for services to query. */ - public void setSafeMode(boolean safeMode) { + void setSafeMode(boolean safeMode) { mSafeMode = safeMode; } @@ -247,6 +249,28 @@ public class SystemServiceManager { return mSafeMode; } + /** + * @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. */ diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 45e06b0743f42..71ebad91191fc 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 @@ final class UserController { // 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 @@ final class UserController { } 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 @@ final class UserController { 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 283de4206debe..68cb0c5e3eaa1 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -278,7 +278,7 @@ public final class SystemServer { 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 @@ public final class SystemServer { // 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 @@ public final class SystemServer { 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 @@ public final class SystemServer { mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); traceEnd(); - if (!mRuntimeRestart) { + if (!mRuntimeRestart && !mFirstBoot) { MetricsLogger.histogram(null, "boot_package_manager_init_ready", (int) SystemClock.elapsedRealtime()); }