文章目录
一、耗时代码的查找以及Systrace、traceview工具的使用
1.查看App启动时间
(1)利用adb shell 命令查看启动耗时
adb shell am start -W com.zzq.cilent/com.zzq.cilent.MainActivity
注:
com.zzq.cilent为应用包名
com.zzq.cilent.MainActivity 为应用的Launcher Activity 完整名称
拓展:
adb shell am start -S -R 10 -W com.zzq.cilent/com.zzq.cilent.MainActivity
-S表示每次启动之前都强行杀死该MainActivity
-R 10 表示重复测试10次
输入命令后结果为
D:\workspace\Cilent>adb shell am start -W com.zzq.cilent/com.zzq.cilent.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.zzq.cilent/.MainActivity }
Status: ok
Activity: com.zzq.cilent/.MainActivity
ThisTime: 697
TotalTime: 697
WaitTime: 724
Complete
ThisTime:表示最后一个启动的Activity的启动耗时
TotalTime:新应用启动的耗时,包括新进程的启动和Activity的启动
WaitTime:ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动)
(2)利用日志过滤查看启动时间
通过displayed关键字过滤查看Activity的启动时间
(3)Systrace
1.如何获取systrace文件
-
通过DDMS如何打开获取
点击Android sdk的安装目录下的tools\monitor.bat,可以打开DDMS
点上图中红圈中的按钮可以收集systrace文件 -
通过命令获取
systrace.py -t 10 -o d:/mytrace.html sched gfx view am -a com.zzq.cilent
运行这个命令需要安装Python环境,包括配置好Python的环境变量。由于systrace.py的命令来源于Android sdk安装目录下的\platform-tools\systrace目录,所以此目录需要配置到环境变量中。
安装Python时需要选择一起安装pip,six。不然运行命令会报错。
如果提示ImportError: No module named ‘win32con’,可以用一下命令解决
pip install pypiwin32
如果提示ImportError: No module named six,可以用一下命令解决
pip install six
systrace命令解析
sched
: CPU调度的信息,非常重要;你能看到CPU在每个时间段在运行什么线程;线程调度情况,比如锁信息。gfx
:Graphic系统的相关信息,包括SerfaceFlinger,VSYNC消息,Texture,RenderThread等;分析卡顿非常依赖这个。view
: View绘制系统的相关信息,比如onMeasure,onLayout等;对分析卡顿比较有帮助。am
:ActivityManager调用的相关信息;用来分析Activity的启动过程比较有效。
1.如果想测滑动时的流畅性问题
可在命令里面加上gfx input view
2.如果想测试进入App或者进入某个页面的速度
可在命令里面加入gfx input view am wm res
3.如果怀疑有GC或者IO导致的卡顿
可在命令里面加入gfx input view dalvik disk
4.如果有怀疑有电量的问题
可在命令里面加入gfx input view res am wm power
options | 解释 |
---|---|
-o <FILE > | 输出的目标文件 |
-t N, –time=N | 执行时间,默认5s |
-b N, –buf-size=N | buffer大小(单位kB),用于限制trace总大小,默认无上限 |
-k <KFUNCS >,–ktrace=<KFUNCS > | 追踪kernel函数,用逗号分隔 |
-a <APP_NAME >,–app=<APP_NAME > | 追踪应用包名,用逗号分隔 |
–from-file=<FROM_FILE > | 从文件中创建互动的systrace |
-e <DEVICE_SERIAL >,–serial=<DEVICE_SERIAL > | 指定设备 |
-l, –list-categories | 列举可用的tags |
2.如何查看systrace文件
在chrome浏览器输入chrome://tracing/ 点load可以选择d:/mytrace.html文件即可查看。
3.如何操作systrace文件
导航操作
导航操作 | 作用 |
---|---|
w | 放大,[+shift]速度更快 |
s | 缩小,[+shift]速度更快 |
a | 左移,[+shift]速度更快 |
d | 右移,[+shift]速度更快 |
快捷操作
常用操作 | 作用 |
---|---|
f | 放大当前选定区域 |
m | 标记当前选定区域 |
v | 高亮VSync |
g | 切换是否显示60hz的网格线 |
0 | 恢复trace到初始态,这里是数字0而非字母o |
一般操作 | 作用 |
---|---|
h | 切换是否显示详情 |
/ | 搜索关键字 |
enter | 显示搜索结果,可通过← →定位搜索结果 |
` | 显示/隐藏脚本控制台 |
? | 显示帮助功能 |
模式切换
- Select mode: 双击已选定区能将所有相同的块高亮选中;(对应数字1)
- Pan mode: 拖动平移视图(对应数字2)
- Zoom mode:通过上/下拖动鼠标来实现放大/缩小功能;(对应数字3)
- Timing mode:拖动来创建或移除时间窗口线。(对应数字4)
可通过按数字1~4,用于切换鼠标模式; 另外,按住alt键,再滚动鼠标滚轮能实现放大/缩小功能
绿色:表示处于运行中
作用: 查看Running状态的线程,查看其运行的时间,与竞品做对比,分析快或者慢的原因
是否频率不够?
是否跑在了小核上?
是否在Running 与Runnable之间切换? 为什么?
是否在Running 与Sleep之间切换? 为什么?
蓝色:表示处于可运行状态
作用:Runnable状态的线程持续时间越长,则表示cpu调度越忙,没有及时处理这个任务
是否后台有太多的任务在跑?
是否频率太低?
被限制某个具体的cpuset cpu很满?
此时Running状态的线程是哪个? 为什么?
白色:表示处于休眠状态
一般是在等待时间驱动
或者是线程处于互斥锁状态
橘色:表示不可中断睡眠状态
一般都是线程在IO上被阻塞,或者等待磁盘操作,IO很慢,大量的橘色出现,表明低内存状态。
紫色:表示可中断的睡眠状态
一般是线程在另一个内核上被阻塞,有可能是正常的,有可能是不正常的。
这里的R表示Linux 进程状态,另外几种状态分别为:
- D 无法中断的休眠状态 (IO 进程)
- R 正在可运行队列中的
- S 休眠状态
- T 停止
- W 内存交换
- X 死掉的进程
- Z 僵尸进程
- 1处的F表示一帧,绿色表示这一帧绘制没有问题,黄色表示有少量问题,红色表示有较大问题
- 2处表示draw方法的耗时
- 3处是列出了当前帧可能存在的问题
(4)traceview的获取与查看
1.通过代码获取、
可以在你猜测的一段问题代码两头加以下代码
Debug.startMethodTracing("trace");
...
Debug.stopMethodTracing();
参数说明:
Name
: 该线程运行过程中所调用的函数名Incl Cpu Time
: 某函数占用的CPU时间,包含内部调用其它函数的CPU时间Excl Cpu Time
: 某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间Incl Real Time
: 某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间Excl Real Time
: 某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间Call+Recur Calls/Total
: 某函数被调用次数以及递归调用占总调用次数的百分比Cpu Time/Call
: 某函数调用CPU时间(Incl Cpu time)与调用次数的比,等价于该函数平均执行时长。Real Time/Call
: 某函数调用CPU时间(Incl Real time)与调用次数的比。等价于该函数平均真实时长
重点关注项:
Cpu Time/Call
函数平均执行时间较长的函数;Call+Recur Calls/Total
,调用次数非常频繁的函数。