Loading tracinglib/core/src/TraceUtils.kt +28 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.app.tracing import android.annotation.SuppressLint import android.os.Trace import com.android.app.tracing.TrackGroupUtils.trackGroup import com.android.app.tracing.coroutines.traceCoroutine import java.util.concurrent.ThreadLocalRandom import kotlin.contracts.ExperimentalContracts Loading Loading @@ -238,4 +239,31 @@ public object TraceUtils { block() } } /** Starts an async slice, and returns a runnable that stops the slice. */ @JvmStatic public fun traceAsyncClosable( traceTag: Long = Trace.TRACE_TAG_APP, trackName: String, sliceName: String, ): () -> Unit { val cookie = ThreadLocalRandom.current().nextInt() Trace.asyncTraceForTrackBegin(traceTag, trackName, sliceName, cookie) return { Trace.asyncTraceForTrackEnd(traceTag, trackName, cookie) } } /** Starts an async slice, and returns a runnable that stops the slice. */ @JvmStatic @JvmOverloads public fun traceAsyncClosable( traceTag: Long = Trace.TRACE_TAG_APP, trackGroupName: String, trackName: String, sliceName: String, ): () -> Unit { val groupedTrackName = trackGroup(trackGroupName, trackName) val cookie = ThreadLocalRandom.current().nextInt() Trace.asyncTraceForTrackBegin(traceTag, groupedTrackName, sliceName, cookie) return { Trace.asyncTraceForTrackEnd(traceTag, groupedTrackName, cookie) } } } tracinglib/core/src/TrackGroupUtils.kt +1 −0 Original line number Diff line number Diff line Loading @@ -27,5 +27,6 @@ public object TrackGroupUtils { * "shade" related tracks will appear together, under the "shade" track in the process * workspace). */ @JvmStatic public fun trackGroup(groupName: String, trackName: String): String = "$groupName##$trackName" } tracinglib/core/src/coroutines/TrackTracer.kt +24 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,20 @@ public class TrackTracer( return Closeable { Trace.asyncTraceForTrackEnd(traceTag, trackName, cookie) } } /** Traces [block] both sync and async. */ public fun traceSyncAndAsync(sliceName: () -> String, block: () -> Unit) { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) callsInPlace(sliceName, InvocationKind.AT_MOST_ONCE) } if (Trace.isEnabled()) { val name = sliceName() TraceUtils.trace(name) { traceAsync(name, block) } } else { block() } } public companion object { /** * Creates an instant event for a track called [trackName] inside [groupName]. See Loading @@ -87,6 +101,16 @@ public class TrackTracer( Trace.traceCounter(Trace.TRACE_TAG_APP, trackGroup(groupName, trackName), i) } /** * Creates an instant event for a track called [trackName] inside [groupName]. See * [trackGroup] for details on how the rendering in groups works. */ @JvmStatic public fun instantForGroup(groupName: String, trackName: String, event: () -> String) { if (!Trace.isEnabled()) return Trace.instantForTrack(Trace.TRACE_TAG_APP, trackGroup(groupName, trackName), event()) } /** Creates an instant event for [groupName] grgorp, see [instantForGroup]. */ @JvmStatic public inline fun instantForGroup(groupName: String, trackName: () -> String, i: Int) { Loading Loading
tracinglib/core/src/TraceUtils.kt +28 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.app.tracing import android.annotation.SuppressLint import android.os.Trace import com.android.app.tracing.TrackGroupUtils.trackGroup import com.android.app.tracing.coroutines.traceCoroutine import java.util.concurrent.ThreadLocalRandom import kotlin.contracts.ExperimentalContracts Loading Loading @@ -238,4 +239,31 @@ public object TraceUtils { block() } } /** Starts an async slice, and returns a runnable that stops the slice. */ @JvmStatic public fun traceAsyncClosable( traceTag: Long = Trace.TRACE_TAG_APP, trackName: String, sliceName: String, ): () -> Unit { val cookie = ThreadLocalRandom.current().nextInt() Trace.asyncTraceForTrackBegin(traceTag, trackName, sliceName, cookie) return { Trace.asyncTraceForTrackEnd(traceTag, trackName, cookie) } } /** Starts an async slice, and returns a runnable that stops the slice. */ @JvmStatic @JvmOverloads public fun traceAsyncClosable( traceTag: Long = Trace.TRACE_TAG_APP, trackGroupName: String, trackName: String, sliceName: String, ): () -> Unit { val groupedTrackName = trackGroup(trackGroupName, trackName) val cookie = ThreadLocalRandom.current().nextInt() Trace.asyncTraceForTrackBegin(traceTag, groupedTrackName, sliceName, cookie) return { Trace.asyncTraceForTrackEnd(traceTag, groupedTrackName, cookie) } } }
tracinglib/core/src/TrackGroupUtils.kt +1 −0 Original line number Diff line number Diff line Loading @@ -27,5 +27,6 @@ public object TrackGroupUtils { * "shade" related tracks will appear together, under the "shade" track in the process * workspace). */ @JvmStatic public fun trackGroup(groupName: String, trackName: String): String = "$groupName##$trackName" }
tracinglib/core/src/coroutines/TrackTracer.kt +24 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,20 @@ public class TrackTracer( return Closeable { Trace.asyncTraceForTrackEnd(traceTag, trackName, cookie) } } /** Traces [block] both sync and async. */ public fun traceSyncAndAsync(sliceName: () -> String, block: () -> Unit) { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) callsInPlace(sliceName, InvocationKind.AT_MOST_ONCE) } if (Trace.isEnabled()) { val name = sliceName() TraceUtils.trace(name) { traceAsync(name, block) } } else { block() } } public companion object { /** * Creates an instant event for a track called [trackName] inside [groupName]. See Loading @@ -87,6 +101,16 @@ public class TrackTracer( Trace.traceCounter(Trace.TRACE_TAG_APP, trackGroup(groupName, trackName), i) } /** * Creates an instant event for a track called [trackName] inside [groupName]. See * [trackGroup] for details on how the rendering in groups works. */ @JvmStatic public fun instantForGroup(groupName: String, trackName: String, event: () -> String) { if (!Trace.isEnabled()) return Trace.instantForTrack(Trace.TRACE_TAG_APP, trackGroup(groupName, trackName), event()) } /** Creates an instant event for [groupName] grgorp, see [instantForGroup]. */ @JvmStatic public inline fun instantForGroup(groupName: String, trackName: () -> String, i: Int) { Loading