Merge "Fixed NPE in package installer session." into qt-qpr1-dev am: 53a56839b9
Change-Id: I0078d29119d6bb2810bd55b82cfa397f843f0353
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user