Merge "Notify Pinner Service and write FrameworkStatsLog."

This commit is contained in:
Jiakai Zhang
2023-01-19 07:30:30 +00:00
committed by Android (Google) Code Review
2 changed files with 37 additions and 0 deletions

View File

@@ -331,6 +331,7 @@ public final class BackgroundDexOptService {
/** Adds listener for package update */
public void addPackagesUpdatedListener(PackagesUpdatedListener listener)
throws LegacyDexoptDisabledException {
// TODO(b/251903639): Evaluate whether this needs to support ART Service or not.
Installer.checkLegacyDexoptDisabled();
synchronized (mLock) {
mPackagesUpdatedListeners.add(listener);
@@ -629,6 +630,8 @@ public final class BackgroundDexOptService {
/** Gets the size of a package. */
private long getPackageSize(@NonNull Computer snapshot, String pkg) {
// TODO(b/251903639): Make this in line with the calculation in
// `DexOptHelper.DexoptDoneHandler`.
PackageInfo info = snapshot.getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM);
long size = 0;
if (info != null && info.applicationInfo != null) {
@@ -723,6 +726,8 @@ public final class BackgroundDexOptService {
return optimizePackages(pkgs, lowStorageThreshold, updatedPackages, isPostBootUpdate);
} finally {
// Always let the pinner service know about changes.
// TODO(b/251903639): ART Service does this for all dexopts, while the code below only
// runs for background jobs. We should try to make them behave the same.
notifyPinService(updatedPackages);
// Only notify IORap the primary dex opt, because we don't want to
// invalidate traces unnecessary due to b/161633001 and that it's

View File

@@ -57,8 +57,11 @@ import android.util.Log;
import android.util.Slog;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalManagerRegistry;
import com.android.server.LocalServices;
import com.android.server.PinnerService;
import com.android.server.art.ArtManagerLocal;
import com.android.server.art.DexUseManagerLocal;
import com.android.server.art.ReasonMapping;
@@ -970,6 +973,35 @@ public final class DexOptHelper {
mPm.getPackageUsage().maybeWriteAsync(mPm.mSettings.getPackagesLocked());
mPm.mCompilerStats.maybeWriteAsync();
}
if (result.getReason().equals(ReasonMapping.REASON_INACTIVE)) {
for (DexoptResult.PackageDexoptResult pkgRes : result.getPackageDexoptResults()) {
if (pkgRes.getStatus() == DexoptResult.DEXOPT_PERFORMED) {
long pkgSizeBytes = 0;
long pkgSizeBeforeBytes = 0;
for (DexoptResult.DexContainerFileDexoptResult dexRes :
pkgRes.getDexContainerFileDexoptResults()) {
long dexContainerSize = new File(dexRes.getDexContainerFile()).length();
pkgSizeBytes += dexRes.getSizeBytes() + dexContainerSize;
pkgSizeBeforeBytes += dexRes.getSizeBeforeBytes() + dexContainerSize;
}
FrameworkStatsLog.write(FrameworkStatsLog.APP_DOWNGRADED,
pkgRes.getPackageName(), pkgSizeBeforeBytes, pkgSizeBytes,
false /* aggressive */);
}
}
}
var updatedPackages = new ArraySet<String>();
for (DexoptResult.PackageDexoptResult pkgRes : result.getPackageDexoptResults()) {
if (pkgRes.hasUpdatedArtifacts()) {
updatedPackages.add(pkgRes.getPackageName());
}
}
if (!updatedPackages.isEmpty()) {
LocalServices.getService(PinnerService.class)
.update(updatedPackages, false /* force */);
}
}
}