diff options
| author | 2023-02-28 08:37:32 -0800 | |
|---|---|---|
| committer | 2023-02-28 10:38:40 -0800 | |
| commit | a6825bd0ac436586ac76ade3b9dc913b5e383a25 (patch) | |
| tree | 7aff0b736b523cae56490446cc2c2a6daecb290d | |
| parent | 42e1e6d76e03d3b70e2dc9a1c392cbff852719fd (diff) | |
[pm/metrics] add dexopt latency to the metrics
Only added to the code path where the ArtService is enabled (which will
happen in U). Currently, to test this, enabled ArtService manually by
`adb shell setprop dalvik.vm.useartservice true && adb reboot`.
Test: manual with `statsd_testdrive 524`
BUG: 270585621
Change-Id: I040a6168a9018a83171c44112c5847cc5a0c69c0
3 files changed, 40 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index a868470b0042..7fe6c7d5aa93 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 46ea010d9aaa..95e790450724 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 fe014a499073..80d6ebbd90b3 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<int[], long[]> getInstallStepDurations() { ArrayList<Integer> 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; } |