perfetto命令 抓取 trace

1.启动Android 模拟器

进入到 cmd 中,敲入下面的命令

H:
cd H:\Sdk\emulator
.\emulator.exe -list-avds
.\emulator.exe -writable-system -avd Pixel_XL_API_32_6  -no-snapshot-load -qemu

perfetto命令 抓取 trace_第1张图片

2.再打开一个 CMD 窗口,设置 traced 权限

adb shell setprop persist.traced.enable 1

perfetto命令 抓取 trace_第2张图片

3.验证是否打开 traced 权限

adb shell
getprop persist.traced.enable
ps -A|grep -i trace

perfetto命令 抓取 trace_第3张图片

4. 输入 perfetto 命令

adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 10s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

其中 -o /data/misc/perfetto-traces/trace_file.perfetto-trace 意思就是说 将 trace 保存到手机的 /data/misc/perfetto-traces/ 路径下,且文件名为 trace_file.perfetto-trace
-t 10s 意思就是抓取 10 秒

点击照相APP,操作几下, 10秒后会自动停止抓取
在这里插入图片描述

perfetto命令 抓取 trace_第4张图片

5. 将 trace 从手机拷贝到电脑

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

在这里插入图片描述

在哪个路径执行的 上面的命令,文件就会被保存到哪里
可以看到拷贝好的 trace 文件

perfetto命令 抓取 trace_第5张图片

6. 在浏览器打开这个网址

https://ui.perfetto.dev/

perfetto命令 抓取 trace_第6张图片

然后把 trace 文件拖进来

perfetto命令 抓取 trace_第7张图片

7. 在 app 代码中封装一个 Trace 类

这里 GeekCamera2Trace 类是直接调用 Android 系统的 Trace 类的各种函数

package com.deepinout.geekcamera;

import android.os.Build;
import android.os.Trace;

public class GeekCamera2Trace {
   ...
    public static void beginAsyncSection(String methodName, int cookie) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && Trace.isEnabled()) {
            Trace.beginAsyncSection(methodName, cookie);
        }
    }

    public static void endAsyncSection(String methodName, int cookie) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && Trace.isEnabled()) {
            Trace.endAsyncSection(methodName, cookie);
        }
    }

    public static void beginSection(String sectionName) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&Trace.isEnabled()) {
            Trace.beginSection(sectionName);
        }
    }

    public static void endSection() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&Trace.isEnabled()) {
            Trace.endSection();
        }
    }

    public static void setCounter(String counterName, long counterValue) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&Trace.isEnabled()) {
            Trace.setCounter(counterName, counterValue);
        }
    }
}

8. 在 app 的 openCamera 的代码前后分别加 Trace

perfetto命令 抓取 trace_第8张图片

9. 编译运行 app

perfetto命令 抓取 trace_第9张图片

10. 制作 config 文件

打开下面的网址

https://ui.perfetto.dev/

perfetto命令 抓取 trace_第10张图片

选取下面的选项
perfetto命令 抓取 trace_第11张图片

perfetto命令 抓取 trace_第12张图片

perfetto命令 抓取 trace_第13张图片

perfetto命令 抓取 trace_第14张图片

perfetto命令 抓取 trace_第15张图片

perfetto命令 抓取 trace_第16张图片

选好以后,复制下面的内容到一个文件

perfetto命令 抓取 trace_第17张图片

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
        }
    }
}
data_sources: {
    config {
        name: "linux.sys_stats"
        sys_stats_config {
            meminfo_period_ms: 1000
            meminfo_counters: MEMINFO_MEM_FREE
            meminfo_counters: MEMINFO_MEM_TOTAL
            meminfo_counters: MEMINFO_SWAP_FREE
            meminfo_counters: MEMINFO_SWAP_TOTAL
            stat_period_ms: 1000
            stat_counters: STAT_CPU_TIMES
            stat_counters: STAT_FORK_COUNT
            cpufreq_period_ms: 1000
        }
    }
}
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: "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_categories: "camera"
            atrace_categories: "gfx"
            atrace_categories: "hal"
            atrace_categories: "input"
            atrace_categories: "ss"
            atrace_categories: "view"
            atrace_categories: "wm"
            atrace_apps: "*"
        }
    }
}
duration_ms: 10000

改成自己的 app 的名字

perfetto命令 抓取 trace_第18张图片

我保存到了 H:\Sdk\emulator 下面,文件名字叫做 record_camera.config
(大家可以按照自己的喜好选择路径和设置文件名字)

perfetto命令 抓取 trace_第19张图片

在 cmd 或者 Android Studio 的 Terminal 中输入下面的命令

adb push record_camera.config /data/local/tmp/record_camera.config
adb shell “cat /data/local/tmp/record_camera.config | perfetto --txt -c - -o /data/misc/perfetto-traces/trace.perfetto-trace”

报错:
在这里插入图片描述
解决办法:

perfetto命令 抓取 trace_第20张图片

保存
重新 Push 到模拟器
重复执行上面两行命令

adb push record_camera.config /data/local/tmp/record_camera.config
adb shell “cat /data/local/tmp/record_camera.config | perfetto --txt -c - -o /data/misc/perfetto-traces/trace.perfetto-trace”

在这里插入图片描述
可以看到可以运行正常
点开 app ,然后点击拍照

perfetto命令 抓取 trace_第21张图片

这样就抓取好了 trace
拷贝trace 到电脑

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

perfetto命令 抓取 trace_第22张图片

可以看到抓取的 trace 文件
perfetto命令 抓取 trace_第23张图片

将这个文件拖到网页

https://ui.perfetto.dev/

perfetto命令 抓取 trace_第24张图片

搜索 GC2_App_openCamera

perfetto命令 抓取 trace_第25张图片

你可能感兴趣的:(Android音视频,android)