[toc]

一、四种运用办法

  • 命令行办法
    • 1、运用 /external/perfetto/tools/record_android_trace 自动化脚本
      • 需求装置python,下载python脚本东西 record_android_trace
    • 2、直接运用手机上的命令行客户端东西 /system/bin/perfetto
  • UI东西
    • 3、通过ui.perfetto.dev/ 中的”录制“页面
      • 自测在 window 不管用
      • 大概由于需求根据 bash 的命令行东西
    • 4、运用手机上的 ”体系盯梢“,在开发者选项里面
      • 关于大部分人满足运用了,可是关于搞功能的还是运用命令行更灵敏。

二、引荐的运用办法:命令行客户端 /system/bin/perfetto

  • 命令行客户端有两种形式:

    • 轻量形式

      • 运用 atrace 和 ftrace 作为数据来历。类似于 systrace 接口
    • 通用形式

      • 从协议缓冲区获取其装备,并且可以让您运用 atrace 和 ftrace 之外的数据源

注:本篇文章介绍的运用过程运用 通用形式,运用window体系的cmd命令行。

注:ui.perfetto.dev/#!/record/i… 给的命令是根据 bash 的命令,并不能在window cmd命令行上直接履行。

注:以下运用过程是在Android 12 体系上。Android 11 以及以下不可以。

三、运用过程

1、履行以下命令。这时候命令行窗口会处于等候输入状况
cat <<EOF >  /data/misc/perfetto-configs/config && perfetto  --txt  -o /data/misc/perfetto-traces/trace  -c /data/misc/perfetto-configs/config

<<EOF 表示 EOF 作为输入流的结束符

2、在 ui.perfetto.dev/#!/record 挑选trace的装备信息
  • Probes项下,挑选 CPU、GPU、power、Memory、Android apps & svcs 这些项中的内容,按需挑选。可以无脑全选。
  • 点击 Recording command ,仿制小窗口中 <<EOF 之后的信息 到手机等候输入的shell窗口,回车结束输入后开始抓trace。

或许疏忽第一步,简单点,直接仿制以下内容到手机shell中,回车就可以抓trace了。只不过用的是我装备的这个数据源。

cat <<EOF >  /data/misc/perfetto-configs/config && perfetto  --txt  -o /data/misc/perfetto-traces/trace  -c /data/misc/perfetto-configs/config
buffers: {
    size_kb: 63488
    fill_policy: DISCARD
}
buffers: {
    size_kb: 2048
    fill_policy: DISCARD
}
data_sources: {
    config {
        name: "android.gpu.memory"
    }
}
data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
        process_stats_config {
            scan_all_processes_on_start: true
            proc_stats_poll_ms: 1000
        }
    }
}
data_sources: {
    config {
        name: "android.log"
        android_log_config {
        }
    }
}
data_sources: {
    config {
        name: "android.surfaceflinger.frametimeline"
    }
}
data_sources: {
    config {
        name: "linux.sys_stats"
        sys_stats_config {
            meminfo_period_ms: 1000
            vmstat_period_ms: 1000
            stat_period_ms: 1000
            stat_counters: STAT_CPU_TIMES
            stat_counters: STAT_FORK_COUNT
        }
    }
}
data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "sched/sched_switch"
            ftrace_events: "power/suspend_resume"
            ftrace_events: "sched/sched_wakeup"
            ftrace_events: "sched/sched_wakeup_new"
            ftrace_events: "sched/sched_waking"
            ftrace_events: "power/cpu_frequency"
            ftrace_events: "power/cpu_idle"
            ftrace_events: "power/gpu_frequency"
            ftrace_events: "gpu_mem/gpu_mem_total"
            ftrace_events: "raw_syscalls/sys_enter"
            ftrace_events: "raw_syscalls/sys_exit"
            ftrace_events: "mm_event/mm_event_record"
            ftrace_events: "kmem/rss_stat"
            ftrace_events: "ion/ion_stat"
            ftrace_events: "dmabuf_heap/dma_heap_stat"
            ftrace_events: "kmem/ion_heap_grow"
            ftrace_events: "kmem/ion_heap_shrink"
            ftrace_events: "sched/sched_process_exit"
            ftrace_events: "sched/sched_process_free"
            ftrace_events: "task/task_newtask"
            ftrace_events: "task/task_rename"
            ftrace_events: "lowmemorykiller/lowmemory_kill"
            ftrace_events: "oom/oom_score_adj_update"
            ftrace_events: "ftrace/print"
            atrace_apps: "*"
        }
    }
}
duration_ms: 15000
EOF
3、pull出trace文件

adb pull /data/misc/perfetto-traces/trace

4、浏览器检查trace
  • 打开网站 ui.perfetto.dev/
  • 点击左侧 Open trace file 挑选pull出的trace文件
  • 等候浏览器加载trace文件,解析完成就可以检查trace了

四、进阶

  • 检查 perfetto.dev/docs/refere… 装备信息,自己挑选需求的装备抓trace
  • 或许检查 /external/perfetto/protos/perfetto/config/trace_config.proto

五、问题排查

  • echo 0 > /sys/kernel/tracing/tracing_on
    • 0 敞开,“1” 则抛弃该数据源
  • 有其他进程正在获取ftrace。这种状况,咱们需求退出相关进程
  • Android 9 (P) and 10 (Q) 非 Pixel 的手机 默许不敞开。Android 12 默许敞开
    • 敞开命令:
    • adb shell setprop persist.traced.enable 1
  • 服务进程是否敞开、 ftrace是否被占用
    • traced_probes、traced :运用 ps -el | grep traced 检查是否有这俩进程
    • getprop debug.atrace.user_initiated,这个值需求为“空”,或未设置

附:

浏览器检查trace运用的快捷键:

  • shift+m 选中区域
  • W键放大或许ctrl+滚轮
  • Perfetto检查runnable的唤醒办法和systrace不一样
    • 点击runnable,看不到是谁唤醒的。需求紧接着点击:running