summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Songchun Fan <schfan@google.com> 2023-02-28 08:37:32 -0800
committer Songchun Fan <schfan@google.com> 2023-02-28 10:38:40 -0800
commita6825bd0ac436586ac76ade3b9dc913b5e383a25 (patch)
tree7aff0b736b523cae56490446cc2c2a6daecb290d
parent42e1e6d76e03d3b70e2dc9a1c392cbff852719fd (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
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java4
-rw-r--r--services/core/java/com/android/server/pm/InstallRequest.java26
-rw-r--r--services/core/java/com/android/server/pm/PackageMetrics.java11
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;
}