summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java8
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java9
2 files changed, 13 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 6331dd46c035..10f46fd808c8 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -259,11 +259,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
// atomic install which needs to query sessions, which requires lock on mSessions.
boolean isDeviceUpgrading = mPm.isDeviceUpgrading();
for (PackageInstallerSession session : stagedSessionsToRestore) {
- if (isDeviceUpgrading && !session.isStagedAndInTerminalState()) {
+ if (!session.isStagedAndInTerminalState() && session.hasParentSessionId()
+ && getSession(session.getParentSessionId()) == null) {
session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
- "Build fingerprint has changed");
+ "An orphan staged session " + session.sessionId + " is found, "
+ + "parent " + session.getParentSessionId() + " is missing");
}
- mStagingManager.restoreSession(session);
+ mStagingManager.restoreSession(session, isDeviceUpgrading);
}
// Broadcasts are not sent while we restore sessions on boot, since no processes would be
// ready to listen to them. From now on, we greedily assume that broadcasts requests are
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 7888d1f9612f..74c98f9ef444 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -889,7 +889,7 @@ public class StagingManager {
return false;
}
- void restoreSession(@NonNull PackageInstallerSession session) {
+ void restoreSession(@NonNull PackageInstallerSession session, boolean isDeviceUpgrading) {
PackageInstallerSession sessionToResume = session;
synchronized (mStagedSessions) {
mStagedSessions.append(session.sessionId, session);
@@ -906,6 +906,13 @@ public class StagingManager {
}
}
}
+ // The preconditions used during pre-reboot verification might have changed when device
+ // is upgrading. Updated staged sessions to activation failed before we resume the session.
+ if (isDeviceUpgrading && !sessionToResume.isStagedAndInTerminalState()) {
+ sessionToResume.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
+ "Build fingerprint has changed");
+ return;
+ }
checkStateAndResume(sessionToResume);
}