summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java50
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java17
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java3
3 files changed, 7 insertions, 63 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index ac56020f95a1..78e88be85cc8 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -129,9 +129,6 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
private static final long MAX_ACTIVE_SESSIONS = 1024;
/** 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;
-
private final Context mContext;
private final PackageManagerService mPm;
@@ -278,28 +275,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
@GuardedBy("mSessions")
private void reconcileStagesLocked(String volumeUuid) {
- final ArraySet<File> unclaimedStages = getStagingDirsOnVolume(volumeUuid);
+ final File stagingDir = getTmpSessionDir(volumeUuid);
+ final ArraySet<File> unclaimedStages = newArraySet(
+ stagingDir.listFiles(sStageFilter));
+
// 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<File> getStagingDirsOnVolume(String volumeUuid) {
- final File stagingDir = getTmpSessionDir(volumeUuid);
- final ArraySet<File> 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<File> 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);
@@ -313,33 +300,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<File> 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/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 413ee3256f0a..4e91f7d29ec7 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -2097,7 +2097,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
+ mParentSessionId + " and may not be abandoned directly.");
}
synchronized (mLock) {
- assertCallerIsOwnerOrRootOrSystemLocked();
+ assertCallerIsOwnerOrRootLocked();
+
if (isStagedAndInTerminalState()) {
// We keep the session in the database if it's in a finalized state. It will be
// removed by PackageInstallerService when the last update time is old enough.
@@ -2124,20 +2125,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
}
- /**
- * Check if the caller is the owner of this session. Otherwise throw a
- * {@link SecurityException}.
- */
- @GuardedBy("mLock")
- private void assertCallerIsOwnerOrRootOrSystemLocked() {
- final int callingUid = Binder.getCallingUid();
- if (callingUid != Process.ROOT_UID && callingUid != mInstallerUid
- && callingUid != Process.SYSTEM_UID) {
- throw new SecurityException("Session does not belong to uid " + callingUid);
- }
- }
-
-
@Override
public boolean isMultiPackage() {
return params.isMultiPackage;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3549db429758..af91d5973e6a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4875,9 +4875,6 @@ public class PackageManagerService extends IPackageManager.Stub
InstantAppRegistry.DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
return;
}
- // 12. Clear temp install session files
- mInstallerService.freeStageDirs(volumeUuid);
-
} else {
try {
mInstaller.freeCache(volumeUuid, bytes, 0, 0);