Configure baseline profiles in the baselineProfile lambda (#1060)

* Configure baseline profiles in the baselineProfile lambda

* This is the correct and easiest way to set up baseline profiles correctly.
  * See b/313428246 for more context.
* Handle empty topics during baseline profile generation
* Revert to API 33 GMD and fail empty screen tests
* Rename withChildren to noChildren for better legibility
* Remove unused log tags
* Update benchmark and metrics versions
* 🤖 Updates baselines for Dependency Guard

---------

Co-authored-by: Tomáš Mlynarič <mlykotom@google.com>
Co-authored-by: Jaehwa Noh <shwoghk14@gmail.com>
pull/1350/merge
Ben Weiss 2 months ago committed by GitHub
parent 0ba430ef90
commit 7980c1d0df
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -68,7 +68,7 @@ androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.7.0 androidx.lifecycle:lifecycle-viewmodel-savedstate:2.7.0
androidx.lifecycle:lifecycle-viewmodel:2.7.0 androidx.lifecycle:lifecycle-viewmodel:2.7.0
androidx.loader:loader:1.0.0 androidx.loader:loader:1.0.0
androidx.metrics:metrics-performance:1.0.0-alpha04 androidx.metrics:metrics-performance:1.0.0-beta01
androidx.profileinstaller:profileinstaller:1.3.1 androidx.profileinstaller:profileinstaller:1.3.1
androidx.savedstate:savedstate-ktx:1.2.1 androidx.savedstate:savedstate-ktx:1.2.1
androidx.savedstate:savedstate:1.2.1 androidx.savedstate:savedstate:1.2.1

@ -52,9 +52,7 @@ android {
// To publish on the Play store a private signing key is required, but to allow anyone // To publish on the Play store a private signing key is required, but to allow anyone
// who clones the code to sign and run the release variant, use the debug signing key. // who clones the code to sign and run the release variant, use the debug signing key.
// TODO: Abstract the signing configuration to a separate file to avoid hardcoding this. // TODO: Abstract the signing configuration to a separate file to avoid hardcoding this.
signingConfig = signingConfigs.named("debug").get() signingConfig = signingConfigs.getByName("debug")
// Ensure Baseline Profile is fresh for release builds.
baselineProfile.automaticGenerationDuringBuild = true
} }
} }
@ -71,6 +69,20 @@ android {
namespace = "com.google.samples.apps.nowinandroid" namespace = "com.google.samples.apps.nowinandroid"
} }
baselineProfile {
saveInSrc = false
// Don't build on every iteration of a full assemble.
// Instead enable generation directly for the release build variant.
automaticGenerationDuringBuild = false
mergeIntoMain = true
variants {
create("release") {
// Ensure Baseline Profile is fresh for release builds.
automaticGenerationDuringBuild = true
}
}
}
dependencies { dependencies {
implementation(projects.feature.interests) implementation(projects.feature.interests)
implementation(projects.feature.foryou) implementation(projects.feature.foryou)

@ -102,7 +102,7 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.0-alpha04
androidx.lifecycle:lifecycle-viewmodel:2.8.0-alpha04 androidx.lifecycle:lifecycle-viewmodel:2.8.0-alpha04
androidx.loader:loader:1.0.0 androidx.loader:loader:1.0.0
androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
androidx.metrics:metrics-performance:1.0.0-alpha04 androidx.metrics:metrics-performance:1.0.0-beta01
androidx.navigation:navigation-common-ktx:2.7.4 androidx.navigation:navigation-common-ktx:2.7.4
androidx.navigation:navigation-common:2.7.4 androidx.navigation:navigation-common:2.7.4
androidx.navigation:navigation-compose:2.7.4 androidx.navigation:navigation-compose:2.7.4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 157 KiB

@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import com.android.build.api.dsl.ManagedVirtualDevice
import com.google.samples.apps.nowinandroid.configureFlavors import com.google.samples.apps.nowinandroid.configureFlavors
plugins { plugins {
@ -46,7 +47,7 @@ android {
} }
testOptions.managedDevices.devices { testOptions.managedDevices.devices {
create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api33") { create<ManagedVirtualDevice>("pixel6Api33") {
device = "Pixel 6" device = "Pixel 6"
apiLevel = 33 apiLevel = 33
systemImageSource = "aosp" systemImageSource = "aosp"

@ -41,6 +41,11 @@ fun MacrobenchmarkScope.forYouWaitForContent() {
*/ */
fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = false) { fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = false) {
val topics = device.findObject(By.res("forYou:topicSelection")) val topics = device.findObject(By.res("forYou:topicSelection"))
val noChildren = topics.childCount == 0
if (noChildren) {
// TODO: Ensure ForYou has topics.
fail("No topics found, can't scroll for baseline profile generation.")
}
// Set gesture margin from sides not to trigger system gesture navigation // Set gesture margin from sides not to trigger system gesture navigation
val horizontalMargin = 10 * topics.visibleBounds.width() / 100 val horizontalMargin = 10 * topics.visibleBounds.width() / 100
@ -51,9 +56,6 @@ fun MacrobenchmarkScope.forYouSelectTopics(recheckTopicsIfChecked: Boolean = fal
var visited = 0 var visited = 0
while (visited < 3) { while (visited < 3) {
if (topics.childCount == 0) {
fail("No topics found, can't generate profile for ForYou page.")
}
// Selecting some topics, which will populate items in the feed. // Selecting some topics, which will populate items in the feed.
val topic = topics.children[index % topics.childCount] val topic = topics.children[index % topics.childCount]
// Find the checkable element to figure out whether it's checked or not // Find the checkable element to figure out whether it's checked or not

@ -21,6 +21,7 @@ import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until import androidx.test.uiautomator.Until
import com.google.samples.apps.nowinandroid.flingElementDownUp import com.google.samples.apps.nowinandroid.flingElementDownUp
import com.google.samples.apps.nowinandroid.waitForObjectOnTopAppBar import com.google.samples.apps.nowinandroid.waitForObjectOnTopAppBar
import org.junit.Assert.fail
fun MacrobenchmarkScope.goToInterestsScreen() { fun MacrobenchmarkScope.goToInterestsScreen() {
device.findObject(By.text("Interests")).click() device.findObject(By.text("Interests")).click()
@ -35,7 +36,12 @@ fun MacrobenchmarkScope.goToInterestsScreen() {
fun MacrobenchmarkScope.interestsScrollTopicsDownUp() { fun MacrobenchmarkScope.interestsScrollTopicsDownUp() {
device.wait(Until.hasObject(By.res("interests:topics")), 5_000) device.wait(Until.hasObject(By.res("interests:topics")), 5_000)
val topicsList = device.findObject(By.res("interests:topics")) val topicsList = device.findObject(By.res("interests:topics"))
device.flingElementDownUp(topicsList) if (topicsList != null) {
// TODO: Ensure topics are availble.
device.flingElementDownUp(topicsList)
} else {
fail("No topics found, can't scroll during baseline profile generation.")
}
} }
fun MacrobenchmarkScope.interestsWaitForTopics() { fun MacrobenchmarkScope.interestsWaitForTopics() {

@ -18,8 +18,8 @@ androidxDataStore = "1.0.0"
androidxEspresso = "3.5.1" androidxEspresso = "3.5.1"
androidxHiltNavigationCompose = "1.2.0" androidxHiltNavigationCompose = "1.2.0"
androidxLifecycle = "2.7.0" androidxLifecycle = "2.7.0"
androidxMacroBenchmark = "1.2.2" androidxMacroBenchmark = "1.2.4"
androidxMetrics = "1.0.0-alpha04" androidxMetrics = "1.0.0-beta01"
androidxNavigation = "2.7.4" androidxNavigation = "2.7.4"
androidxProfileinstaller = "1.3.1" androidxProfileinstaller = "1.3.1"
androidxTestCore = "1.5.0" androidxTestCore = "1.5.0"

Loading…
Cancel
Save