diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 314cd696036af..b34a3a2b8dcbf 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -135,8 +135,6 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements private static final long MAX_ACTIVE_SESSIONS_NO_PERMISSION = 50; /** Upper bound on number of historical sessions for a UID */ private static final long MAX_HISTORICAL_SESSIONS = 1048576; - /** Destroy sessions older than this on storage free request */ - private static final long MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS = 8 * DateUtils.HOUR_IN_MILLIS; /** * Allow verification-skipping if it's a development app installed through ADB with @@ -341,28 +339,22 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @GuardedBy("mSessions") private void reconcileStagesLocked(String volumeUuid) { - final ArraySet unclaimedStages = getStagingDirsOnVolume(volumeUuid); + final File stagingDir = getTmpSessionDir(volumeUuid); + final ArraySet unclaimedStages = newArraySet( + stagingDir.listFiles(sStageFilter)); + + // We also need to clean up orphaned staging directory for staged sessions + final File stagedSessionStagingDir = Environment.getDataStagingDirectory(volumeUuid); + unclaimedStages.addAll(newArraySet(stagedSessionStagingDir.listFiles())); + // Ignore stages claimed by active sessions for (int i = 0; i < mSessions.size(); i++) { final PackageInstallerSession session = mSessions.valueAt(i); unclaimedStages.remove(session.stageDir); } - removeStagingDirs(unclaimedStages); - } - private ArraySet getStagingDirsOnVolume(String volumeUuid) { - final File stagingDir = getTmpSessionDir(volumeUuid); - final ArraySet stagingDirs = newArraySet(stagingDir.listFiles(sStageFilter)); - - // We also need to clean up orphaned staging directory for staged sessions - final File stagedSessionStagingDir = Environment.getDataStagingDirectory(volumeUuid); - stagingDirs.addAll(newArraySet(stagedSessionStagingDir.listFiles())); - return stagingDirs; - } - - private void removeStagingDirs(ArraySet stagingDirsToRemove) { // Clean up orphaned staging directories - for (File stage : stagingDirsToRemove) { + for (File stage : unclaimedStages) { Slog.w(TAG, "Deleting orphan stage " + stage); synchronized (mPm.mInstallLock) { mPm.removeCodePathLI(stage); @@ -376,33 +368,6 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } - /** - * Called to free up some storage space from obsolete installation files - */ - public void freeStageDirs(String volumeUuid) { - final ArraySet unclaimedStagingDirsOnVolume = getStagingDirsOnVolume(volumeUuid); - final long currentTimeMillis = System.currentTimeMillis(); - synchronized (mSessions) { - for (int i = 0; i < mSessions.size(); i++) { - final PackageInstallerSession session = mSessions.valueAt(i); - if (!unclaimedStagingDirsOnVolume.contains(session.stageDir)) { - // Only handles sessions stored on the target volume - continue; - } - final long age = currentTimeMillis - session.createdMillis; - if (age >= MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS) { - // Aggressively close old sessions because we are running low on storage - // Their staging dirs will be removed too - session.abandon(); - } else { - // Session is new enough, so it deserves to be kept even on low storage - unclaimedStagingDirsOnVolume.remove(session.stageDir); - } - } - } - removeStagingDirs(unclaimedStagingDirsOnVolume); - } - public static boolean isStageName(String name) { final boolean isFile = name.startsWith("vmdl") && name.endsWith(".tmp"); final boolean isContainer = name.startsWith("smdl") && name.endsWith(".tmp"); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e62102c621cd8..78ea422706f74 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8004,9 +8004,6 @@ public class PackageManagerService extends IPackageManager.Stub if (freeBytesRequired > 0) { smInternal.freeCache(volumeUuid, freeBytesRequired); } - - // 12. Clear temp install session files - mInstallerService.freeStageDirs(volumeUuid); } else { try { mInstaller.freeCache(volumeUuid, bytes, 0, 0);