From 23bd230604e8db6876e0b39daba8f1e624a9f0a0 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 1 Dec 2025 12:27:17 +0000 Subject: [PATCH 01/12] Add snippet for enabling diagnostic stack traces Demo how to enable diagnostic stack traces in Jetpack Compose for improved debugging. The snippet shows how to conditionally enable `ComposeStackTraceMode.Auto` in the `Application.onCreate` method for debug builds, while keeping it disabled in release builds to avoid performance overhead. --- .../snippets/performance/Stacktraces.kt | 36 +++++++++++++++++++ gradle/libs.versions.toml | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt new file mode 100644 index 000000000..f7ef0aa0d --- /dev/null +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -0,0 +1,36 @@ +package com.example.compose.snippets.performance + +import android.app.Application +import androidx.compose.runtime.Composer +import androidx.compose.runtime.tooling.ComposeStackTraceMode +import com.google.maps.android.ktx.BuildConfig + +/* +* Copyright 2025 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. +*/ + +// [START android_compose_stacktraces_enable] +class SampleStackTracesEnabledApp : Application() { + + override fun onCreate() { + // Enable only for debug flavor to avoid perf regressions in release + Composer.setDiagnosticStackTraceMode(if (BuildConfig.DEBUG) { + ComposeStackTraceMode.Auto + } else { + ComposeStackTraceMode.None + }) + } +} +// [END android_compose_stacktraces_enable] \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 40c26140b..1549ac8a6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -103,7 +103,7 @@ androidx-activity-compose = { module = "androidx.activity:activity-compose", ver androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityKtx" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" } androidx-compose-animation-graphics = { module = "androidx.compose.animation:animation-graphics", version.ref = "compose-latest" } -androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "androidx-compose-bom" } +androidx-compose-bom = { module = "androidx.compose:compose-bom-alpha", version.ref = "androidx-compose-bom" } androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose-latest" } androidx-compose-foundation-layout = { module = "androidx.compose.foundation:foundation-layout", version.ref = "compose-latest" } androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "compose-latest" } From a17610b41450568f119aa81e156cbf075fce6a5d Mon Sep 17 00:00:00 2001 From: riggaroo <9973046+riggaroo@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:29:55 +0000 Subject: [PATCH 02/12] Apply Spotless --- .../snippets/performance/Stacktraces.kt | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index f7ef0aa0d..b8ccdd886 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 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.example.compose.snippets.performance import android.app.Application @@ -26,11 +42,13 @@ class SampleStackTracesEnabledApp : Application() { override fun onCreate() { // Enable only for debug flavor to avoid perf regressions in release - Composer.setDiagnosticStackTraceMode(if (BuildConfig.DEBUG) { - ComposeStackTraceMode.Auto - } else { - ComposeStackTraceMode.None - }) + Composer.setDiagnosticStackTraceMode( + if (BuildConfig.DEBUG) { + ComposeStackTraceMode.Auto + } else { + ComposeStackTraceMode.None + } + ) } } -// [END android_compose_stacktraces_enable] \ No newline at end of file +// [END android_compose_stacktraces_enable] From 6b65d45582c71b66ca834f9235685f9fcc4e74a8 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 1 Dec 2025 12:37:23 +0000 Subject: [PATCH 03/12] Set to use Auto, no debug toggle --- .../example/compose/snippets/performance/Stacktraces.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index f7ef0aa0d..5a12eff3b 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -25,12 +25,9 @@ import com.google.maps.android.ktx.BuildConfig class SampleStackTracesEnabledApp : Application() { override fun onCreate() { - // Enable only for debug flavor to avoid perf regressions in release - Composer.setDiagnosticStackTraceMode(if (BuildConfig.DEBUG) { - ComposeStackTraceMode.Auto - } else { - ComposeStackTraceMode.None - }) + // Auto mode will use GroupKeys option when the app is minified, and + // None otherwise. + Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto) } } // [END android_compose_stacktraces_enable] \ No newline at end of file From ebb784e8d71db0277cb44c013d7bc95b8cb9b34c Mon Sep 17 00:00:00 2001 From: riggaroo <9973046+riggaroo@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:40:16 +0000 Subject: [PATCH 04/12] Apply Spotless --- .../snippets/performance/Stacktraces.kt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index 5a12eff3b..07b77a35b 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -1,9 +1,24 @@ +/* + * Copyright 2025 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.example.compose.snippets.performance import android.app.Application import androidx.compose.runtime.Composer import androidx.compose.runtime.tooling.ComposeStackTraceMode -import com.google.maps.android.ktx.BuildConfig /* * Copyright 2025 The Android Open Source Project @@ -30,4 +45,4 @@ class SampleStackTracesEnabledApp : Application() { Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto) } } -// [END android_compose_stacktraces_enable] \ No newline at end of file +// [END android_compose_stacktraces_enable] From bd5f1e8072a2077bd6cd0207554f726ed466ca3e Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 1 Dec 2025 12:42:06 +0000 Subject: [PATCH 05/12] For debug, use SourceInformation, otherwise Auto --- .../compose/snippets/performance/Stacktraces.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index 5a12eff3b..eb1cd13a6 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -25,9 +25,13 @@ import com.google.maps.android.ktx.BuildConfig class SampleStackTracesEnabledApp : Application() { override fun onCreate() { - // Auto mode will use GroupKeys option when the app is minified, and - // None otherwise. - Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto) + // If the App is a debug variant, include the source information, + // otherwise do the less accurate GroupKeys option through Auto. + Composer.setDiagnosticStackTraceMode(if (BuildConfig.DEBUG) { + ComposeStackTraceMode.SourceInformation + } else { + ComposeStackTraceMode.Auto + }) } } // [END android_compose_stacktraces_enable] \ No newline at end of file From 95ac26ea352ac2c51e84d1eef31aed22e579023d Mon Sep 17 00:00:00 2001 From: riggaroo <9973046+riggaroo@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:45:51 +0000 Subject: [PATCH 06/12] Apply Spotless --- .../compose/snippets/performance/Stacktraces.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index fe1e20578..f0042bb8f 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -42,11 +42,13 @@ class SampleStackTracesEnabledApp : Application() { override fun onCreate() { // If the App is a debug variant, include the source information, // otherwise do the less accurate GroupKeys option through Auto. - Composer.setDiagnosticStackTraceMode(if (BuildConfig.DEBUG) { - ComposeStackTraceMode.SourceInformation - } else { - ComposeStackTraceMode.Auto - }) + Composer.setDiagnosticStackTraceMode( + if (BuildConfig.DEBUG) { + ComposeStackTraceMode.SourceInformation + } else { + ComposeStackTraceMode.Auto + } + ) } } // [END android_compose_stacktraces_enable] From 1a11031def4f24f17d6f98f2ffd5b0fa45cd56be Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 1 Dec 2025 12:51:52 +0000 Subject: [PATCH 07/12] Remove duplicate copyright --- .../compose/snippets/performance/Stacktraces.kt | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index fe1e20578..f1da8cef0 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -19,22 +19,7 @@ package com.example.compose.snippets.performance import android.app.Application import androidx.compose.runtime.Composer import androidx.compose.runtime.tooling.ComposeStackTraceMode - -/* -* Copyright 2025 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. -*/ +import com.google.maps.android.ktx.BuildConfig // [START android_compose_stacktraces_enable] class SampleStackTracesEnabledApp : Application() { From be9d854157023ffedaf2ef2ce87e8dee58268e36 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Thu, 4 Dec 2025 11:49:51 +0000 Subject: [PATCH 08/12] Switch back from alpha BOM --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 227a94a77..aa268f28d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -108,7 +108,7 @@ androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" } androidx-arcore-play-services = { module = "androidx.xr.arcore:arcore-play-services", version.ref = "arcorePlayServices" } androidx-compose-animation-graphics = { module = "androidx.compose.animation:animation-graphics", version.ref = "compose-latest" } -androidx-compose-bom = { module = "androidx.compose:compose-bom-alpha", version.ref = "androidx-compose-bom" } +androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "androidx-compose-bom" } androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose-latest" } androidx-compose-foundation-layout = { module = "androidx.compose.foundation:foundation-layout", version.ref = "compose-latest" } androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "compose-latest" } From 65bb651510dc6259ff6dc1e5fe40ae7275f038ad Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 8 Dec 2025 14:51:43 +0000 Subject: [PATCH 09/12] Update to new recommendations --- .../compose/snippets/performance/Stacktraces.kt | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index 8be1e84aa..db8fbcf55 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -25,15 +25,12 @@ import com.google.maps.android.ktx.BuildConfig class SampleStackTracesEnabledApp : Application() { override fun onCreate() { - // If the App is a debug variant, include the source information, - // otherwise do the less accurate GroupKeys option through Auto. - Composer.setDiagnosticStackTraceMode( - if (BuildConfig.DEBUG) { - ComposeStackTraceMode.SourceInformation - } else { - ComposeStackTraceMode.Auto - } - ) + // Enable Compose stack traces for minified builds only. + Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto) + + // Alternatively: + // Enable verbose Compose stack traces for local debugging + Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.SourceInformation) } } // [END android_compose_stacktraces_enable] From 168ba99ce0f76d5ae22623aaafccd3a78a05f5ec Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 8 Dec 2025 14:53:29 +0000 Subject: [PATCH 10/12] Add super call --- .../java/com/example/compose/snippets/performance/Stacktraces.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index db8fbcf55..83d38b7ff 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -25,6 +25,7 @@ import com.google.maps.android.ktx.BuildConfig class SampleStackTracesEnabledApp : Application() { override fun onCreate() { + super.onCreate() // Enable Compose stack traces for minified builds only. Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto) From dbba229ced45cbd71af303dd238c2aed1d86545f Mon Sep 17 00:00:00 2001 From: riggaroo <9973046+riggaroo@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:56:53 +0000 Subject: [PATCH 11/12] Apply Spotless --- .../java/com/example/compose/snippets/performance/Stacktraces.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index 83d38b7ff..8bb7d05c3 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -19,7 +19,6 @@ package com.example.compose.snippets.performance import android.app.Application import androidx.compose.runtime.Composer import androidx.compose.runtime.tooling.ComposeStackTraceMode -import com.google.maps.android.ktx.BuildConfig // [START android_compose_stacktraces_enable] class SampleStackTracesEnabledApp : Application() { From 4e12edb2f373c5fb0195a73af79214e4363dede7 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 8 Dec 2025 15:13:34 +0000 Subject: [PATCH 12/12] Add comment about enabling stacktraces at onCreate level --- .../java/com/example/compose/snippets/performance/Stacktraces.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt index 8bb7d05c3..babf90947 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/performance/Stacktraces.kt @@ -21,6 +21,7 @@ import androidx.compose.runtime.Composer import androidx.compose.runtime.tooling.ComposeStackTraceMode // [START android_compose_stacktraces_enable] +// Enable stack traces at application level: onCreate class SampleStackTracesEnabledApp : Application() { override fun onCreate() {