From 5eacf09ea4641ad80710312e324806d6395f7ef6 Mon Sep 17 00:00:00 2001 From: Mohammad Samiul Islam Date: Thu, 7 Feb 2019 14:05:21 +0000 Subject: [PATCH] Implement staged directory clean up for staged install Staged files should be deleted from /data/staging once installation is complete, regardless of failure or success. If a session fails pre-reboot verification, then it can be deleted before reboot. Bug: 123624108 Test: manual testing - create two apex files; aosp signed and dev signed - flash device with internal master - aosp signed apex file will fail pre-reboot verification - check that files are deleted in /data/staging - repeat with multiple package - dev signed package passes pre-reboot verification - on reboot, files should be deleted from /data/staging Change-Id: I44a6cc72de26ad0216942623edb6e279c628d58d --- .../server/pm/PackageInstallerSession.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 1b719048bc891..3a9a3890b685c 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1998,6 +1998,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mStagedSessionErrorMessage = errorMessage; Slog.d(TAG, "Marking session " + sessionId + " as failed: " + errorMessage); } + cleanStageDir(); mCallback.onStagedSessionChanged(this); } @@ -2009,7 +2010,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mStagedSessionFailed = false; mStagedSessionErrorCode = SessionInfo.STAGED_SESSION_NO_ERROR; mStagedSessionErrorMessage = ""; + Slog.d(TAG, "Marking session " + sessionId + " as applied"); } + cleanStageDir(); mCallback.onStagedSessionChanged(this); } @@ -2064,6 +2067,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } + private void cleanStageDir() { + if (isMultiPackage()) { + for (int childSessionId : getChildSessionIds()) { + mSessionProvider.getSession(childSessionId).cleanStageDir(); + } + } else { + try { + mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath()); + } catch (InstallerException ignored) { + } + } + } + void dump(IndentingPrintWriter pw) { synchronized (mLock) { dumpLocked(pw);