diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index 490b2a954418b..767c0a73bc543 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -168,13 +168,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: " + DexOptHelper.packagesToString(others)); for (PackageStateInternal pkg : others) { - // TODO(b/251903639): Call into ART Service. - try { - mPackageManagerService.deleteOatArtifactsOfPackage( - snapshot, pkg.getPackageName()); - } catch (LegacyDexoptDisabledException e) { - throw new RuntimeException(e); - } + mPackageManagerService.deleteOatArtifactsOfPackage(snapshot, pkg.getPackageName()); } } long spaceAvailableNow = getAvailableSpace(); diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java index 99fff720221e5..4e7521070132b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java +++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java @@ -47,7 +47,6 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.SparseArray; -import com.android.server.pm.Installer.LegacyDexoptDisabledException; import com.android.server.pm.dex.DexManager; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.pkg.AndroidPackage; @@ -708,12 +707,7 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { @Override @Deprecated public final long deleteOatArtifactsOfPackage(String packageName) { - // TODO(b/251903639): Call into ART Service. - try { - return mService.deleteOatArtifactsOfPackage(snapshot(), packageName); - } catch (LegacyDexoptDisabledException e) { - throw new RuntimeException(e); - } + return mService.deleteOatArtifactsOfPackage(snapshot(), packageName); } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f316d21ba2a44..0a4e5f18bf341 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -196,6 +196,7 @@ import com.android.server.SystemConfig; import com.android.server.Watchdog; import com.android.server.apphibernation.AppHibernationManagerInternal; import com.android.server.art.DexUseManagerLocal; +import com.android.server.art.model.DeleteResult; import com.android.server.compat.CompatChange; import com.android.server.compat.PlatformCompat; import com.android.server.pm.Installer.InstallerException; @@ -7106,17 +7107,39 @@ public class PackageManagerService implements PackageSender, TestUtilityService return AndroidPackageUtils.canHaveOatDir(packageState, packageState.getPkg()); } - long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName) - throws LegacyDexoptDisabledException { + long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName) { PackageManagerServiceUtils.enforceSystemOrRootOrShell( "Only the system or shell can delete oat artifacts"); - PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); - if (packageState == null || packageState.getPkg() == null) { - return -1; // error code of deleteOptimizedFiles + if (DexOptHelper.useArtService()) { + // TODO(chiuwinson): Retrieve filtered snapshot from Computer instance instead. + try (PackageManagerLocal.FilteredSnapshot filteredSnapshot = + PackageManagerServiceUtils.getPackageManagerLocal() + .withFilteredSnapshot()) { + try { + DeleteResult res = DexOptHelper.getArtManagerLocal().deleteDexoptArtifacts( + filteredSnapshot, packageName); + return res.getFreedBytes(); + } catch (IllegalArgumentException e) { + Log.e(TAG, e.toString()); + return -1; + } catch (IllegalStateException e) { + Slog.wtfStack(TAG, e.toString()); + return -1; + } + } + } else { + PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + if (packageState == null || packageState.getPkg() == null) { + return -1; // error code of deleteOptimizedFiles + } + try { + return mDexManager.deleteOptimizedFiles( + ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState)); + } catch (LegacyDexoptDisabledException e) { + throw new RuntimeException(e); + } } - return mDexManager.deleteOptimizedFiles( - ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState)); } List getMimeGroupInternal(@NonNull Computer snapshot, String packageName,