diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index a868470b0042d..7fe6c7d5aa93b 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -164,6 +164,7 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.server.EventLogTags; import com.android.server.LocalManagerRegistry; import com.android.server.art.model.DexoptParams; +import com.android.server.art.model.DexoptResult; import com.android.server.pm.Installer.LegacyDexoptDisabledException; import com.android.server.pm.dex.ArtManagerService; import com.android.server.pm.dex.DexManager; @@ -2534,8 +2535,9 @@ final class InstallPackageHelper { packageManagerLocal.withFilteredSnapshot()) { DexoptParams params = dexoptOptions.convertToDexoptParams(0 /* extraFlags */); - DexOptHelper.getArtManagerLocal().dexoptPackage( + DexoptResult dexOptResult = DexOptHelper.getArtManagerLocal().dexoptPackage( snapshot, packageName, params); + installRequest.onDexoptFinished(dexOptResult); } } else { try { diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java index 46ea010d9aaa7..95e7904507242 100644 --- a/services/core/java/com/android/server/pm/InstallRequest.java +++ b/services/core/java/com/android/server/pm/InstallRequest.java @@ -43,6 +43,7 @@ import android.util.ArrayMap; import android.util.ExceptionUtils; import android.util.Slog; +import com.android.server.art.model.DexoptResult; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; @@ -127,6 +128,8 @@ final class InstallRequest { private final int mSessionId; private final int mRequireUserAction; + private int mDexoptStatus; + // New install InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); @@ -609,6 +612,10 @@ final class InstallRequest { return mRequireUserAction; } + public int getDexoptStatus() { + return mDexoptStatus; + } + public void setScanFlags(int scanFlags) { mScanFlags = scanFlags; } @@ -799,6 +806,25 @@ final class InstallRequest { } } + public void onDexoptFinished(DexoptResult dexoptResult) { + if (mPackageMetrics == null) { + return; + } + mDexoptStatus = dexoptResult.getFinalStatus(); + if (mDexoptStatus != DexoptResult.DEXOPT_PERFORMED) { + return; + } + long durationMillis = 0; + for (DexoptResult.PackageDexoptResult packageResult : + dexoptResult.getPackageDexoptResults()) { + for (DexoptResult.DexContainerFileDexoptResult fileResult : + packageResult.getDexContainerFileDexoptResults()) { + durationMillis += fileResult.getDex2oatWallTimeMillis(); + } + } + mPackageMetrics.onStepFinished(PackageMetrics.STEP_DEXOPT, durationMillis); + } + public void onInstallCompleted() { if (getReturnCode() == INSTALL_SUCCEEDED) { if (mPackageMetrics != null) { diff --git a/services/core/java/com/android/server/pm/PackageMetrics.java b/services/core/java/com/android/server/pm/PackageMetrics.java index fe014a4990738..80d6ebbd90b3b 100644 --- a/services/core/java/com/android/server/pm/PackageMetrics.java +++ b/services/core/java/com/android/server/pm/PackageMetrics.java @@ -48,12 +48,14 @@ final class PackageMetrics { public static final int STEP_SCAN = 2; public static final int STEP_RECONCILE = 3; public static final int STEP_COMMIT = 4; + public static final int STEP_DEXOPT = 5; @IntDef(prefix = {"STEP_"}, value = { STEP_PREPARE, STEP_SCAN, STEP_RECONCILE, STEP_COMMIT, + STEP_DEXOPT }) @Retention(RetentionPolicy.SOURCE) public @interface StepInt { @@ -175,6 +177,10 @@ final class PackageMetrics { } } + public void onStepFinished(@StepInt int step, long durationMillis) { + mInstallSteps.put(step, new InstallStep(durationMillis)); + } + // List of steps (e.g., 1, 2, 3) and corresponding list of durations (e.g., 200ms, 100ms, 150ms) private Pair getInstallStepDurations() { ArrayList steps = new ArrayList<>(); @@ -203,6 +209,11 @@ final class PackageMetrics { mStartTimestampMillis = System.currentTimeMillis(); } + InstallStep(long durationMillis) { + mStartTimestampMillis = -1; + mDurationMillis = durationMillis; + } + void finish() { mDurationMillis = System.currentTimeMillis() - mStartTimestampMillis; }