Skip to content

Commit d60730e

Browse files
Add snippets for trigger based profiling section of ProfilingManager docs (#688)
* Add snippets for trigger based profiling section of ProfilingManager docs * Apply Spotless * Fix tag name * Bump mindSdk so that new ProfilingManager snippets compile * add extra handling logic for trigger callback and exclude some sections * update kotlin snippet for handling callback * Apply Spotless * rename upload job method --------- Co-authored-by: edgararriagag <[email protected]>
1 parent a015aef commit d60730e

File tree

3 files changed

+112
-1
lines changed

3 files changed

+112
-1
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ material3-adaptive-navigation-suite = "1.4.0"
6868
media3 = "1.8.0"
6969
media3Ui = "1.8.0"
7070
# @keep
71-
minSdk = "35"
71+
minSdk = "36"
7272
okHttp = "5.2.1"
7373
playServicesWearable = "19.0.0"
7474
protobuf = "4.32.1"

misc/src/main/java/com/example/snippets/profiling/ProfilingManagerJavaSnippets.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22

33
import android.app.Activity;
44
import android.os.Bundle;
5+
import android.os.ProfilingManager;
6+
import android.os.ProfilingTrigger;
57
import android.util.Log;
8+
import java.util.List;
9+
import java.util.ArrayList;
610
import java.util.function.Consumer;
711
import java.util.concurrent.Executor;
12+
import java.util.concurrent.Executors;
813
import android.os.ProfilingResult;
914
import java.util.concurrent.Executors;
1015
import android.os.CancellationSignal;
16+
import android.view.Choreographer;
1117
import androidx.tracing.Trace;
1218
import androidx.core.os.Profiling;
1319
import androidx.core.os.SystemTraceRequestBuilder;
@@ -16,6 +22,8 @@
1622
public class ProfilingManagerJavaSnippets {
1723
public class MainActivityJava extends Activity {
1824

25+
public static final String TAG = "ProfilingManager";
26+
1927
@Override
2028
public void onCreate(Bundle savedInstanceState) {
2129
super.onCreate(savedInstanceState);
@@ -69,5 +77,53 @@ public void accept(ProfilingResult profilingResult) {
6977
stopSignal.cancel();
7078
}
7179
// [END android_profiling_manager_record_system_trace_java]
80+
81+
// [START android_profiling_manager_triggered_trace_java]
82+
public void recordWithTrigger() {
83+
ProfilingManager profilingManager = getApplicationContext().getSystemService(
84+
ProfilingManager.class);
85+
List<ProfilingTrigger> triggers = new ArrayList<>();
86+
ProfilingTrigger.Builder triggerBuilder = new ProfilingTrigger.Builder(
87+
ProfilingTrigger.TRIGGER_TYPE_APP_FULLY_DRAWN);
88+
triggerBuilder.setRateLimitingPeriodHours(1);
89+
triggers.add(triggerBuilder.build());
90+
91+
Executor mainExecutor = Executors.newSingleThreadExecutor();
92+
Consumer<ProfilingResult> resultCallback =
93+
new Consumer<ProfilingResult>() {
94+
@Override
95+
public void accept(ProfilingResult profilingResult) {
96+
if (profilingResult.getErrorCode() == ProfilingResult.ERROR_NONE) {
97+
Log.d(
98+
"ProfileTest",
99+
"Received profiling result file=" + profilingResult.getResultFilePath());
100+
setupProfileUploadWorker(profilingResult.getResultFilePath());
101+
} else {
102+
Log.e(
103+
"ProfileTest",
104+
"Profiling failed errorcode="
105+
+ profilingResult.getErrorCode()
106+
+ " errormsg="
107+
+ profilingResult.getErrorMessage());
108+
}
109+
}
110+
};
111+
profilingManager.registerForAllProfilingResults(mainExecutor, resultCallback);
112+
profilingManager.addProfilingTriggers(triggers);
113+
114+
// [START_EXCLUDE silent]
115+
Choreographer.getInstance().postFrameCallback((f) -> {
116+
// This will cause the TRIGGER_TYPE_APP_FULLY_DRAWN to be emitted.
117+
reportFullyDrawn();
118+
});
119+
// [END_EXCLUDE silent]
120+
}
121+
// [END android_profiling_manager_triggered_trace_java]
122+
123+
// [START android_profiling_manager_triggered_trace_setup_upload_job_java]
124+
public void setupProfileUploadWorker(String resultFilePath) {
125+
// Setup job to upload the profiling result file.
126+
}
127+
// [END android_profiling_manager_triggered_trace_setup_upload_job_java]
72128
}
73129
}

misc/src/main/java/com/example/snippets/profiling/ProfilingManagerKotlinSnippets.kt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,29 @@ import android.app.Activity
2020
import android.os.Build
2121
import android.os.Bundle
2222
import android.os.CancellationSignal
23+
import android.os.ProfilingManager
2324
import android.os.ProfilingResult
25+
import android.os.ProfilingTrigger
2426
import android.util.Log
27+
import android.view.Choreographer
2528
import androidx.annotation.RequiresApi
2629
import androidx.core.os.BufferFillPolicy
2730
import androidx.core.os.SystemTraceRequestBuilder
2831
import androidx.core.os.requestProfiling
2932
import androidx.tracing.Trace
33+
import java.util.ArrayList
3034
import java.util.concurrent.Executor
35+
import java.util.concurrent.Executors
3136
import java.util.function.Consumer
3237
import kotlinx.coroutines.Dispatchers
3338
import kotlinx.coroutines.asExecutor
3439

3540
class ProfilingManagerKotlinSnippets {
3641
class MainActivity : Activity() {
42+
companion object {
43+
const val TAG = "MyApp"
44+
}
45+
3746
override fun onCreate(savedInstanceState: Bundle?) {
3847
super.onCreate(savedInstanceState)
3948
sampleRecordSystemTrace()
@@ -81,5 +90,51 @@ class ProfilingManagerKotlinSnippets {
8190
// Computations you want to profile
8291
}
8392
// [END android_profiling_manager_record_system_trace_kotlin]
93+
94+
// [START android_profiling_manager_triggered_trace]
95+
fun recordWithTrigger() {
96+
val profilingManager = applicationContext.getSystemService(ProfilingManager::class.java)
97+
98+
val triggers = ArrayList<ProfilingTrigger>()
99+
100+
val triggerBuilder = ProfilingTrigger.Builder(ProfilingTrigger.TRIGGER_TYPE_APP_FULLY_DRAWN)
101+
.setRateLimitingPeriodHours(1)
102+
103+
triggers.add(triggerBuilder.build())
104+
105+
val mainExecutor: Executor = Executors.newSingleThreadExecutor()
106+
107+
val resultCallback = Consumer<ProfilingResult> { profilingResult ->
108+
if (profilingResult.errorCode == ProfilingResult.ERROR_NONE) {
109+
Log.d(
110+
"ProfileTest",
111+
"Received profiling result file=" + profilingResult.resultFilePath
112+
)
113+
setupProfileUploadWorker(profilingResult.resultFilePath)
114+
} else {
115+
Log.e(
116+
"ProfileTest",
117+
"Profiling failed errorcode=" + profilingResult.errorCode + " errormsg=" + profilingResult.errorMessage
118+
)
119+
}
120+
}
121+
122+
profilingManager.registerForAllProfilingResults(mainExecutor, resultCallback)
123+
profilingManager.addProfilingTriggers(triggers)
124+
125+
// [START_EXCLUDE silent]
126+
Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
127+
// This will cause the TRIGGER_TYPE_APP_FULLY_DRAWN to be emitted.
128+
reportFullyDrawn()
129+
}
130+
// [END_EXCLUDE silent]
131+
}
132+
// [END android_profiling_manager_triggered_trace]
133+
134+
// [START android_profiling_manager_triggered_trace_setup_upload_job]
135+
fun setupProfileUploadWorker(resultFilePath: String?) {
136+
// Setup job to upload the profiling result file.
137+
}
138+
// [END android_profiling_manager_triggered_trace_setup_upload_job]
84139
}
85140
}

0 commit comments

Comments
 (0)