diff --git a/core/java/android/os/incremental/IncrementalManager.java b/core/java/android/os/incremental/IncrementalManager.java index 047c05a8734ba..7fb9ae0d86cc0 100644 --- a/core/java/android/os/incremental/IncrementalManager.java +++ b/core/java/android/os/incremental/IncrementalManager.java @@ -25,6 +25,7 @@ import android.content.pm.DataLoaderParams; import android.content.pm.IPackageLoadingProgressCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; @@ -285,7 +286,7 @@ public final class IncrementalManager { * Unbinds the target dir and deletes the corresponding storage instance. * Deletes the package name and associated storage id from maps. */ - public void onPackageRemoved(@NonNull File codeFile) { + public void rmPackageDir(@NonNull File codeFile) { try { final String codePath = codeFile.getAbsolutePath(); final IncrementalStorage storage = openStorage(codePath); @@ -294,11 +295,9 @@ public final class IncrementalManager { } mLoadingProgressCallbacks.cleanUpCallbacks(storage); unregisterHealthListener(codePath); - - // Parent since we bind-mount a folder one level above. - mService.deleteBindMount(storage.getId(), codeFile.getParent()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + storage.unBind(codePath); + } catch (IOException e) { + Slog.w(TAG, "Failed to remove code path", e); } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 671fccf0e9ef8..7b71be98834c2 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -4132,6 +4132,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } private void destroyInternal() { + final IncrementalFileStorages incrementalFileStorages; synchronized (mLock) { mSealed = true; if (!params.isStaged) { @@ -4144,16 +4145,17 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { for (FileBridge bridge : mBridges) { bridge.forceClose(); } - if (mIncrementalFileStorages != null) { - mIncrementalFileStorages.cleanUp(); - mIncrementalFileStorages = null; - } + incrementalFileStorages = mIncrementalFileStorages; + mIncrementalFileStorages = null; } // For staged sessions, we don't delete the directory where the packages have been copied, // since these packages are supposed to be read on reboot. // Those dirs are deleted when the staged session has reached a final state. if (stageDir != null && !params.isStaged) { try { + if (incrementalFileStorages != null) { + incrementalFileStorages.cleanUp(); + } mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath()); } catch (InstallerException ignored) { } @@ -4171,13 +4173,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } private void cleanStageDir() { + final IncrementalFileStorages incrementalFileStorages; synchronized (mLock) { - if (mIncrementalFileStorages != null) { - mIncrementalFileStorages.cleanUp(); - mIncrementalFileStorages = null; - } + incrementalFileStorages = mIncrementalFileStorages; + mIncrementalFileStorages = null; } try { + if (incrementalFileStorages != null) { + incrementalFileStorages.cleanUp(); + } mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath()); } catch (InstallerException ignored) { } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 1279025b1485e..cb68cc9d5e453 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12580,10 +12580,21 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mInstallLock") void removeCodePathLI(File codePath) { if (codePath.isDirectory()) { - File codePathParent = codePath.getParentFile(); + final File codePathParent = codePath.getParentFile(); + final boolean needRemoveParent = codePathParent.getName().startsWith(RANDOM_DIR_PREFIX); try { + final boolean isIncremental = (mIncrementalManager != null && isIncrementalPath( + codePath.getAbsolutePath())); + if (isIncremental) { + if (needRemoveParent) { + mIncrementalManager.rmPackageDir(codePathParent); + } else { + mIncrementalManager.rmPackageDir(codePath); + } + } + mInstaller.rmPackageDir(codePath.getAbsolutePath()); - if (codePathParent.getName().startsWith(RANDOM_DIR_PREFIX)) { + if (needRemoveParent) { mInstaller.rmPackageDir(codePathParent.getAbsolutePath()); removeCachedResult(codePathParent); } @@ -18126,16 +18137,7 @@ public class PackageManagerService extends IPackageManager.Stub if (codeFile == null || !codeFile.exists()) { return false; } - - final boolean isIncremental = (mIncrementalManager != null && isIncrementalPath( - codeFile.getAbsolutePath())); - removeCodePathLI(codeFile); - - if (isIncremental) { - mIncrementalManager.onPackageRemoved(codeFile); - } - return true; } @@ -24776,7 +24778,7 @@ public class PackageManagerService extends IPackageManager.Stub final int fileToDeleteCount = filesToDelete.size(); for (int i = 0; i < fileToDeleteCount; i++) { File fileToDelete = filesToDelete.get(i); - logCriticalInfo(Log.WARN, "Destroying orphaned" + fileToDelete); + logCriticalInfo(Log.WARN, "Destroying orphaned at " + fileToDelete); synchronized (mInstallLock) { removeCodePathLI(fileToDelete); }