Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0782f3ea authored by Nikita Ioffe's avatar Nikita Ioffe
Browse files

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
Merged-In: I080e9e21370fd9c44d4a45b3fe61d127066123d8
parent 6bcc34ca
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static com.android.server.pm.PackageManagerService.SCAN_AS_APK_IN_APEX;
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;
@@ -167,7 +168,11 @@ final class InitAppsHelper {
                    sp.getFolder().getAbsolutePath())
                    || apexInfo.preInstalledApexPath.getAbsolutePath().startsWith(
                    sp.getFolder().getAbsolutePath() + File.separator)) {
                return new ScanPartition(apexInfo.apexDirectory, sp, SCAN_AS_APK_IN_APEX);
                int flags = SCAN_AS_APK_IN_APEX;
                if (apexInfo.activeApexChanged) {
                    flags |= SCAN_DROP_CACHE;
                }
                return new ScanPartition(apexInfo.apexDirectory, sp, flags);
            }
        }
        return null;
+7 −0
Original line number Diff line number Diff line
@@ -72,6 +72,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;
@@ -152,6 +153,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;
@@ -3418,6 +3420,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++;
        }
+1 −0
Original line number Diff line number Diff line
@@ -376,6 +376,7 @@ 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_DROP_CACHE = 1 << 24;

    @IntDef(flag = true, prefix = { "SCAN_" }, value = {
            SCAN_NO_DEX,