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
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;
}
}
/** Sets the safe mode flag for services to query. */
- public void setSafeMode(boolean safeMode) {
+ void setSafeMode(boolean safeMode) {
mSafeMode = safeMode;
}
}
/**
+ * @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() {
// 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));
}
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
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
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);
// 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();
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());
}
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
traceEnd();
- if (!mRuntimeRestart) {
+ if (!mRuntimeRestart && !mFirstBoot) {
MetricsLogger.histogram(null, "boot_package_manager_init_ready",
(int) SystemClock.elapsedRealtime());
}