diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 4358fd5887f32..f9dd826e4b998 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -557,13 +557,17 @@ public class Installer extends SystemService { } } - public void deleteOdex(String apkPath, String instructionSet, String outputPath) + /** + * Deletes the optimized artifacts generated by ART and returns the number + * of freed bytes. + */ + public long deleteOdex(String apkPath, String instructionSet, String outputPath) throws InstallerException { - if (!checkBeforeRemote()) return; + if (!checkBeforeRemote()) return -1; BlockGuard.getVmPolicy().onPathAccess(apkPath); BlockGuard.getVmPolicy().onPathAccess(outputPath); try { - mInstalld.deleteOdex(apkPath, instructionSet, outputPath); + return mInstalld.deleteOdex(apkPath, instructionSet, outputPath); } catch (Exception e) { throw InstallerException.from(e); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a90dcab686a74..8b590e24ff5ff 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -25550,14 +25550,14 @@ public class PackageManagerService extends IPackageManager.Stub } } - void deleteOatArtifactsOfPackage(String packageName) { + long deleteOatArtifactsOfPackage(String packageName) { final AndroidPackage pkg; final PackageSetting pkgSetting; synchronized (mLock) { pkg = mPackages.get(packageName); pkgSetting = mSettings.getPackageLPr(packageName); } - mDexManager.deleteOptimizedFiles(ArtUtils.createArtPackageInfo(pkg, pkgSetting)); + return mDexManager.deleteOptimizedFiles(ArtUtils.createArtPackageInfo(pkg, pkgSetting)); } Set getUnusedPackages(long downgradeTimeThresholdMillis) { diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index 32ba26c2d5edf..58204891293ca 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -1034,18 +1034,26 @@ public class DexManager { /** * Deletes all the optimizations files generated by ART. + * This is best effort, and the method will log but not throw errors + * for individual deletes + * * @param packageInfo the package information. + * @return the number of freed bytes or -1 if there was an error in the process. */ - public void deleteOptimizedFiles(ArtPackageInfo packageInfo) { + public long deleteOptimizedFiles(ArtPackageInfo packageInfo) { + long freedBytes = 0; + boolean hadErrors = false; for (String codePath : packageInfo.getCodePaths()) { for (String isa : packageInfo.getInstructionSets()) { try { - mInstaller.deleteOdex(codePath, isa, packageInfo.getOatDir()); + freedBytes += mInstaller.deleteOdex(codePath, isa, packageInfo.getOatDir()); } catch (InstallerException e) { Log.e(TAG, "Failed deleting oat files for " + codePath, e); + hadErrors = true; } } } + return hadErrors ? -1 : freedBytes; } public static class RegisterDexModuleResult {