跳到主要内容

Sampling Profiler

注意

该门户网站正在开发中。文档的完整版本请看这里.

集成依赖项到项目中

在您的 <project>/<app-module>/build.gradle

  dependencies {
    implementation  "ru.ok.tracer:tracer-profiler-sampling:0.2.7"}

更多关于依赖项的详细说明,请参见"快速启动"页面。

SamplingProfilerConfiguration 描述

在您的 Application.kt

  class MyApplication : Application(), HasTracerConfiguration {
    override val tracerConfiguration: List<TracerConfiguration>
        get() = listOf(
            SamplingProfilerConfiguration.build {
                // 您的选项
},
        )
}

SamplingProfilerConfiguration.Builder 选项:

  • setEnabled --- 启用/禁用性能分析。默认为启用状态。

SamplingProfilerConfiguration.Builder 的过时或危险选项:

  • setBufferSizeMb --- 请参阅 android.os.Debug.startMethodTracingSampling 的描述;

  • setSamplingIntervalUs --- 请参阅 android.os.Debug.startMethodTracingSampling的描述。默认值为5000;

  • setDurationMs --- 分析器的运行时间,以毫秒为单位;

  • addCondition --- 添加 Condition 以开始性能分析。

Condition 描述。Deprecated。

Condition 结构用于控制性能分析的启动和结果发送。使用示例:

  Condition.appStart(10_000, 7_000)

以100%的概率在应用启动时启动分析器,并且如果应用启动时间超过7000毫秒,将其工作结果发送到服务器。

创建自定义事件:

  val condition = Condition.build { // 您的选项 }

Condition.Builder 选项

  • setTag("my_tag") --- 将结果上传到 Tracer 的标签。

  • setTagLimit(n) --- 服务器每天接受该标签的最大报告数量。

  • setProbability(n) --- 发生 startEvent 事件时,启动分析器的概率(1/n)。

  • setStartEvent("my_event") --- 发生上述事件时,将启动分析器。

  • setInterestingEvent("my_other_event") --- 可选。如果存在,性能分析结果将仅在遇到此事件时发送到后端。

  • setInterestingDuration(n) --- 如果开始事件和感兴趣事件之间的时间超过此数值,性能分析结果将被发送到后端。

如果感兴趣的事件有自己的计数器,比较将与它进行。例如,app_freeze 有一个计数器 --- UI 线程挂起的时间。因此,如果 interestingEvent == "app_freeze" 并且 interestingDuration == 700,那么如果在分析器运行期间发生了超过 700 毫秒的冻结,则会发生发送。

手动性能分析

还可以在代码中标记性能分析的开始和结束。

SamplingProfiler.start() --- 启动分析器。接受参数:

  • context: Context --- 应用程序的 App context。

  • tag: String --- 结果将以此标签上传到追踪器。

  • duration: Long --- 分析器运行时间,以毫秒为单位。

SamplingProfiler.abort() --- 停止分析器并清除结果。

SamplingProfiler.commit() --- 停止分析器并将结果发送到后端。如果在调用时分析器尚未完成,那么最终标签将等于 <tag>_<tagSuffix>

  • tagSuffix: String --- 可选。如果分析器提前停止,将添加到标签的后缀。

实例:

以1/100000的概率,分析器将开始其工作

  if (Random.nextInt( 100 \_ 0 0 0 ) ==
  0 ) {
        SamplingProfiler.start(
                context = appContext,
                tag =
  "stream_request" ,
                duration =  10 _ 0 0 0 ,
        
)
}
// ... 代码。例如,加载信息流SamplingProfiler.commit( "loaded" )

"系统"事件描述

"系统"事件在 Condition 类和手动性能分析中使用:

  • TracerEvents.EVENT_APP_START_BEGIN --- "app_start_begin" --- 应用程序启动开始。

  • TracerEvents.EVENT_APP_START_END --- "app_start_end" --- Application.onCreate() 方法结束。

  • TracerEvents.EVENT_FIRST_ACTIVITY_CREATED --- "app_first_activity_created" --- 创建了第一个活动。

  • TracerEvents.EVENT_ACTIVITY_CREATED --- "activity_created" --- 任何活动进入 created 状态。

  • TracerEvents.EVENT_FREEZE --- "app_freeze" --- UI 线程挂起了 N 毫秒。如果该事件被用作 interesting event,那么 interesting duration 将与 N 进行比较。例如,如果 N == 500,那么如果在分析器运行期间 UI 线程挂起超过 500 毫秒,分析结果将被发送。

  • EVENT_ANR --- "app_anr" --- UI 线程挂起并未在分析器结束时恢复。从发现挂起到分析器结束,过去了 N 毫秒。如果该事件被用作 interesting event,那么 interesting duration 将与 N 进行比较。例如,如果 N == 5000,那么如果在分析器运行期间 UI 线程挂起超过 5000 毫秒,分析结果将被发送。

添加自定义事件:

  TracerEvents.addEvent(eventName, duration)

  • eventName --- 事件名称。在 Condition 类的 startEvent 和 interestingEvent 方法中使用。

  • duration --- 与此事件相关联的时间。如果设置,interestingDuration 不是基于 startEvent 和 interestingEvent 之间的差异计算,而是与此事件的 duration 比较。