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

Commit ff7a8d6b authored by Martin Stjernholm's avatar Martin Stjernholm
Browse files

Call into ART Service for to delete OAT artifacts when it is enabled.

PackageManagerService.deleteOatArtifactsOfPackage is used e.g. from
AppHibernationService via the deprecated
PackageManagerInternalBase.deleteOatArtifactsOfPackage.

Test: adb shell cmd app_hibernation set-state --global com.android.egg true
  with dalvik.vm.useartservice=true and check that ART Service gets
  called and returns a freed byte count.
Bug: 251903639
Change-Id: I7bc01274067abaf1f8de8c0d82020550d23a22f9
parent a578a8db
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -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();
+1 −7
Original line number Diff line number Diff line
@@ -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);
        }
    }

    @Override
+30 −7
Original line number Diff line number Diff line
@@ -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");

        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);
            }
        }
    }

    List<String> getMimeGroupInternal(@NonNull Computer snapshot, String packageName,