From 103398682a37a595854f66ee79615ee124f548f4 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Fri, 20 May 2022 12:08:47 +0100 Subject: [PATCH] Add tracing library and start using it Currently tracing sync and main navigation. --- .../navigation/NiaTopLevelNavigation.kt | 25 ++++++------ core-navigation/build.gradle.kts | 1 + .../core/navigation/NavigationExtensions.kt | 39 +++++++++++++++++++ core-ui/build.gradle.kts | 1 + gradle/libs.versions.toml | 2 + sync/build.gradle.kts | 1 + .../nowinandroid/sync/workers/SyncWorker.kt | 19 +++++---- 7 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 core-navigation/src/main/java/com/google/samples/apps/nowinandroid/core/navigation/NavigationExtensions.kt diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaTopLevelNavigation.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaTopLevelNavigation.kt index f2404e88c..e76918eae 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaTopLevelNavigation.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaTopLevelNavigation.kt @@ -24,6 +24,7 @@ import androidx.compose.material.icons.outlined.Upcoming import androidx.compose.ui.graphics.vector.ImageVector import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController +import androidx.tracing.trace import com.google.samples.apps.nowinandroid.feature.foryou.R.string.for_you import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouDestination import com.google.samples.apps.nowinandroid.feature.interests.R.string.interests @@ -41,18 +42,20 @@ import com.google.samples.apps.nowinandroid.feature.interests.navigation.Interes class NiaTopLevelNavigation(private val navController: NavHostController) { fun navigateTo(destination: TopLevelDestination) { - navController.navigate(destination.route) { - // Pop up to the start destination of the graph to - // avoid building up a large stack of destinations - // on the back stack as users select items - popUpTo(navController.graph.findStartDestination().id) { - saveState = true + trace("Navigation: $destination") { + navController.navigate(destination.route) { + // Pop up to the start destination of the graph to + // avoid building up a large stack of destinations + // on the back stack as users select items + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + // Avoid multiple copies of the same destination when + // reselecting the same item + launchSingleTop = true + // Restore state when reselecting a previously selected item + restoreState = true } - // Avoid multiple copies of the same destination when - // reselecting the same item - launchSingleTop = true - // Restore state when reselecting a previously selected item - restoreState = true } } } diff --git a/core-navigation/build.gradle.kts b/core-navigation/build.gradle.kts index d9449babc..9e9ab81ae 100644 --- a/core-navigation/build.gradle.kts +++ b/core-navigation/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { api(libs.androidx.hilt.navigation.compose) api(libs.androidx.navigation.compose) + implementation(libs.androidx.tracing.ktx) implementation(libs.hilt.android) kapt(libs.hilt.compiler) } \ No newline at end of file diff --git a/core-navigation/src/main/java/com/google/samples/apps/nowinandroid/core/navigation/NavigationExtensions.kt b/core-navigation/src/main/java/com/google/samples/apps/nowinandroid/core/navigation/NavigationExtensions.kt new file mode 100644 index 000000000..cda2341a7 --- /dev/null +++ b/core-navigation/src/main/java/com/google/samples/apps/nowinandroid/core/navigation/NavigationExtensions.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2022 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 + * + * https://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 com.google.samples.apps.nowinandroid.core.navigation + +import androidx.compose.runtime.Composable +import androidx.navigation.NamedNavArgument +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavDeepLink +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import androidx.tracing.trace + +/** + * Wrapping a [NavGraphBuilder.composable] in a trace block. + */ +fun NavGraphBuilder.tracedComposable( + route: String, + arguments: List = emptyList(), + deepLinks: List = emptyList(), + content: @Composable (NavBackStackEntry) -> Unit +) { + trace("Navigation: $route") { + composable(route, arguments, deepLinks, content) + } +} diff --git a/core-ui/build.gradle.kts b/core-ui/build.gradle.kts index 7fade59be..b25eeb9eb 100644 --- a/core-ui/build.gradle.kts +++ b/core-ui/build.gradle.kts @@ -43,4 +43,5 @@ dependencies { api(libs.androidx.compose.ui.util) api(libs.androidx.compose.runtime) api(libs.androidx.compose.runtime.livedata) + api(libs.androidx.tracing.ktx) } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 101950284..c4ebe2131 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,6 +20,7 @@ androidxStartup = "1.1.1" androidxWindowManager = "1.0.0" androidxTest = "1.4.0" androidxTestExt = "1.1.2" +androidxTracing = "1.1.0" androidxUiAutomator = "2.2.0" androidxWork = "2.7.1" coil = "2.0.0-rc01" @@ -81,6 +82,7 @@ androidx-test-espresso-core = { group = "androidx.test.espresso", name = "espres androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidxTest" } androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidxTest" } androidx-test-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "androidxUiAutomator" } +androidx-tracing-ktx = {group = "androidx.tracing", name="tracing-ktx", version.ref = "androidxTracing" } androidx-work-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "androidxWork" } androidx-work-testing = { group = "androidx.work", name = "work-testing", version.ref = "androidxWork" } coil-kt = { group = "io.coil-kt", name = "coil", version.ref = "coil"} diff --git a/sync/build.gradle.kts b/sync/build.gradle.kts index 531032a9f..56db29239 100644 --- a/sync/build.gradle.kts +++ b/sync/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { implementation(libs.kotlinx.coroutines.android) + implementation(libs.androidx.tracing.ktx) implementation(libs.androidx.startup) implementation(libs.androidx.work.ktx) implementation(libs.hilt.ext.work) diff --git a/sync/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt b/sync/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt index 3f03e0b17..4ab9f9cda 100644 --- a/sync/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt +++ b/sync/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt @@ -18,6 +18,7 @@ package com.google.samples.apps.nowinandroid.sync.workers import android.content.Context import androidx.hilt.work.HiltWorker +import androidx.tracing.traceAsync import androidx.work.CoroutineWorker import androidx.work.ForegroundInfo import androidx.work.OneTimeWorkRequestBuilder @@ -59,15 +60,17 @@ class SyncWorker @AssistedInject constructor( appContext.syncForegroundInfo() override suspend fun doWork(): Result = withContext(ioDispatcher) { - // First sync the repositories in parallel - val syncedSuccessfully = awaitAll( - async { topicRepository.sync() }, - async { authorsRepository.sync() }, - async { newsRepository.sync() }, - ).all { it } + traceAsync("Sync", 0) { + // First sync the repositories in parallel + val syncedSuccessfully = awaitAll( + async { topicRepository.sync() }, + async { authorsRepository.sync() }, + async { newsRepository.sync() }, + ).all { it } - if (syncedSuccessfully) Result.success() - else Result.retry() + if (syncedSuccessfully) Result.success() + else Result.retry() + } } override suspend fun getChangeListVersions(): ChangeListVersions =