Android 性能优化实践(一)——耗时代码的查找以及工具的使用

一、耗时代码的查找以及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=Nbuffer大小(单位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显示搜索结果,可通过← →定位搜索结果
`显示/隐藏脚本控制台
?显示帮助功能
模式切换
  1. Select mode: 双击已选定区能将所有相同的块高亮选中;(对应数字1)
  2. Pan mode: 拖动平移视图(对应数字2)
  3. Zoom mode:通过上/下拖动鼠标来实现放大/缩小功能;(对应数字3)
  4. 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();

在这里插入图片描述

参数说明:

  1. Name: 该线程运行过程中所调用的函数名
  2. Incl Cpu Time: 某函数占用的CPU时间,包含内部调用其它函数的CPU时间
  3. Excl Cpu Time: 某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间
  4. Incl Real Time: 某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间
  5. Excl Real Time: 某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间
  6. Call+Recur Calls/Total: 某函数被调用次数以及递归调用占总调用次数的百分比
  7. Cpu Time/Call: 某函数调用CPU时间(Incl Cpu time)与调用次数的比,等价于该函数平均执行时长。
  8. Real Time/Call: 某函数调用CPU时间(Incl Real time)与调用次数的比。等价于该函数平均真实时长

重点关注项:

  • Cpu Time/Call 函数平均执行时间较长的函数;
  • Call+Recur Calls/Total,调用次数非常频繁的函数。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值