From dd01ec611bdc08c1f5837c0cd35a3cebab1aed21 Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Thu, 6 Aug 2020 16:03:55 +0800 Subject: Remove orphaned cached result PackageManagerService would parse all installed APKs info and cache them, but only delete them when system update. As long as the APKs keep updating without having system update, the older cached result would eventually occupy more and more user space. One way to mitigate this is removing the cached result when the APK is updated or uninstalled. Bug: 120608320 Test: Update/uninstall an APK, and check its cached result Change-Id: I977a0923703bda6f145c9d240a1408f6f87c5625 --- .../java/com/android/server/pm/PackageManagerService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a754497953c1..a2aedbafb05a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -10330,6 +10330,7 @@ public class PackageManagerService extends IPackageManager.Stub mInstaller.rmPackageDir(codePath.getAbsolutePath()); if (codePathParent.getName().startsWith(RANDOM_DIR_PREFIX)) { mInstaller.rmPackageDir(codePathParent.getAbsolutePath()); + removeCachedResult(codePathParent); } } catch (InstallerException e) { Slog.w(TAG, "Failed to remove code path", e); @@ -10339,6 +10340,16 @@ public class PackageManagerService extends IPackageManager.Stub } } + private void removeCachedResult(@NonNull File codePath) { + if (mCacheDir == null) { + return; + } + + final PackageCacher cacher = new PackageCacher(mCacheDir); + // Find and delete the cached result belong to the given codePath. + cacher.cleanCachedResult(codePath); + } + private int[] resolveUserIds(int userId) { return (userId == UserHandle.USER_ALL) ? mUserManager.getUserIds() : new int[] { userId }; } -- cgit v1.2.3-59-g8ed1b