summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2014-08-07 19:06:49 -0700
committerJeff Brown <jeffbrown@google.com>2014-08-11 17:13:03 -0700
commit6d2a9492e2b19421165f0cd918d9f28595bfb770 (patch)
tree61aec347859424bcaa3a8b8f2e10d97874efef82
parent77437731a70c74d24a3a63d5d1cb899ffae34eb1 (diff)
downloadframeworks_base-6d2a9492e2b19421165f0cd918d9f28595bfb770.zip
frameworks_base-6d2a9492e2b19421165f0cd918d9f28595bfb770.tar.gz
frameworks_base-6d2a9492e2b19421165f0cd918d9f28595bfb770.tar.bz2
Eliminate power manager latency for boot completed.
The power manager disables the power button until boot completed occurs. If there are many pending broadcasts in the queue, it may be possible for BOOT_COMPLETED to be delayed for several seconds after boot. To avoid the delay, introduced a new boot phase which is sent to system services immediately when boot completed happens. Bug: 13398280 Change-Id: I1833d2ffb20305009dd76363b43e534034f1d0a2
-rw-r--r--core/java/com/android/server/SystemService.java7
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityManagerService.java3
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java31
-rw-r--r--services/java/com/android/server/SystemServer.java1
4 files changed, 21 insertions, 21 deletions
diff --git a/core/java/com/android/server/SystemService.java b/core/java/com/android/server/SystemService.java
index 43a05d0..6e67970 100644
--- a/core/java/com/android/server/SystemService.java
+++ b/core/java/com/android/server/SystemService.java
@@ -73,9 +73,12 @@ public abstract class SystemService {
public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
/**
- * After receiving this boot phase, services must have finished all boot-related work.
+ * After receiving this boot phase, services can allow user interaction with the device.
+ * This phase occurs when boot has completed and the home application has started.
+ * System services may prefer to listen to this phase rather than registering a
+ * broadcast receiver for ACTION_BOOT_COMPLETED to reduce overall latency.
*/
- public static final int PHASE_BOOT_COMPLETE = 1000;
+ public static final int PHASE_BOOT_COMPLETED = 1000;
private final Context mContext;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 22d8e32..298d6d3 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -5648,6 +5648,9 @@ public final class ActivityManagerService extends ActivityManagerNative
// Register receivers to handle package update events
mPackageMonitor.register(mContext, Looper.getMainLooper(), false);
+ // Let system services know.
+ mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+
synchronized (this) {
// Ensure that any processes we had put on hold are now started
// up.
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index d1182e9..14cbd66 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -474,6 +474,19 @@ public final class PowerManagerService extends com.android.server.SystemService
Watchdog.getInstance().addThread(mHandler);
}
+ @Override
+ public void onBootPhase(int phase) {
+ if (phase == PHASE_BOOT_COMPLETED) {
+ // This is our early signal that the system thinks it has finished booting.
+ // However, the boot animation may still be running for a few more seconds
+ // since it is ultimately in charge of when it terminates.
+ // Defer transitioning into the boot completed state until the animation exits.
+ // We do this so that the screen does not start to dim prematurely before
+ // the user has actually had a chance to interact with the device.
+ startWatchingForBootAnimationFinished();
+ }
+ }
+
public void systemReady(IAppOpsService appOps) {
synchronized (mLock) {
mSystemReady = true;
@@ -516,11 +529,6 @@ public final class PowerManagerService extends com.android.server.SystemService
mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler);
filter = new IntentFilter();
- filter.addAction(Intent.ACTION_BOOT_COMPLETED);
- filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
- mContext.registerReceiver(new BootCompletedReceiver(), filter, null, mHandler);
-
- filter = new IntentFilter();
filter.addAction(Intent.ACTION_DREAMING_STARTED);
filter.addAction(Intent.ACTION_DREAMING_STOPPED);
mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler);
@@ -2404,19 +2412,6 @@ public final class PowerManagerService extends com.android.server.SystemService
}
}
- private final class BootCompletedReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- // This is our early signal that the system thinks it has finished booting.
- // However, the boot animation may still be running for a few more seconds
- // since it is ultimately in charge of when it terminates.
- // Defer transitioning into the boot completed state until the animation exits.
- // We do this so that the screen does not start to dim prematurely before
- // the user has actually had a chance to interact with the device.
- startWatchingForBootAnimationFinished();
- }
- }
-
private final class DreamReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e70f0cf..a3c10fd 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1184,7 +1184,6 @@ public final class SystemServer {
} catch (Throwable e) {
reportWtf("Notifying MmsService running", e);
}
- mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETE);
}
});
}