Skip to content

Commit 86e585c

Browse files
43jayclaude
andcommitted
chore(samples): Update sample app to support Perfetto profiling testing
Adds UI controls to the profiling sample activity for testing both legacy and Perfetto profiling paths. Enables useProfilingManager flag in the sample manifest for API 35+ testing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0d34c42 commit 86e585c

File tree

4 files changed

+79
-6
lines changed

4 files changed

+79
-6
lines changed

sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@
163163
<meta-data
164164
android:name="io.sentry.traces.profiling.start-on-app-start"
165165
android:value="true" />
166+
<!-- Enable ProfilingManager (Perfetto) on API 35+ -->
167+
<meta-data
168+
android:name="io.sentry.profiling.use-profiling-manager"
169+
android:value="true" />
166170

167171
<!-- how to disable the Activity auto instrumentation for tracing-->
168172
<!-- <meta-data android:name="io.sentry.traces.activity.enable" android:value="false" />-->

sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/ProfilingActivity.kt

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.sentry.samples.android
22

3+
import android.os.Build
34
import android.os.Bundle
45
import android.view.View
56
import android.widget.SeekBar
@@ -22,6 +23,7 @@ class ProfilingActivity : AppCompatActivity() {
2223
private lateinit var binding: ActivityProfilingBinding
2324
private val executors = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())
2425
private var profileFinished = true
26+
private var manualProfilingActive = false
2527

2628
override fun onCreate(savedInstanceState: Bundle?) {
2729
super.onCreate(savedInstanceState)
@@ -30,7 +32,7 @@ class ProfilingActivity : AppCompatActivity() {
3032
this,
3133
object : OnBackPressedCallback(true) {
3234
override fun handleOnBackPressed() {
33-
if (profileFinished) {
35+
if (profileFinished && !manualProfilingActive) {
3436
isEnabled = false
3537
onBackPressedDispatcher.onBackPressed()
3638
} else {
@@ -42,6 +44,16 @@ class ProfilingActivity : AppCompatActivity() {
4244
)
4345
binding = ActivityProfilingBinding.inflate(layoutInflater)
4446

47+
// Show which profiler backend is active
48+
val options = Sentry.getCurrentScopes().options
49+
val isPerfetto = options.isUseProfilingManager && Build.VERSION.SDK_INT >= 35
50+
binding.profilingStatus.text =
51+
if (isPerfetto) {
52+
getString(R.string.profiling_status_perfetto)
53+
} else {
54+
getString(R.string.profiling_status_legacy)
55+
}
56+
4557
binding.profilingDurationSeekbar.setOnSeekBarChangeListener(
4658
object : SeekBar.OnSeekBarChangeListener {
4759
override fun onProgressChanged(p0: SeekBar, p1: Int, p2: Boolean) {
@@ -76,6 +88,7 @@ class ProfilingActivity : AppCompatActivity() {
7688
binding.profilingList.adapter = ProfilingListAdapter()
7789
binding.profilingList.layoutManager = LinearLayoutManager(this)
7890

91+
// Transaction-based profiling (existing)
7992
binding.profilingStart.setOnClickListener {
8093
binding.profilingProgressBar.visibility = View.VISIBLE
8194
profileFinished = false
@@ -92,6 +105,33 @@ class ProfilingActivity : AppCompatActivity() {
92105
}
93106
.start()
94107
}
108+
109+
// Manual continuous profiling (exercises Perfetto path on API 35+)
110+
binding.profilingStartManual.setOnClickListener {
111+
if (!manualProfilingActive) {
112+
Sentry.startProfiler()
113+
manualProfilingActive = true
114+
profileFinished = false
115+
binding.profilingStartManual.text = getString(R.string.profiling_stop_manual)
116+
binding.profilingProgressBar.visibility = View.VISIBLE
117+
118+
// Start background work to generate interesting profile data
119+
val threads = getBackgroundThreads()
120+
repeat(threads) { executors.submit { runMathOperations() } }
121+
executors.submit { swipeList() }
122+
123+
binding.profilingResult.text = getString(R.string.profiling_manual_started)
124+
} else {
125+
Sentry.stopProfiler()
126+
manualProfilingActive = false
127+
profileFinished = true
128+
binding.profilingStartManual.text = getString(R.string.profiling_start_manual)
129+
binding.profilingProgressBar.visibility = View.GONE
130+
131+
binding.profilingResult.text = getString(R.string.profiling_manual_stopped)
132+
}
133+
}
134+
95135
setContentView(binding.root)
96136
Sentry.reportFullyDisplayed()
97137
}

sentry-samples/sentry-samples-android/src/main/res/layout/activity_profiling.xml

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,34 @@
3838
android:gravity="center"
3939
android:text="@string/profiling_result" />
4040

41-
<Button
42-
android:id="@+id/profiling_start"
43-
android:layout_width="wrap_content"
41+
<TextView
42+
android:id="@+id/profiling_status"
43+
android:layout_width="match_parent"
44+
android:layout_height="wrap_content"
45+
android:gravity="center"
46+
android:textStyle="bold"
47+
android:paddingTop="8dp"
48+
android:paddingBottom="4dp" />
49+
50+
<LinearLayout
51+
android:layout_width="match_parent"
4452
android:layout_height="wrap_content"
45-
android:text="@string/profiling_start" />
53+
android:orientation="horizontal"
54+
android:gravity="center">
55+
56+
<Button
57+
android:id="@+id/profiling_start"
58+
android:layout_width="wrap_content"
59+
android:layout_height="wrap_content"
60+
android:text="@string/profiling_start" />
61+
62+
<Button
63+
android:id="@+id/profiling_start_manual"
64+
android:layout_width="wrap_content"
65+
android:layout_height="wrap_content"
66+
android:text="@string/profiling_start_manual" />
67+
68+
</LinearLayout>
4669

4770
<ProgressBar
4871
android:id="@+id/profiling_progress_bar"

sentry-samples/sentry-samples-android/src/main/res/values/strings.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,13 @@ Nulla interdum gravida augue, vel fringilla lorem bibendum vel. In hac habitasse
5151
<string name="profiling_threads">Background threads to use: %d</string>
5252
<string name="profiling_running">Profiling is running</string>
5353
<string name="profiling_no_dir_set">No profiling dir path set</string>
54-
<string name="profiling_start">Start Profiling</string>
54+
<string name="profiling_start">Start (Transaction)</string>
55+
<string name="profiling_start_manual">Start (Manual)</string>
56+
<string name="profiling_stop_manual">Stop (Manual)</string>
57+
<string name="profiling_status_perfetto">Profiler: Perfetto (ProfilingManager API 35+)</string>
58+
<string name="profiling_status_legacy">Profiler: Legacy (simpleperf)</string>
59+
<string name="profiling_manual_started">Manual profiler started</string>
60+
<string name="profiling_manual_stopped">Manual profiler stopped — chunk sent to Sentry</string>
5561
<string name="profiling_result">Profile trace file size = %d bytes \nItem payload size = %d bytes \nData sent to Sentry size = %d bytes</string>
5662
<string name="open_camera_activity">Open Camera Activity</string>
5763
<string name="open_http_request_activity">Open Trigger HTTP Request Activity</string>

0 commit comments

Comments
 (0)