Merge "Bump WEAR_WATCHFACE to 1.2.0-alpha08" into androidx-main
diff --git a/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/consumer/BaselineProfileConsumerPluginTest.kt b/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/consumer/BaselineProfileConsumerPluginTest.kt
index 079ca31..69455db 100644
--- a/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/consumer/BaselineProfileConsumerPluginTest.kt
+++ b/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/consumer/BaselineProfileConsumerPluginTest.kt
@@ -63,6 +63,11 @@
"src/$variantName/$EXPECTED_PROFILE_FOLDER/startup-prof.txt"
)
+ private fun mergedArtProfile(variantName: String) = File(
+ projectSetup.consumer.rootDir,
+ "build/intermediates/merged_art_profile/$variantName/baseline-prof.txt"
+ )
+
private fun readBaselineProfileFileContent(variantName: String): List<String> =
baselineProfileFile(variantName).readLines()
@@ -380,9 +385,10 @@
.build()
// In the final output there should be :
- // - one single file in src/main/generatedBaselineProfiles because merge = `all`.
+ // - one single file in src/main/generated/baselineProfiles (because this is a library).
// - There should be only the Utils class [CLASS_2] because of the include filter.
- // - The method `someOtherMethod` [CLASS_2_METHOD_3] should be included only once.
+ // - The method `someOtherMethod` [CLASS_2_METHOD_3] should be included only once
+ // (despite being included multiple times with different flags).
assertThat(readBaselineProfileFileContent("main"))
.containsExactly(
Fixtures.CLASS_2,
@@ -393,6 +399,66 @@
}
@Test
+ fun testFilterPerVariant() {
+ projectSetup.consumer.setup(
+ androidPlugin = ANDROID_APPLICATION_PLUGIN,
+ flavors = true,
+ baselineProfileBlock = """
+ filter {
+ include("com.sample.Activity")
+ }
+ variants {
+ freeRelease {
+ filter { include("com.sample.Utils") }
+ }
+ paidRelease {
+ filter { include("com.sample.Fragment") }
+ }
+ }
+ """.trimIndent()
+ )
+
+ val commonProfile = listOf(
+ Fixtures.CLASS_1,
+ Fixtures.CLASS_1_METHOD_1,
+ Fixtures.CLASS_1_METHOD_2,
+ Fixtures.CLASS_2,
+ Fixtures.CLASS_2_METHOD_1,
+ Fixtures.CLASS_2_METHOD_2,
+ Fixtures.CLASS_2_METHOD_3,
+ Fixtures.CLASS_3,
+ Fixtures.CLASS_3_METHOD_1,
+ )
+ projectSetup.producer.setupWithFreeAndPaidFlavors(
+ freeReleaseProfileLines = commonProfile,
+ paidReleaseProfileLines = commonProfile,
+ )
+
+ gradleRunner
+ .withArguments("generateBaselineProfile", "--stacktrace")
+ .build()
+
+ assertThat(readBaselineProfileFileContent("freeRelease"))
+ .containsExactly(
+ Fixtures.CLASS_1,
+ Fixtures.CLASS_1_METHOD_1,
+ Fixtures.CLASS_1_METHOD_2,
+ Fixtures.CLASS_2,
+ Fixtures.CLASS_2_METHOD_1,
+ Fixtures.CLASS_2_METHOD_2,
+ Fixtures.CLASS_2_METHOD_3,
+ )
+ assertThat(readBaselineProfileFileContent("paidRelease"))
+ .containsExactly(
+ Fixtures.CLASS_1,
+ Fixtures.CLASS_1_METHOD_1,
+ Fixtures.CLASS_1_METHOD_2,
+ Fixtures.CLASS_3,
+ Fixtures.CLASS_3_METHOD_1,
+ )
+ }
+
+ @Test
fun testSaveInSrcTrueAndAutomaticGenerationDuringBuildTrue() {
projectSetup.consumer.setup(
androidPlugin = ANDROID_APPLICATION_PLUGIN,
@@ -894,6 +960,57 @@
)
)
}
+
+ @Test
+ fun testBaselineProfileIsInMergeArtProfileIntermediate() {
+ projectSetup.consumer.setup(
+ androidPlugin = ANDROID_APPLICATION_PLUGIN,
+ flavors = true,
+ baselineProfileBlock = """
+ saveInSrc = true
+ automaticGenerationDuringBuild = true
+ """.trimIndent()
+ )
+
+ data class VariantAndProfile(val variantName: String, val profile: List<String>)
+
+ val freeRelease = VariantAndProfile(
+ variantName = "freeRelease",
+ profile = listOf(
+ Fixtures.CLASS_1,
+ Fixtures.CLASS_1_METHOD_1,
+ Fixtures.CLASS_1_METHOD_2,
+ Fixtures.CLASS_3,
+ Fixtures.CLASS_3_METHOD_1,
+ )
+ )
+ val paidRelease = VariantAndProfile(
+ variantName = "paidRelease",
+ profile = listOf(
+ Fixtures.CLASS_1,
+ Fixtures.CLASS_1_METHOD_1,
+ Fixtures.CLASS_1_METHOD_2,
+ Fixtures.CLASS_2,
+ Fixtures.CLASS_2_METHOD_1,
+ Fixtures.CLASS_2_METHOD_2,
+ Fixtures.CLASS_2_METHOD_3,
+ )
+ )
+ projectSetup.producer.setupWithFreeAndPaidFlavors(
+ freeReleaseProfileLines = freeRelease.profile,
+ paidReleaseProfileLines = paidRelease.profile,
+ )
+
+ gradleRunner
+ .build("mergeFreeReleaseArtProfile", "mergePaidReleaseArtProfile") {}
+
+ arrayOf(freeRelease, paidRelease).forEach {
+ val notFound = mergedArtProfile(it.variantName)
+ .readLines()
+ .require(*(it.profile).toTypedArray())
+ assertThat(notFound).isEmpty()
+ }
+ }
}
@RunWith(JUnit4::class)
diff --git a/benchmark/integration-tests/baselineprofile-consumer/build.gradle b/benchmark/integration-tests/baselineprofile-consumer/build.gradle
index c9b6fbc1..64258f7 100644
--- a/benchmark/integration-tests/baselineprofile-consumer/build.gradle
+++ b/benchmark/integration-tests/baselineprofile-consumer/build.gradle
@@ -1,3 +1,5 @@
+import com.android.build.api.artifact.SingleArtifact
+
/*
* Copyright 2022 The Android Open Source Project
*
@@ -35,14 +37,11 @@
dependencies {
implementation(libs.kotlinStdlib)
implementation(libs.constraintLayout)
+ implementation(project(":profileinstaller:profileinstaller"))
baselineProfile(project(":benchmark:integration-tests:baselineprofile-producer"))
}
baselineProfile {
- filter {
- include "androidx.benchmark.integration.baselineprofile.consumer.**"
- }
-
// Note that these are the default settings, just reported here to make it explicit.
// `automaticGenerationDuringBuild` has to be off otherwise assembling release on CI would
// trigger baseline profile generation and integration tests on device.
@@ -51,3 +50,25 @@
}
apply(from: "../baselineprofile-test-utils/utils.gradle")
+
+// Exposes the apk for profile verifier tests. When calling this function, the generated apks
+// can be utilized with `profileinstaller:integration-tests:profile-verification`.
+configurations {
+ apkAssets {
+ canBeConsumed = true
+ canBeResolved = false
+ attributes {
+ attribute(
+ LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE,
+ objects.named(LibraryElements, 'profileverification-apkAssets')
+ )
+ }
+ }
+}
+androidComponents {
+ onVariants(selector().all().withBuildType("release"), { variant ->
+ artifacts {
+ apkAssets(variant.artifacts.get(SingleArtifact.APK.INSTANCE))
+ }
+ })
+}
diff --git a/benchmark/integration-tests/baselineprofile-consumer/src/main/AndroidManifest.xml b/benchmark/integration-tests/baselineprofile-consumer/src/main/AndroidManifest.xml
index b05fc1c..8a03752 100644
--- a/benchmark/integration-tests/baselineprofile-consumer/src/main/AndroidManifest.xml
+++ b/benchmark/integration-tests/baselineprofile-consumer/src/main/AndroidManifest.xml
@@ -20,7 +20,6 @@
android:allowBackup="false"
android:label="Jetpack Baselineprofiles Target"
android:supportsRtl="true"
- android:theme="@style/Theme.AppCompat"
tools:ignore="MissingApplicationIcon">
<activity
diff --git a/benchmark/integration-tests/baselineprofile-consumer/src/main/java/androidx/benchmark/integration/baselineprofile/consumer/EmptyActivity.kt b/benchmark/integration-tests/baselineprofile-consumer/src/main/java/androidx/benchmark/integration/baselineprofile/consumer/EmptyActivity.kt
index 6e88199..f614d57 100644
--- a/benchmark/integration-tests/baselineprofile-consumer/src/main/java/androidx/benchmark/integration/baselineprofile/consumer/EmptyActivity.kt
+++ b/benchmark/integration-tests/baselineprofile-consumer/src/main/java/androidx/benchmark/integration/baselineprofile/consumer/EmptyActivity.kt
@@ -19,11 +19,27 @@
import android.app.Activity
import android.os.Bundle
import android.widget.TextView
+import androidx.profileinstaller.ProfileVerifier
+import java.util.concurrent.Executors
class EmptyActivity : Activity() {
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- findViewById<TextView>(R.id.txtNotice).setText(R.string.app_notice)
+ }
+
+ override fun onResume() {
+ super.onResume()
+ Executors.newSingleThreadExecutor().submit {
+ val result = ProfileVerifier.getCompilationStatusAsync().get()
+ runOnUiThread {
+ findViewById<TextView>(R.id.txtNotice).text = """
+ Profile installed: ${result.profileInstallResultCode}
+ Has reference profile: ${result.isCompiledWithProfile}
+ Has current profile: ${result.hasProfileEnqueuedForCompilation()}
+ """.trimIndent()
+ }
+ }
}
}
diff --git a/benchmark/integration-tests/baselineprofile-consumer/src/release/generated/baselineProfiles/expected-baseline-prof.txt b/benchmark/integration-tests/baselineprofile-consumer/src/release/generated/baselineProfiles/expected-baseline-prof.txt
index aa55e97..59b9c7d 100644
--- a/benchmark/integration-tests/baselineprofile-consumer/src/release/generated/baselineProfiles/expected-baseline-prof.txt
+++ b/benchmark/integration-tests/baselineprofile-consumer/src/release/generated/baselineProfiles/expected-baseline-prof.txt
@@ -1,3 +1,272 @@
+Landroidx/appcompat/view/menu/MenuPresenter$Callback;
+Landroidx/appcompat/widget/TintTypedArray;
+HSPLandroidx/appcompat/widget/TintTypedArray;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V
+HSPLandroidx/appcompat/widget/TintTypedArray;->measure(Landroidx/constraintlayout/widget/ConstraintLayout$Measurer;Landroidx/constraintlayout/solver/widgets/ConstraintWidget;Z)Z
+HSPLandroidx/appcompat/widget/TintTypedArray;->solveLinearSystem(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;II)V
Landroidx/benchmark/integration/baselineprofile/consumer/EmptyActivity;
HSPLandroidx/benchmark/integration/baselineprofile/consumer/EmptyActivity;-><init>()V
-HSPLandroidx/benchmark/integration/baselineprofile/consumer/EmptyActivity;->onCreate(Landroid/os/Bundle;)V
\ No newline at end of file
+HSPLandroidx/benchmark/integration/baselineprofile/consumer/EmptyActivity;->onCreate(Landroid/os/Bundle;)V
+HSPLandroidx/benchmark/integration/baselineprofile/consumer/EmptyActivity;->onResume()V
+Landroidx/collection/ArrayMap$1;
+HSPLandroidx/collection/ArrayMap$1;-><init>()V
+Landroidx/concurrent/futures/AbstractResolvableFuture;
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture;-><clinit>()V
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture;-><init>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture;->complete(Landroidx/concurrent/futures/AbstractResolvableFuture;)V
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture;->get()Ljava/lang/Object;
+PLandroidx/concurrent/futures/AbstractResolvableFuture;->getDoneValue(Ljava/lang/Object;)Ljava/lang/Object;
+Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;
+PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;-><clinit>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;-><init>()V
+Landroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;-><init>(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;)V
+PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casListeners(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;)Z
+PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casValue(Landroidx/concurrent/futures/AbstractResolvableFuture;Ljava/lang/Object;Ljava/lang/Object;)Z
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casWaiters(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;)Z
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->putNext(Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;)V
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->putThread(Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;Ljava/lang/Thread;)V
+Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;-><clinit>()V
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;-><init>()V
+HSPLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;-><init>(I)V
+Landroidx/concurrent/futures/ResolvableFuture;
+HSPLandroidx/concurrent/futures/ResolvableFuture;-><init>()V
+Landroidx/constraintlayout/solver/ArrayLinkedVariables;
+HSPLandroidx/constraintlayout/solver/ArrayLinkedVariables;-><init>(Landroidx/constraintlayout/solver/ArrayRow;Landroidx/collection/ArrayMap$1;)V
+Landroidx/constraintlayout/solver/ArrayRow;
+HSPLandroidx/constraintlayout/solver/ArrayRow;-><init>()V
+HSPLandroidx/constraintlayout/solver/ArrayRow;-><init>(Landroidx/collection/ArrayMap$1;)V
+HSPLandroidx/constraintlayout/solver/ArrayRow;->addError(Landroidx/constraintlayout/solver/LinearSystem;I)V
+HSPLandroidx/constraintlayout/solver/ArrayRow;->createRowGreaterThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;I)V
+HSPLandroidx/constraintlayout/solver/ArrayRow;->createRowLowerThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;I)V
+HSPLandroidx/constraintlayout/solver/ArrayRow;->pivot(Landroidx/constraintlayout/solver/SolverVariable;)V
+HSPLandroidx/constraintlayout/solver/ArrayRow;->reset()V
+HSPLandroidx/constraintlayout/solver/ArrayRow;->updateFromFinalVariable(Landroidx/constraintlayout/solver/SolverVariable;Z)V
+HSPLandroidx/constraintlayout/solver/ArrayRow;->updateFromRow(Landroidx/constraintlayout/solver/ArrayRow;Z)V
+Landroidx/constraintlayout/solver/ArrayRow$ArrayRowVariables;
+Landroidx/constraintlayout/solver/LinearSystem;
+HSPLandroidx/constraintlayout/solver/LinearSystem;-><init>()V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->acquireSolverVariable$enumunboxing$(I)Landroidx/constraintlayout/solver/SolverVariable;
+HSPLandroidx/constraintlayout/solver/LinearSystem;->addCentering(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;IFLandroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->addConstraint(Landroidx/constraintlayout/solver/ArrayRow;)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->addEquality(Landroidx/constraintlayout/solver/SolverVariable;I)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->addEquality(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->addGreaterThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->addLowerThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->addRow(Landroidx/constraintlayout/solver/ArrayRow;)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->createErrorVariable(I)Landroidx/constraintlayout/solver/SolverVariable;
+HSPLandroidx/constraintlayout/solver/LinearSystem;->createObjectVariable(Ljava/lang/Object;)Landroidx/constraintlayout/solver/SolverVariable;
+HSPLandroidx/constraintlayout/solver/LinearSystem;->createRow()Landroidx/constraintlayout/solver/ArrayRow;
+HSPLandroidx/constraintlayout/solver/LinearSystem;->createSlackVariable()Landroidx/constraintlayout/solver/SolverVariable;
+HSPLandroidx/constraintlayout/solver/LinearSystem;->getObjectVariableValue(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;)I
+HSPLandroidx/constraintlayout/solver/LinearSystem;->increaseTableSize()V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->optimize(Landroidx/constraintlayout/solver/ArrayRow;)V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->releaseRows()V
+HSPLandroidx/constraintlayout/solver/LinearSystem;->reset()V
+Landroidx/constraintlayout/solver/LinearSystem$ValuesRow;
+HSPLandroidx/constraintlayout/solver/LinearSystem$ValuesRow;-><init>(Landroidx/collection/ArrayMap$1;)V
+Landroidx/constraintlayout/solver/Pools$SimplePool;
+HSPLandroidx/constraintlayout/solver/Pools$SimplePool;-><init>()V
+HSPLandroidx/constraintlayout/solver/Pools$SimplePool;->acquire()Ljava/lang/Object;
+HSPLandroidx/constraintlayout/solver/Pools$SimplePool;->release(Landroidx/constraintlayout/solver/ArrayRow;)V
+Landroidx/constraintlayout/solver/PriorityGoalRow;
+HSPLandroidx/constraintlayout/solver/PriorityGoalRow;-><init>(Landroidx/collection/ArrayMap$1;)V
+HSPLandroidx/constraintlayout/solver/PriorityGoalRow;->addToGoal(Landroidx/constraintlayout/solver/SolverVariable;)V
+HSPLandroidx/constraintlayout/solver/PriorityGoalRow;->getPivotCandidate([Z)Landroidx/constraintlayout/solver/SolverVariable;
+HSPLandroidx/constraintlayout/solver/PriorityGoalRow;->removeGoal(Landroidx/constraintlayout/solver/SolverVariable;)V
+HSPLandroidx/constraintlayout/solver/PriorityGoalRow;->updateFromRow(Landroidx/constraintlayout/solver/ArrayRow;Z)V
+Landroidx/constraintlayout/solver/PriorityGoalRow$GoalVariableAccessor;
+HSPLandroidx/constraintlayout/solver/PriorityGoalRow$GoalVariableAccessor;-><init>(Landroidx/constraintlayout/solver/PriorityGoalRow;)V
+Landroidx/constraintlayout/solver/SolverVariable;
+HSPLandroidx/constraintlayout/solver/SolverVariable;-><init>(I)V
+HSPLandroidx/constraintlayout/solver/SolverVariable;->addToRow(Landroidx/constraintlayout/solver/ArrayRow;)V
+HSPLandroidx/constraintlayout/solver/SolverVariable;->removeFromRow(Landroidx/constraintlayout/solver/ArrayRow;)V
+HSPLandroidx/constraintlayout/solver/SolverVariable;->reset()V
+HSPLandroidx/constraintlayout/solver/SolverVariable;->updateReferencesWithNewDefinition(Landroidx/constraintlayout/solver/ArrayRow;)V
+Landroidx/constraintlayout/solver/SolverVariable$Type$EnumUnboxingSharedUtility;
+HSPLandroidx/constraintlayout/solver/SolverVariable$Type$EnumUnboxingSharedUtility;-><clinit>()V
+HSPLandroidx/constraintlayout/solver/SolverVariable$Type$EnumUnboxingSharedUtility;->ordinal(I)I
+Landroidx/constraintlayout/solver/SolverVariableValues;
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;-><init>(Landroidx/constraintlayout/solver/ArrayRow;Landroidx/collection/ArrayMap$1;)V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->add(Landroidx/constraintlayout/solver/SolverVariable;FZ)V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->addToHashMap(Landroidx/constraintlayout/solver/SolverVariable;I)V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->addVariable(ILandroidx/constraintlayout/solver/SolverVariable;F)V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->clear()V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->divideByAmount(F)V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->get(Landroidx/constraintlayout/solver/SolverVariable;)F
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->getCurrentSize()I
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->getVariable(I)Landroidx/constraintlayout/solver/SolverVariable;
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->getVariableValue(I)F
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->indexOf(Landroidx/constraintlayout/solver/SolverVariable;)I
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->invert()V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->put(Landroidx/constraintlayout/solver/SolverVariable;F)V
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->remove(Landroidx/constraintlayout/solver/SolverVariable;Z)F
+HSPLandroidx/constraintlayout/solver/SolverVariableValues;->use(Landroidx/constraintlayout/solver/ArrayRow;Z)F
+Landroidx/constraintlayout/solver/widgets/Barrier;
+Landroidx/constraintlayout/solver/widgets/ChainHead;
+Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->connect(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;II)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->getMargin()I
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->isConnected()Z
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->reset()V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->resetSolverVariable()V
+Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;-><clinit>()V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;-><init>(ILjava/lang/String;)V
+Landroidx/constraintlayout/solver/widgets/ConstraintWidget;
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;-><init>()V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->addToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->applyConstraints$enumunboxing$(Landroidx/constraintlayout/solver/LinearSystem;ZZZZLandroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;IZLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;IIIIFZZZZIIIIFZ)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->createObjectVariables(Landroidx/constraintlayout/solver/LinearSystem;)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getAnchor(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getDimensionBehaviour$enumunboxing$(I)I
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getHeight()I
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getWidth()I
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getX()I
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getY()I
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->immediateConnect(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;Landroidx/constraintlayout/solver/widgets/ConstraintWidget;Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;II)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isChainHead(I)Z
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isInHorizontalChain()Z
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isInVerticalChain()Z
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->reset()V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->resetSolverVariables(Landroidx/collection/ArrayMap$1;)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setHeight(I)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setHorizontalDimensionBehaviour$enumunboxing$(I)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setVerticalDimensionBehaviour$enumunboxing$(I)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setWidth(I)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->updateFromSolver(Landroidx/constraintlayout/solver/LinearSystem;)V
+Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;-><init>()V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->addChildrenToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->layout()V
+HSPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->resetSolverVariables(Landroidx/collection/ArrayMap$1;)V
+Landroidx/constraintlayout/solver/widgets/Guideline;
+Landroidx/constraintlayout/solver/widgets/Helper;
+Landroidx/constraintlayout/solver/widgets/HelperWidget;
+Landroidx/constraintlayout/solver/widgets/analyzer/BasicMeasure$Measure;
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/BasicMeasure$Measure;-><init>()V
+Landroidx/constraintlayout/solver/widgets/analyzer/Dependency;
+Landroidx/constraintlayout/solver/widgets/analyzer/DependencyGraph;
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/DependencyGraph;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V
+Landroidx/constraintlayout/solver/widgets/analyzer/DependencyNode;
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/DependencyNode;-><init>(Landroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;)V
+Landroidx/constraintlayout/solver/widgets/analyzer/DimensionDependency;
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/DimensionDependency;-><init>(Landroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;)V
+Landroidx/constraintlayout/solver/widgets/analyzer/HorizontalWidgetRun;
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/HorizontalWidgetRun;-><clinit>()V
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/HorizontalWidgetRun;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V
+Landroidx/constraintlayout/solver/widgets/analyzer/VerticalWidgetRun;
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/VerticalWidgetRun;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V
+Landroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;
+HSPLandroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V
+Landroidx/constraintlayout/widget/ConstraintHelper;
+Landroidx/constraintlayout/widget/ConstraintLayout;
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->applyConstraintsFromLayoutParams(ZLandroid/view/View;Landroidx/constraintlayout/solver/widgets/ConstraintWidget;Landroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;Landroid/util/SparseArray;)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->dispatchDraw(Landroid/graphics/Canvas;)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->getPaddingWidth()I
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->getViewWidget(Landroid/view/View;)Landroidx/constraintlayout/solver/widgets/ConstraintWidget;
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->isRtl()Z
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->onLayout(ZIIII)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->onMeasure(II)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->onViewAdded(Landroid/view/View;)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->requestLayout()V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout;->updateHierarchy()Z
+Landroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;
+HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->resolveLayoutDirection(I)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->validate()V
+Landroidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table;
+HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table;-><clinit>()V
+Landroidx/constraintlayout/widget/ConstraintLayout$Measurer;
+HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;-><init>(Landroidx/constraintlayout/widget/ConstraintLayout;)V
+HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->measure(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;Landroidx/constraintlayout/solver/widgets/analyzer/BasicMeasure$Measure;)V
+Landroidx/constraintlayout/widget/Guideline;
+Landroidx/constraintlayout/widget/R$styleable;
+HSPLandroidx/constraintlayout/widget/R$styleable;-><clinit>()V
+Landroidx/core/app/CoreComponentFactory;
+HSPLandroidx/core/app/CoreComponentFactory;-><init>()V
+HSPLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
+HSPLandroidx/core/app/CoreComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application;
+HSPLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider;
+PLandroidx/core/app/CoreComponentFactory;->instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver;
+Landroidx/core/view/ViewCompat$$ExternalSyntheticApiModelOutline2;
+HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticApiModelOutline2;->m()Landroid/view/Choreographer;
+HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/Choreographer;Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda2;)V
+Landroidx/core/view/ViewCompat$3$$ExternalSyntheticApiModelOutline0;
+HSPLandroidx/core/view/ViewCompat$3$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Looper;)Landroid/os/Handler;
+PLandroidx/profileinstaller/ProfileInstallReceiver;-><init>()V
+PLandroidx/profileinstaller/ProfileInstallReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;-><init>(I)V
+Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;
+Landroidx/profileinstaller/ProfileInstallerInitializer;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer;-><init>()V
+Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->run()V
+Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;-><init>(Landroid/content/Context;I)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->run()V
+Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;->postFrameCallback(Ljava/lang/Runnable;)V
+Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda2;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda2;-><init>(Ljava/lang/Runnable;)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda2;->doFrame(J)V
+Landroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler;
+Landroidx/profileinstaller/ProfileVerifier;
+HSPLandroidx/profileinstaller/ProfileVerifier;-><clinit>()V
+PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus(IZZ)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus;
+PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)V
+PLandroidx/profileinstaller/ProfileVerifier$Api33Impl;->getPackageInfo(Landroid/content/pm/PackageManager;Landroid/content/Context;)Landroid/content/pm/PackageInfo;
+PLandroidx/profileinstaller/ProfileVerifier$Api33Impl$$ExternalSyntheticApiModelOutline0;->m()Landroid/content/pm/PackageManager$PackageInfoFlags;
+PLandroidx/profileinstaller/ProfileVerifier$Api33Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo;
+PLandroidx/profileinstaller/ProfileVerifier$Cache;-><init>(IIJJ)V
+PLandroidx/profileinstaller/ProfileVerifier$Cache;->equals(Ljava/lang/Object;)Z
+PLandroidx/profileinstaller/ProfileVerifier$Cache;->readFromFile(Ljava/io/File;)Landroidx/profileinstaller/ProfileVerifier$Cache;
+PLandroidx/profileinstaller/ProfileVerifier$CompilationStatus;-><init>(IZZ)V
+Landroidx/startup/AppInitializer;
+HSPLandroidx/startup/AppInitializer;-><clinit>()V
+HSPLandroidx/startup/AppInitializer;-><init>(Landroid/content/Context;)V
+HSPLandroidx/startup/AppInitializer;->discoverAndInitialize(Landroid/os/Bundle;)V
+HSPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/HashSet;)V
+Landroidx/startup/InitializationProvider;
+HSPLandroidx/startup/InitializationProvider;-><init>()V
+HSPLandroidx/startup/InitializationProvider;->onCreate()Z
+Landroidx/tracing/Trace;
+HSPLandroidx/tracing/Trace;->isEnabled()Z
+Landroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;
+HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m()Z
+Landroidx/tracing/TraceApi18Impl$$ExternalSyntheticApiModelOutline0;
+HSPLandroidx/tracing/TraceApi18Impl$$ExternalSyntheticApiModelOutline0;->m()V
+HSPLandroidx/tracing/TraceApi18Impl$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;)V
+PLkotlin/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+Lkotlin/TuplesKt;
+HSPLkotlin/TuplesKt;-><clinit>()V
+HSPLkotlin/TuplesKt;-><init>(Ljava/lang/Object;)V
+PLkotlin/TuplesKt;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V
+HSPLkotlin/TuplesKt;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V
+PLkotlin/TuplesKt;->writeProfile(Landroid/content/Context;Landroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V
+PLkotlin/jvm/internal/Lambda;-><init>()V
+PLkotlin/ranges/IntProgression;-><init>(III)V
+PLkotlin/ranges/IntProgression;->iterator()Ljava/util/Iterator;
+PLkotlin/ranges/IntProgressionIterator;-><init>(III)V
+PLkotlin/ranges/IntRange;-><clinit>()V
+PLkotlin/ranges/IntRange;-><init>(II)V
+Lkotlin/ranges/IntRange$Companion;
+HSPLkotlin/ranges/IntRange$Companion;-><init>(I)V
+PLkotlin/ranges/IntRange$Companion;->onResultReceived(ILjava/lang/Object;)V
+PLkotlin/text/DelimitedRangesSequence;-><init>(Ljava/lang/String;IILkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;)V
+PLkotlin/text/DelimitedRangesSequence;->iterator()Ljava/util/Iterator;
+PLkotlin/text/DelimitedRangesSequence$iterator$1;-><init>(Lkotlin/text/DelimitedRangesSequence;)V
+PLkotlin/text/DelimitedRangesSequence$iterator$1;->calcNext()V
+PLkotlin/text/DelimitedRangesSequence$iterator$1;->hasNext()Z
+PLkotlin/text/DelimitedRangesSequence$iterator$1;->next()Ljava/lang/Object;
+PLkotlin/text/StringsKt__StringsKt;->isBlank(Ljava/lang/String;)Z
+PLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;-><init>(Ljava/util/List;Z)V
+PLkotlin/text/StringsKt__StringsKt$splitToSequence$1;-><init>(ILjava/lang/String;)V
+PLkotlin/text/StringsKt__StringsKt$splitToSequence$1;->invoke(Ljava/lang/Object;)Ljava/lang/String;
\ No newline at end of file
diff --git a/benchmark/integration-tests/baselineprofile-test-utils/utils.gradle b/benchmark/integration-tests/baselineprofile-test-utils/utils.gradle
index e1d139e..b8a42a7 100644
--- a/benchmark/integration-tests/baselineprofile-test-utils/utils.gradle
+++ b/benchmark/integration-tests/baselineprofile-test-utils/utils.gradle
@@ -1,3 +1,4 @@
+import com.android.build.api.artifact.SingleArtifact
import org.gradle.work.DisableCachingByDefault
import static androidx.baselineprofile.gradle.utils.UtilsKt.camelCase
diff --git a/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt b/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt
index d181774..b742486 100644
--- a/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt
+++ b/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt
@@ -31,7 +31,6 @@
override fun onResume() {
super.onResume()
-
Executors.newSingleThreadExecutor().submit {
val result = ProfileVerifier.writeProfileVerification(this)
runOnUiThread {
diff --git a/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt b/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt
index 49967ca..fd1a1e1 100644
--- a/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt
+++ b/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt
@@ -31,7 +31,6 @@
override fun onResume() {
super.onResume()
-
Executors.newSingleThreadExecutor().submit {
val result = ProfileVerifier.getCompilationStatusAsync().get()
runOnUiThread {
diff --git a/profileinstaller/integration-tests/profile-verification/build.gradle b/profileinstaller/integration-tests/profile-verification/build.gradle
index 5b66c38..aa13d76 100644
--- a/profileinstaller/integration-tests/profile-verification/build.gradle
+++ b/profileinstaller/integration-tests/profile-verification/build.gradle
@@ -66,6 +66,7 @@
androidTestImplementation(project(":core:core"))
apkAssets(project(":profileinstaller:integration-tests:profile-verification-sample"))
apkAssets(project(":profileinstaller:integration-tests:profile-verification-sample-no-initializer"))
+ apkAssets(project(":benchmark:integration-tests:baselineprofile-consumer"))
}
// It makes sure that the apks are generated before the assets are packed.
diff --git a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnGeneratedProfiles.kt b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnGeneratedProfiles.kt
new file mode 100644
index 0000000..a350bf7
--- /dev/null
+++ b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnGeneratedProfiles.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.profileinstaller.integration.profileverification
+
+import androidx.profileinstaller.ProfileVerifier.CompilationStatus.RESULT_CODE_COMPILED_WITH_PROFILE
+import androidx.profileinstaller.ProfileVerifier.CompilationStatus.RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION
+import androidx.profileinstaller.ProfileVersion
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import org.junit.After
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@SdkSuppress(
+ minSdkVersion = android.os.Build.VERSION_CODES.P,
+ maxSdkVersion = ProfileVersion.MAX_SUPPORTED_SDK
+)
+@RunWith(Parameterized::class)
+class ProfileVerificationOnGeneratedProfiles(
+ private val apk: String,
+ private val packageName: String
+) {
+
+ companion object {
+ private const val ACTIVITY_NAME = ".EmptyActivity"
+
+ @Parameterized.Parameters(name = "apk={0},packageName={1}")
+ @JvmStatic
+ fun parameters(): List<Array<Any>> = listOf(
+ arrayOf(
+ "baselineprofile-consumer-release.apk",
+ "androidx.benchmark.integration.baselineprofile.consumer"
+ )
+ )
+ }
+
+ @Before
+ fun setUp() {
+ // Note that this test fails on emulator api 30 (b/251540646)
+ Assume.assumeTrue(!isApi30)
+ withPackageName(packageName) { uninstall() }
+ }
+
+ @After
+ fun tearDown() {
+ withPackageName(packageName) { uninstall() }
+ }
+
+ @Test
+ fun generatedBaselineProfile() =
+ withPackageName(packageName) {
+
+ // Installs the apk
+ install(apkName = apk, withProfile = false)
+
+ // Check that a profile exists and it's enqueued for compilation
+ start(ACTIVITY_NAME)
+ evaluateUI {
+ profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION)
+ hasReferenceProfile(false)
+ hasCurrentProfile(true)
+ }
+ stop()
+
+ // Compile app with enqueued profile
+ compileCurrentProfile()
+
+ // Checks that the app has been compiled with a profile
+ start(ACTIVITY_NAME)
+ evaluateUI {
+ profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE)
+ hasReferenceProfile(true)
+ hasCurrentProfile(false)
+ }
+ }
+}