Loading services/core/java/android/content/pm/PackageManagerInternal.java +6 −0 Original line number Diff line number Diff line Loading @@ -479,6 +479,12 @@ public abstract class PackageManagerInternal { */ public abstract void pruneInstantApps(); /** * Prunes the cache of the APKs in the given APEXes. * @param apexPackages The list of APEX packages that may contain APK-in-APEX. */ public abstract void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages); /** * @return The SetupWizard package name. */ Loading services/core/java/com/android/server/pm/PackageManagerService.java +20 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,7 @@ import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.DexoptOptions; import com.android.server.pm.dex.PackageDexUsage; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.library.PackageBackwardCompatibility; Loading Loading @@ -24231,6 +24232,25 @@ public class PackageManagerService extends IPackageManager.Stub mInstantAppRegistry.pruneInstantApps(); } @Override public void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages) { if (mCacheDir == null) { return; } final PackageCacher cacher = new PackageCacher(mCacheDir); synchronized (mLock) { for (int i = 0, size = apexPackages.size(); i < size; i++) { final List<String> apkNames = mApexManager.getApksInApex(apexPackages.get(i).packageName); for (int j = 0, apksInApex = apkNames.size(); j < apksInApex; j++) { final AndroidPackage pkg = getPackage(apkNames.get(j)); cacher.cleanCachedResult(new File(pkg.getCodePath())); } } } } @Override public String getSetupWizardPackageName() { return mSetupWizardPackage; services/core/java/com/android/server/pm/StagingManager.java +6 −1 Original line number Diff line number Diff line Loading @@ -1226,8 +1226,9 @@ public class StagingManager { // APEX checks. For single-package sessions, check if they contain an APEX. For // multi-package sessions, find all the child sessions that contain an APEX. if (hasApex) { final List<PackageInfo> apexPackages; try { final List<PackageInfo> apexPackages = submitSessionToApexService(session); apexPackages = submitSessionToApexService(session); for (int i = 0, size = apexPackages.size(); i < size; i++) { validateApexSignature(apexPackages.get(i)); } Loading @@ -1235,6 +1236,10 @@ public class StagingManager { session.setStagedSessionFailed(e.error, e.getMessage()); return; } final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class); packageManagerInternal.pruneCachedApksInApex(apexPackages); } notifyPreRebootVerification_Apex_Complete(session.sessionId); Loading services/core/java/com/android/server/pm/parsing/PackageCacher.java +15 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.pm.parsing; import android.annotation.NonNull; import android.content.pm.PackageParserCacheHelper; import android.os.FileUtils; import android.os.Parcel; import android.system.ErrnoException; import android.system.Os; Loading Loading @@ -197,4 +198,18 @@ public class PackageCacher { Slog.w(TAG, "Error saving package cache.", e); } } /** * Delete the cache files for the given {@code packageFile}. */ public void cleanCachedResult(@NonNull File packageFile) { final String packageName = packageFile.getName(); final File[] files = FileUtils.listFilesOrEmpty(mCacheDir, (dir, name) -> name.startsWith(packageName)); for (File file : files) { if (!file.delete()) { Slog.e(TAG, "Unable to clean cache file: " + file); } } } } Loading
services/core/java/android/content/pm/PackageManagerInternal.java +6 −0 Original line number Diff line number Diff line Loading @@ -479,6 +479,12 @@ public abstract class PackageManagerInternal { */ public abstract void pruneInstantApps(); /** * Prunes the cache of the APKs in the given APEXes. * @param apexPackages The list of APEX packages that may contain APK-in-APEX. */ public abstract void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages); /** * @return The SetupWizard package name. */ Loading
services/core/java/com/android/server/pm/PackageManagerService.java +20 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,7 @@ import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.DexoptOptions; import com.android.server.pm.dex.PackageDexUsage; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.library.PackageBackwardCompatibility; Loading Loading @@ -24231,6 +24232,25 @@ public class PackageManagerService extends IPackageManager.Stub mInstantAppRegistry.pruneInstantApps(); } @Override public void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages) { if (mCacheDir == null) { return; } final PackageCacher cacher = new PackageCacher(mCacheDir); synchronized (mLock) { for (int i = 0, size = apexPackages.size(); i < size; i++) { final List<String> apkNames = mApexManager.getApksInApex(apexPackages.get(i).packageName); for (int j = 0, apksInApex = apkNames.size(); j < apksInApex; j++) { final AndroidPackage pkg = getPackage(apkNames.get(j)); cacher.cleanCachedResult(new File(pkg.getCodePath())); } } } } @Override public String getSetupWizardPackageName() { return mSetupWizardPackage;
services/core/java/com/android/server/pm/StagingManager.java +6 −1 Original line number Diff line number Diff line Loading @@ -1226,8 +1226,9 @@ public class StagingManager { // APEX checks. For single-package sessions, check if they contain an APEX. For // multi-package sessions, find all the child sessions that contain an APEX. if (hasApex) { final List<PackageInfo> apexPackages; try { final List<PackageInfo> apexPackages = submitSessionToApexService(session); apexPackages = submitSessionToApexService(session); for (int i = 0, size = apexPackages.size(); i < size; i++) { validateApexSignature(apexPackages.get(i)); } Loading @@ -1235,6 +1236,10 @@ public class StagingManager { session.setStagedSessionFailed(e.error, e.getMessage()); return; } final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class); packageManagerInternal.pruneCachedApksInApex(apexPackages); } notifyPreRebootVerification_Apex_Complete(session.sessionId); Loading
services/core/java/com/android/server/pm/parsing/PackageCacher.java +15 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.pm.parsing; import android.annotation.NonNull; import android.content.pm.PackageParserCacheHelper; import android.os.FileUtils; import android.os.Parcel; import android.system.ErrnoException; import android.system.Os; Loading Loading @@ -197,4 +198,18 @@ public class PackageCacher { Slog.w(TAG, "Error saving package cache.", e); } } /** * Delete the cache files for the given {@code packageFile}. */ public void cleanCachedResult(@NonNull File packageFile) { final String packageName = packageFile.getName(); final File[] files = FileUtils.listFilesOrEmpty(mCacheDir, (dir, name) -> name.startsWith(packageName)); for (File file : files) { if (!file.delete()) { Slog.e(TAG, "Unable to clean cache file: " + file); } } } }