系统调试的目的?
做性能优化、分析bug。
那根据什么指标判断当前性能呢?
CPU调度情况,是不是频繁切换线程、执行了哪些线程; 内存占用是不是一直在增加、是不是锯齿形、内存占用多少; 到底哪个方法节点跟其他比较,耗时在增加;等等。
这些指标该怎么获取呢?
那我先问你,你是想看当前时刻的,还是某个区间的? 如果你确定想看某个区间,比如页面跳转有点慢,你只想看开始跳转到跳转结束,那应该有两个标识,只记录这个区间的运行指标。 如果你想看某个时刻的,那只需要到那个时刻,像拍照一样,拍一下就行了,然后就可以拿着这个记录分析了。
常见的调试技巧有哪些呢?
分析bug 常用:debug, 打log;
性能分析常用:Profiler, systrace, perfetto。
(性能分析时个人感觉perfetto更有优势,可以跟踪开机启动过程、拥有流畅的加载、操作更方便,
使用方式参考:阿豪 )
Perfetto简单使用
例如perfetto 其中抓取方式1: 命令行方式抓取20秒:
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
拉取trace:
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
将文件拖到这个网页(ui.perfetto.dev/ )中即可查看
分析卡顿位置:
这可是大体看到哪个部分耗时了,比如这里activityStart的过程中比较费时,花了2秒。
perfetto不能具体看到应用里面的函数调用。(如果需要分析函数调用栈,可以手动插桩打出trace,然后通过android studio的profiler看就可以,这里主要做系统层面的分析)
如果查看一个区间线程的任务状态占比,可以选中要查看的进程,然后圈出Runnable区域,在下方ThreadStates就可以看到各种状态的耗时占比了。这可以辅助定性分析任务的耗时原因。