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
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user