From 36de939b6851feefa0345c267e2ab7386b036bbd Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Thu, 21 Apr 2022 00:10:12 +0100 Subject: [PATCH] Drop caches of apks-in-apex if APEX was updated When an APEX is updated, we need to drop the cache for the apks that belong to it. This change does that by making use of the new updatedDuringThisBoot field in ActiveApexInfo. With this change the apk-in-apex cache problem is almost solved, the only remaining piece is to clean up the stale cache entries after the APEX update has completed. It will be done in a separate cl. Bug: 225435110 Test: manual Test: stage mediaprovider APEX Test: crash system_server Test: reboot device Test: check MediaProvider apk inside was updated Change-Id: I080e9e21370fd9c44d4a45b3fe61d127066123d8 --- .../core/java/com/android/server/pm/InitAppsHelper.java | 4 ++++ .../java/com/android/server/pm/InstallPackageHelper.java | 7 +++++++ .../java/com/android/server/pm/PackageManagerService.java | 5 +++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/InitAppsHelper.java b/services/core/java/com/android/server/pm/InitAppsHelper.java index c1e3c75223189..4019c15ee5504 100644 --- a/services/core/java/com/android/server/pm/InitAppsHelper.java +++ b/services/core/java/com/android/server/pm/InitAppsHelper.java @@ -25,6 +25,7 @@ import static com.android.server.pm.PackageManagerService.SCAN_AS_FACTORY; import static com.android.server.pm.PackageManagerService.SCAN_AS_PRIVILEGED; import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM; import static com.android.server.pm.PackageManagerService.SCAN_BOOTING; +import static com.android.server.pm.PackageManagerService.SCAN_DROP_CACHE; import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE; import static com.android.server.pm.PackageManagerService.SCAN_INITIAL; import static com.android.server.pm.PackageManagerService.SCAN_NO_DEX; @@ -174,6 +175,9 @@ final class InitAppsHelper { if (apexInfo.isFactory) { additionalScanFlag |= SCAN_AS_FACTORY; } + if (apexInfo.activeApexChanged) { + additionalScanFlag |= SCAN_DROP_CACHE; + } return new ScanPartition(apexInfo.apexDirectory, sp, additionalScanFlag); } } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 8875535971632..8c523a6910795 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -74,6 +74,7 @@ import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR; import static com.android.server.pm.PackageManagerService.SCAN_AS_VIRTUAL_PRELOAD; import static com.android.server.pm.PackageManagerService.SCAN_BOOTING; import static com.android.server.pm.PackageManagerService.SCAN_DONT_KILL_APP; +import static com.android.server.pm.PackageManagerService.SCAN_DROP_CACHE; import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE; import static com.android.server.pm.PackageManagerService.SCAN_IGNORE_FROZEN; import static com.android.server.pm.PackageManagerService.SCAN_INITIAL; @@ -154,6 +155,7 @@ import com.android.server.pm.dex.ArtManagerService; import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.DexoptOptions; import com.android.server.pm.dex.ViewCompiler; +import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; @@ -3455,6 +3457,11 @@ final class InstallPackageHelper { // Ignore entries which are not packages continue; } + if ((scanFlags & SCAN_DROP_CACHE) != 0) { + final PackageCacher cacher = new PackageCacher(mPm.getCacheDir()); + Log.w(TAG, "Dropping cache of " + file.getAbsolutePath()); + cacher.cleanCachedResult(file); + } parallelPackageParser.submit(file, parseFlags); fileCount++; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5dff5e7a6ccfe..0ffcc0cbb50cb 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -374,8 +374,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService static final int SCAN_AS_SYSTEM_EXT = 1 << 21; static final int SCAN_AS_ODM = 1 << 22; static final int SCAN_AS_APK_IN_APEX = 1 << 23; - static final int SCAN_AS_FACTORY = 1 << 24; - static final int SCAN_AS_APEX = 1 << 25; + static final int SCAN_DROP_CACHE = 1 << 24; + static final int SCAN_AS_FACTORY = 1 << 25; + static final int SCAN_AS_APEX = 1 << 26; @IntDef(flag = true, prefix = { "SCAN_" }, value = { SCAN_NO_DEX,