diff options
| author | 2023-07-31 18:04:45 +0100 | |
|---|---|---|
| committer | 2023-10-10 19:01:06 +0000 | |
| commit | f71c70771b81b88d819780aef02bfe6da079fb0c (patch) | |
| tree | d790c3c60bc287d27e7e35c503712755c222fadb | |
| parent | e4f3060d07f16c1deb5b1af59ae0c64179c736bd (diff) | |
Add a field to DexoptResult to report extra status.
We'll use the field to report more status.
Bug: 290340704
Bug: 278080573
Test: atest ArtServiceTests
Change-Id: I345307d4d01d3c3b97d9bd1d07d3c3034c676271
Merged-In: I345307d4d01d3c3b97d9bd1d07d3c3034c676271
7 files changed, 56 insertions, 30 deletions
diff --git a/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java b/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java index 916988a387..49b114d427 100644 --- a/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java +++ b/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java @@ -58,8 +58,10 @@ public class BackgroundDexoptJobStatsReporter { .stream() .flatMap(packageResult -> packageResult.getDexContainerFileDexoptResults().stream()) - .anyMatch(DexoptResult - .DexContainerFileDexoptResult::isSkippedDueToStorageLow); + .anyMatch(fileResult + -> (fileResult.getExtraStatus() + & DexoptResult.EXTRA_SKIPPED_STORAGE_LOW) + != 0); if (isSkippedDueToStorageLow) { return ArtStatsLog.BACKGROUND_DEXOPT_JOB_ENDED__STATUS__STATUS_ABORT_NO_SPACE_LEFT; } diff --git a/libartservice/service/java/com/android/server/art/Dexopter.java b/libartservice/service/java/com/android/server/art/Dexopter.java index 446d9483b6..6ca388f793 100644 --- a/libartservice/service/java/com/android/server/art/Dexopter.java +++ b/libartservice/service/java/com/android/server/art/Dexopter.java @@ -165,7 +165,7 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> { long cpuTimeMs = 0; long sizeBytes = 0; long sizeBeforeBytes = 0; - boolean isSkippedDueToStorageLow = false; + @DexoptResult.DexoptResultExtraStatus int extraStatus = 0; try { var target = DexoptTarget.<DexInfoType>builder() .setDexInfo(dexInfo) @@ -196,7 +196,7 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> { && mInjector.getStorageManager().getAllocatableBytes( mPkg.getStorageUuid()) <= 0) { - isSkippedDueToStorageLow = true; + extraStatus |= DexoptResult.EXTRA_SKIPPED_STORAGE_LOW; continue; } } catch (IOException e) { @@ -239,7 +239,7 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> { } finally { var result = DexContainerFileDexoptResult.create(dexInfo.dexPath(), abi.isPrimaryAbi(), abi.name(), compilerFilter, status, wallTimeMs, - cpuTimeMs, sizeBytes, sizeBeforeBytes, isSkippedDueToStorageLow); + cpuTimeMs, sizeBytes, sizeBeforeBytes, extraStatus); Log.i(TAG, String.format("Dexopt result: [packageName = %s] %s", mPkgState.getPackageName(), result)); diff --git a/libartservice/service/java/com/android/server/art/model/DexoptResult.java b/libartservice/service/java/com/android/server/art/model/DexoptResult.java index 79f9b5f80a..66dcfe1267 100644 --- a/libartservice/service/java/com/android/server/art/model/DexoptResult.java +++ b/libartservice/service/java/com/android/server/art/model/DexoptResult.java @@ -28,6 +28,7 @@ import com.google.auto.value.AutoValue; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; import java.util.List; /** @hide */ @@ -59,6 +60,19 @@ public abstract class DexoptResult { @Retention(RetentionPolicy.SOURCE) public @interface DexoptResultStatus {} + // Possible values of {@link #DexoptResultExtraStatus}. + /** @hide */ + public static final int EXTRA_SKIPPED_STORAGE_LOW = 1 << 0; + + /** @hide */ + // clang-format off + @IntDef(flag = true, prefix = {"EXTRA_"}, value = { + EXTRA_SKIPPED_STORAGE_LOW, + }) + // clang-format on + @Retention(RetentionPolicy.SOURCE) + public @interface DexoptResultExtraStatus {} + /** @hide */ protected DexoptResult() {} @@ -125,6 +139,16 @@ public abstract class DexoptResult { throw new IllegalArgumentException("Unknown dexopt status " + status); } + /** @hide */ + @NonNull + public static String dexoptResultExtraStatusToString(@DexoptResultExtraStatus int extraStatus) { + var strs = new ArrayList<String>(); + if ((extraStatus & DexoptResult.EXTRA_SKIPPED_STORAGE_LOW) != 0) { + strs.add("EXTRA_SKIPPED_STORAGE_LOW"); + } + return String.join(", ", strs); + } + /** * Describes the result of a package. * @@ -192,10 +216,10 @@ public abstract class DexoptResult { boolean isPrimaryAbi, @NonNull String abi, @NonNull String compilerFilter, @DexoptResultStatus int status, long dex2oatWallTimeMillis, long dex2oatCpuTimeMillis, long sizeBytes, long sizeBeforeBytes, - boolean isSkippedDueToStorageLow) { + @DexoptResultExtraStatus int extraStatus) { return new AutoValue_DexoptResult_DexContainerFileDexoptResult(dexContainerFile, isPrimaryAbi, abi, compilerFilter, status, dex2oatWallTimeMillis, - dex2oatCpuTimeMillis, sizeBytes, sizeBeforeBytes, isSkippedDueToStorageLow); + dex2oatCpuTimeMillis, sizeBytes, sizeBeforeBytes, extraStatus); } /** The absolute path to the dex container file. */ @@ -250,7 +274,7 @@ public abstract class DexoptResult { public abstract long getSizeBeforeBytes(); /** @hide */ - public abstract boolean isSkippedDueToStorageLow(); + public abstract @DexoptResultExtraStatus int getExtraStatus(); @Override @NonNull @@ -264,11 +288,13 @@ public abstract class DexoptResult { + "dex2oatWallTimeMillis=%d, " + "dex2oatCpuTimeMillis=%d, " + "sizeBytes=%d, " - + "sizeBeforeBytes=%d}", + + "sizeBeforeBytes=%d, " + + "extraStatus=[%s]}", getDexContainerFile(), isPrimaryAbi(), getAbi(), getActualCompilerFilter(), DexoptResult.dexoptResultStatusToString(getStatus()), getDex2oatWallTimeMillis(), getDex2oatCpuTimeMillis(), getSizeBytes(), - getSizeBeforeBytes()); + getSizeBeforeBytes(), + DexoptResult.dexoptResultExtraStatusToString(getExtraStatus())); } } } diff --git a/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java b/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java index f08035dcee..21d89e65a3 100644 --- a/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java +++ b/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java @@ -822,11 +822,11 @@ public class DexoptHelperTest { return List.of(DexContainerFileDexoptResult.create(dexPath, true /* isPrimaryAbi */, "arm64-v8a", "verify", status1, 100 /* dex2oatWallTimeMillis */, 400 /* dex2oatCpuTimeMillis */, 0 /* sizeBytes */, - 0 /* sizeBeforeBytes */, false /* isSkippedDueToStorageLow */), + 0 /* sizeBeforeBytes */, 0 /* extraStatus */), DexContainerFileDexoptResult.create(dexPath, false /* isPrimaryAbi */, "armeabi-v7a", "verify", status2, 100 /* dex2oatWallTimeMillis */, 400 /* dex2oatCpuTimeMillis */, 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */)); + 0 /* extraStatus */)); } private void checkPackageResult(DexoptResult result, int index, String packageName, diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java index 46db32f808..fe9584797e 100644 --- a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java +++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java @@ -280,25 +280,23 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase { mParams.mExpectedCompilerFilter, DexoptResult.DEXOPT_PERFORMED, 100 /* dex2oatWallTimeMillis */, 400 /* dex2oatCpuTimeMillis */, 30000 /* sizeBytes */, 32000 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */), + 0 /* extraStatus */), DexContainerFileDexoptResult.create("/data/app/foo/base.apk", false /* isPrimaryAbi */, "armeabi-v7a", mParams.mExpectedCompilerFilter, DexoptResult.DEXOPT_FAILED, 0 /* dex2oatWallTimeMillis */, 0 /* dex2oatCpuTimeMillis */, - 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */), + 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, 0 /* extraStatus */), DexContainerFileDexoptResult.create("/data/app/foo/split_0.apk", true /* isPrimaryAbi */, "arm64-v8a", mParams.mExpectedCompilerFilter, DexoptResult.DEXOPT_SKIPPED, 0 /* dex2oatWallTimeMillis */, 0 /* dex2oatCpuTimeMillis */, - 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */), + 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, 0 /* extraStatus */), DexContainerFileDexoptResult.create("/data/app/foo/split_0.apk", false /* isPrimaryAbi */, "armeabi-v7a", mParams.mExpectedCompilerFilter, DexoptResult.DEXOPT_PERFORMED, 200 /* dex2oatWallTimeMillis */, 200 /* dex2oatCpuTimeMillis */, 10000 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */)); + 0 /* extraStatus */)); // Verify that there are no more calls than the ones above. verify(mArtd, times(3)) diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java index f02ebf0603..ad5f7be1ad 100644 --- a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java +++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java @@ -609,13 +609,17 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase { List<DexContainerFileDexoptResult> results = mPrimaryDexopter.dexopt(); assertThat(results.get(0).getStatus()).isEqualTo(DexoptResult.DEXOPT_PERFORMED); - assertThat(results.get(0).isSkippedDueToStorageLow()).isFalse(); + assertThat(results.get(0).getExtraStatus() & DexoptResult.EXTRA_SKIPPED_STORAGE_LOW) + .isEqualTo(0); assertThat(results.get(1).getStatus()).isEqualTo(DexoptResult.DEXOPT_SKIPPED); - assertThat(results.get(1).isSkippedDueToStorageLow()).isTrue(); + assertThat(results.get(1).getExtraStatus() & DexoptResult.EXTRA_SKIPPED_STORAGE_LOW) + .isNotEqualTo(0); assertThat(results.get(2).getStatus()).isEqualTo(DexoptResult.DEXOPT_SKIPPED); - assertThat(results.get(2).isSkippedDueToStorageLow()).isTrue(); + assertThat(results.get(2).getExtraStatus() & DexoptResult.EXTRA_SKIPPED_STORAGE_LOW) + .isNotEqualTo(0); assertThat(results.get(3).getStatus()).isEqualTo(DexoptResult.DEXOPT_PERFORMED); - assertThat(results.get(3).isSkippedDueToStorageLow()).isFalse(); + assertThat(results.get(3).getExtraStatus() & DexoptResult.EXTRA_SKIPPED_STORAGE_LOW) + .isEqualTo(0); verify(mArtd, times(2)) .dexopt(any(), any(), any(), any(), any(), any(), any(), any(), anyInt(), any(), diff --git a/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java b/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java index 5d8661fa05..71069c5714 100644 --- a/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java +++ b/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java @@ -167,23 +167,19 @@ public class SecondaryDexopterTest { DexContainerFileDexoptResult.create(DEX_1, true /* isPrimaryAbi */, "arm64-v8a", "speed-profile", DexoptResult.DEXOPT_PERFORMED, 0 /* dex2oatWallTimeMillis */, 0 /* dex2oatCpuTimeMillis */, - 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */), + 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, 0 /* extraStatus */), DexContainerFileDexoptResult.create(DEX_2, true /* isPrimaryAbi */, "arm64-v8a", "speed", DexoptResult.DEXOPT_PERFORMED, 0 /* dex2oatWallTimeMillis */, 0 /* dex2oatCpuTimeMillis */, - 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */), + 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, 0 /* extraStatus */), DexContainerFileDexoptResult.create(DEX_2, false /* isPrimaryAbi */, "armeabi-v7a", "speed", DexoptResult.DEXOPT_PERFORMED, 0 /* dex2oatWallTimeMillis */, 0 /* dex2oatCpuTimeMillis */, - 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */), + 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, 0 /* extraStatus */), DexContainerFileDexoptResult.create(DEX_3, true /* isPrimaryAbi */, "arm64-v8a", "verify", DexoptResult.DEXOPT_PERFORMED, 0 /* dex2oatWallTimeMillis */, 0 /* dex2oatCpuTimeMillis */, - 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, - false /* isSkippedDueToStorageLow */)); + 0 /* sizeBytes */, 0 /* sizeBeforeBytes */, 0 /* extraStatus */)); // It should use profile for dex 1. |