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

Commit 5a1787b3 authored by Martin Stjernholm's avatar Martin Stjernholm
Browse files

Use ART Service OptimizePackageDoneCallback.

Add the callback when the ART Manager is initialized, and move the
CompilerStats code into it.

This moves the ART Manager initialization code from SystemServer to
DexOptHelper to keep it more contained, and it also fixes a small bug
where an ArtManagerLocal instance was created and registered even when
ART Service shouldn't be in use.

Also remove TODO for controlDexOptBlocking handling when ART Service is
in use. It got marked with LegacyDexoptDisabledException, so it's moot
to support in that mode.

Test: Boot
Bug: 251903639
Bug: 260072740
Change-Id: Id0995ef9f24ee007207ee0d1f7d2108fa81b15aa
parent a3e27513
Loading
Loading
Loading
Loading
+43 −16
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.pm.SharedLibraryInfo;
@@ -84,8 +85,10 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;

@@ -524,7 +527,6 @@ public final class DexOptHelper {
                return Optional.empty();
            }

            // TODO(b/251903639): Either remove controlDexOptBlocking, or don't ignore it here.
            OptimizeResult result;
            try {
                result = artManager.optimizePackage(snapshot, options.getPackageName(), params);
@@ -533,21 +535,6 @@ public final class DexOptHelper {
                return Optional.empty();
            }

            // TODO(b/251903639): Move this to ArtManagerLocal.addOptimizePackageDoneCallback when
            // it is implemented.
            for (OptimizeResult.PackageOptimizeResult pkgRes : result.getPackageOptimizeResults()) {
                PackageState ps = snapshot.getPackageState(pkgRes.getPackageName());
                AndroidPackage ap = ps != null ? ps.getAndroidPackage() : null;
                if (ap != null) {
                    CompilerStats.PackageStats stats = mPm.getOrCreateCompilerPackageStats(ap);
                    for (OptimizeResult.DexContainerFileOptimizeResult dexRes :
                            pkgRes.getDexContainerFileOptimizeResults()) {
                        stats.setCompileTime(
                                dexRes.getDexContainerFile(), dexRes.getDex2oatWallTimeMillis());
                    }
                }
            }

            return Optional.of(convertToDexOptResult(result));
        }
    }
@@ -967,6 +954,46 @@ public final class DexOptHelper {
        }
    }

    private static class OptimizePackageDoneHandler
            implements ArtManagerLocal.OptimizePackageDoneCallback {
        @NonNull private final PackageManagerService mPm;

        OptimizePackageDoneHandler(@NonNull PackageManagerService pm) { mPm = pm; }

        /**
         * Called after every package optimization operation done by {@link ArtManagerLocal}.
         */
        @Override
        public void onOptimizePackageDone(@NonNull OptimizeResult result) {
            for (OptimizeResult.PackageOptimizeResult pkgRes : result.getPackageOptimizeResults()) {
                CompilerStats.PackageStats stats =
                        mPm.getOrCreateCompilerPackageStats(pkgRes.getPackageName());
                for (OptimizeResult.DexContainerFileOptimizeResult dexRes :
                        pkgRes.getDexContainerFileOptimizeResults()) {
                    stats.setCompileTime(
                            dexRes.getDexContainerFile(), dexRes.getDex2oatWallTimeMillis());
                }
            }
        }
    }

    /**
     * Initializes {@link ArtManagerLocal} before {@link getArtManagerLocal} is called.
     */
    public static void initializeArtManagerLocal(
            @NonNull Context systemContext, @NonNull PackageManagerService pm) {
        if (!useArtService()) {
            return;
        }

        ArtManagerLocal artManager = new ArtManagerLocal(systemContext);
        // There doesn't appear to be any checks that @NonNull is heeded, so use requireNonNull
        // below to ensure we don't store away a null that we'll fail on later.
        artManager.addOptimizePackageDoneCallback(false /* onlyIncludeUpdates */,
                Runnable::run, new OptimizePackageDoneHandler(Objects.requireNonNull(pm)));
        LocalManagerRegistry.addManager(ArtManagerLocal.class, artManager);
    }

    /**
     * Returns {@link ArtManagerLocal} if ART Service should be used for package optimization.
     */
+3 −3
Original line number Diff line number Diff line
@@ -108,7 +108,6 @@ import com.android.internal.widget.LockSettingsInternal;
import com.android.server.am.ActivityManagerService;
import com.android.server.ambientcontext.AmbientContextManagerService;
import com.android.server.appbinding.AppBindingService;
import com.android.server.art.ArtManagerLocal;
import com.android.server.art.ArtModuleServiceInitializer;
import com.android.server.art.DexUseManagerLocal;
import com.android.server.attention.AttentionManagerService;
@@ -132,8 +131,8 @@ import com.android.server.display.DisplayManagerService;
import com.android.server.display.color.ColorDisplayService;
import com.android.server.dreams.DreamManagerService;
import com.android.server.emergency.EmergencyAffordanceService;
import com.android.server.grammaticalinflection.GrammaticalInflectionService;
import com.android.server.gpu.GpuService;
import com.android.server.grammaticalinflection.GrammaticalInflectionService;
import com.android.server.graphics.fonts.FontManagerService;
import com.android.server.hdmi.HdmiControlService;
import com.android.server.incident.IncidentCompanionService;
@@ -163,6 +162,7 @@ import com.android.server.pm.ApexSystemServiceInfo;
import com.android.server.pm.BackgroundInstallControlService;
import com.android.server.pm.CrossProfileAppsService;
import com.android.server.pm.DataLoaderManagerService;
import com.android.server.pm.DexOptHelper;
import com.android.server.pm.DynamicCodeLoggingService;
import com.android.server.pm.Installer;
import com.android.server.pm.LauncherAppsService;
@@ -2770,7 +2770,7 @@ public final class SystemServer implements Dumpable {
        t.traceEnd();

        t.traceBegin("ArtManagerLocal");
        LocalManagerRegistry.addManager(ArtManagerLocal.class, new ArtManagerLocal(context));
        DexOptHelper.initializeArtManagerLocal(context, mPackageManagerService);
        t.traceEnd();

        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB)) {