Merge "Fixed NPE in package installer session." into qt-qpr1-dev am: 53a56839b9

Change-Id: I0078d29119d6bb2810bd55b82cfa397f843f0353
This commit is contained in:
Automerger Merge Worker
2020-02-06 05:51:24 +00:00
2 changed files with 14 additions and 4 deletions

View File

@@ -258,12 +258,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
}
// Don't hold mSessions lock when calling restoreSession, since it might trigger an APK
// atomic install which needs to query sessions, which requires lock on mSessions.
boolean isDeviceUpgrading = mPm.isDeviceUpgrading();
for (PackageInstallerSession session : stagedSessionsToRestore) {
if (mPm.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

View File

@@ -630,7 +630,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);
@@ -647,6 +647,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);
}