summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java38
-rw-r--r--tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java16
-rw-r--r--tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java12
3 files changed, 15 insertions, 51 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index f997d67864f9..c47ca4b45ab3 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -558,7 +558,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
Slog.d(TAG, "Marking session " + sessionId + " as failed: " + errorMessage);
childSessions = getChildSessionsLocked();
}
- destroy();
+ destroyInternal();
+ for (PackageInstallerSession child : childSessions) {
+ child.destroyInternal();
+ }
mCallback.onStagedSessionChanged(PackageInstallerSession.this);
}
@@ -576,7 +579,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
Slog.d(TAG, "Marking session " + sessionId + " as applied");
childSessions = getChildSessionsLocked();
}
- destroy();
+ destroyInternal();
+ for (PackageInstallerSession child : childSessions) {
+ child.destroyInternal();
+ }
mCallback.onStagedSessionChanged(PackageInstallerSession.this);
}
@@ -2105,14 +2111,18 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private void onSessionVerificationFailure(int error, String msg) {
final String msgWithErrorCode = PackageManager.installStatusToString(error, msg);
Slog.e(TAG, "Failed to verify session " + sessionId + " [" + msgWithErrorCode + "]");
+ // Session is sealed and committed but could not be verified, we need to destroy it.
+ destroyInternal();
+ if (isMultiPackage()) {
+ for (PackageInstallerSession childSession : getChildSessions()) {
+ childSession.destroyInternal();
+ }
+ }
if (isStaged()) {
- // This will clean up the session when it reaches the terminal state
mStagedSession.setSessionFailed(
SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, msgWithErrorCode);
mStagedSession.notifyEndPreRebootVerification();
} else {
- // Session is sealed and committed but could not be verified, we need to destroy it.
- destroy();
// Dispatch message to remove session from PackageInstallerService.
dispatchSessionFinished(error, msg, null);
}
@@ -4255,24 +4265,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return params.isStaged ? mStagedSession.getSessionErrorMessage() : "";
}
- /**
- * Free up storage used by this session and its children.
- * Must not be called on a child session.
- */
- private void destroy() {
- // TODO(b/173194203): destroyInternal() should be used by destroy() only.
- // For the sake of consistency, a session should be destroyed as a whole. The caller
- // should always call destroy() for cleanup without knowing it has child sessions or not.
- assertNotChild("destroy");
- destroyInternal();
- for (PackageInstallerSession child : getChildSessions()) {
- child.destroyInternal();
- }
- }
-
- /**
- * Free up storage used by this session.
- */
private void destroyInternal() {
final IncrementalFileStorages incrementalFileStorages;
synchronized (mLock) {
diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
index da5468e48f19..e4e535d3240d 100644
--- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
@@ -157,18 +157,8 @@ public class StagedInstallInternalTest {
@Test
public void testStagedSessionShouldCleanUpOnVerificationFailure() throws Exception {
- // APEX verification
InstallUtils.commitExpectingFailure(AssertionError.class, "apexd verification failed",
Install.single(APEX_WRONG_SHA_V2).setStaged());
- InstallUtils.commitExpectingFailure(AssertionError.class, "apexd verification failed",
- Install.multi(APEX_WRONG_SHA_V2, TestApp.A1).setStaged());
- // APK verification
- Install.single(TestApp.A2).commit();
- assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
- InstallUtils.commitExpectingFailure(AssertionError.class, "Downgrade detected",
- Install.single(TestApp.A1).setStaged());
- InstallUtils.commitExpectingFailure(AssertionError.class, "Downgrade detected",
- Install.multi(TestApp.A1, TestApp.B1).setStaged());
}
@Test
@@ -186,12 +176,6 @@ public class StagedInstallInternalTest {
}
@Test
- public void testStagedSessionShouldCleanUpOnOnSuccessMultiPackage_Commit() throws Exception {
- int sessionId = Install.multi(TestApp.A1, TestApp.Apex2).setStaged().commit();
- storeSessionId(sessionId);
- }
-
- @Test
public void testStagedInstallationShouldCleanUpOnValidationFailure() throws Exception {
InstallUtils.commitExpectingFailure(AssertionError.class, "INSTALL_FAILED_INVALID_APK",
Install.single(TestApp.AIncompleteSplit).setStaged());
diff --git a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
index 926bf1b88fee..78cf9aca66c0 100644
--- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
@@ -301,18 +301,6 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
}
@Test
- @LargeTest
- public void testStagedSessionShouldCleanUpOnOnSuccessMultiPackage() throws Exception {
- List<String> before = getStagingDirectories();
- runPhase("testStagedSessionShouldCleanUpOnOnSuccessMultiPackage_Commit");
- assertThat(getStagingDirectories()).isNotEqualTo(before);
- getDevice().reboot();
- runPhase("testStagedSessionShouldCleanUpOnOnSuccess_Verify");
- List<String> after = getStagingDirectories();
- assertThat(after).isEqualTo(before);
- }
-
- @Test
public void testStagedInstallationShouldCleanUpOnValidationFailure() throws Exception {
List<String> before = getStagingDirectories();
runPhase("testStagedInstallationShouldCleanUpOnValidationFailure");