app卡顿分析

app卡顿分析,第1张

app卡顿分析
目录

目录 

1. 引言 

2. app卡顿分析工具 

2.1. systrace 

3. 环境安装 

3.1. 安装adb命令 

3.2. 安装python2.7 

3.3. 配置pip 

3.4. 安装 win32con 

3.5. 安装 six 

3.6. 安装模拟器 

3.7. 连接设备 

4. 分析卡顿的步骤 

5. 获取systrace文件 

5.1. 执行python脚本 

5.2. 场景重现 

5.3. 生成结果文件 

5.4. 打开结果文件 

5.5. systrace语法 

5.6. 参数options 

5.7. 参数category 

5.8. 命令示例 

6. 分析systrace结果 

6.1. 文件结构 

6.2. 模式切换 

6.3. 常用快捷键 

6.4. 线程状态 

6.5. 分析帧率 

6.6. 分析alert 

7. 常见问题 

7.1. No module named win32con 

7.2. No module named six 

7.3. 'pip' 不是内部或外部命令,也不是可运行的程序 

7.4. device_errors.CommandFailedError 


  1. 引言

用户对卡顿的感知,主要来源于界面的刷新,而界面的性能主要是依赖于设备的UI渲染性能,如果我们的UI设计过于复杂,或是实现不够好,设备又不给力,界面就会像卡住了一样,给用户卡顿的感觉。


  1. app卡顿分析工具

    1. systrace

systrace是分析Android性能问题的神器,Google IO 2017上更是对其各种强推,是分析卡顿掉帧问题的核心工具,只要能提供卡顿现场,systrace就能很好定位问题。

Android SDK自带systrace的python脚本,存放路径为:

androidSDKplatform-toolssystrace


  1. 环境安装

  1. 安装adb命令

adb命令包含在Android SDK中,这里通过安装 Android Studio,来安装Android SDK。

安装后,启动 Android Studio,下载 SDK(需要一定的时间)。

SDK下载完成后,在环境变量Path中添加adb命令路径。C:Users***AppDataLocalAndroidSdkplatform-tools

在命令行界面输入adb version出现如下界面,说明adb配置成功

 


  1. 安装python2.7

systrace只支持python2.7,不支持python3,从systrace.py脚本中可以看到有此判断

安装完成后,在环境变量Path中添加python安装路径

在命令行界面输入python -V出现如下界面,说明python安装成功(注意:-V,V大写)


  1. 配置pip

在环境变量Path中添加pip命令路径。

D:Python27scripts


  1. 安装 win32con

安装 win32con,使用命令:pip install pypiwin32


  1. 安装 six

安装 six,使用命令: pip install six


  1. 安装模拟器

除了android自带的模拟器,还可以选择第三方模拟器,如mumu模拟器、夜神模拟器,这里以mumu模拟器为例。

安装完成后,在命令行界面输入adb connect 127.0.0.1:7555、adb devices,出现如下界面,说明模拟器连接成功


  1. 连接设备

连接设备的时候,可以选择android自带模拟器、mumu模拟器、真机。

这里以真机为例:

  1. 用USB数据线连接真机与电脑
  2. 打开真机的开发者选项(版本号连续点击7或5次开启)
  3. 打开USB调试开关
  4. 打开命令行界面,输入adb devices,出现真机设备编号,表示设备连接成功


  1. 分析卡顿的步骤
  1. 找到卡顿的场景,并抓取卡顿发生时的systrace文件;
  2. 找到发生问题的应用进程的主线程,并通过标红的F图标,找到发生问题的问题帧;
  3. 通过放大和高亮去判断具体是哪一个细节点发生了耗时情况。

  1. 获取systrace文件

要想分析卡顿现场,必须先获取到卡顿现场的systrace文件,本文通过python脚本的方式获取systrace文件。


    1. 执行python脚本

命令:python C:Users***AppDataLocalAndroidSdkplatform-toolssystracesystrace.py -t 30 -o D:testresultmytrace.html

命令解析:

“C:Users***AppDataLocalAndroidSdkplatform-toolssystrace”是Android SDK自带的脚本路径

-t: 抓取systrace的时间长度,30秒

-o: 指定文件输出位置和文件名


    1. 场景重现

输入命令以后,按回车,然后 *** 作设备,重现现卡顿现场


    1. 生成结果文件

命令执行完毕,会在D:testresultmytrace.html生成html格式的结果文件。


    1. 打开结果文件

使用chrome浏览器(其他浏览器很可能打不开),打开上述步骤中生成的html文件,正常情况下会看到如下图所示界面

 


    1. systrace语法

python systrace.py [options] [category1 [category2 ...]]

[options] 是一些命令参数,[category] 是你想要trace的系统模块,比如view代表view系统(包含绘制流程),am代表ActivityManager(包含Activity创建过程等),分析不同问题时,可以选择不同的模块。

需要注意的是,尽可能缩小需要trace的模块,其一是数据量小易于分析;其二,虽然systrace本身开销很小,但是缩小需要trace的模块也能减少运行时开销。比如你分析卡顿的时候,power, webview 就几乎是无用的。

如果不指定任何类别或选项,systrace将生成包含所有可用类别的报告,并使用默认设置,可用的类别取决于使用的连接设备。


    1. 参数options

options

解释

-o

指定trace数据文件的输出路径,如果不指定就是当前目录的trace.html

-t N

--time=N

执行时间,默认5s。注意不要把时间设的太短导致 *** 作没完Trace就跑完了,这样会出现Did not finish 的标签,分析数据就基本无效了

-b N

--buf-size=N

buffer大小(单位kB),用于限制trace总大小,默认无上限

-k

--ktrace=

追踪kernel函数,用逗号分隔

-a

--app=

这个选项可以开启指定包名App中自定义Trace Label的Trace功能。也就是说,如果你在代码中使用了Trace.beginSection("tag")、Trace.endSection,默认情况下,你的这些代码是不会生效的,因此,这个选项一定要开启

--from-file=

从文件中创建互动的systrace

-e

--serial=

指定设备,在特定连接设备上进行跟踪,由设备序列号标识

-l

--list-categories

这个用来列出你分析的那个手机系统支持的Trace模块,一般来说,高版本的支持的模块更多


    1. 参数category

category

解释

gfx

Graphic系统的相关信息,包括SerfaceFlinger、VSYNC消息、Texture、RenderThread等,分析卡顿非常依赖这个

input

Input

view

View绘制系统的相关信息,比如onMeasure、onLayout等

webview

WebView

wm

Window Manager

am

ActivityManager调用的相关信息,用来分析Activity的启动过程比较有效

sm

Sync Manager

audio

Audio

video

Video

camera

Camera

hal

Hardware Modules

app

Application

res

Resource Loading

dalvik

虚拟机相关信息,比如GC停顿等

rs

Renderscript

bionic

Bionic C Library

power

Power Management

sched

CPU调度的信息,你能看到CPU在每个时间段在运行什么线程,线程调度情况,比如锁信息

binder_driver

Binder驱动的相关信息,如果你怀疑是Binder IPC的问题,不妨打开这个

core_services

SystemServer中系统核心Service的相关信息,分析特定问题用

irq

IRQ Events

freq

CPU Frequency

idle

CPU Idle

disk

Disk I/O

mmc

eMMC commands

load

CPU Load

sync

Synchronization

workq

Kernel Workqueues

memreclaim

Kernel Memory Reclaim

regulators

Voltage and Current Regulators


    1. 命令示例

例1: 调用systrace在10秒钟内记录设备进程,包括图形进程,并生成一个名为mynewtrace的HTML报告:

python systrace.py --time=10 -o mynewtrace.html gfx

例2: 检测UI性能:

python systrace.py view --time=10

例3:显示所有支持的选项(取决于使用的连接设备)

python systrace.py -l


  1. 分析systrace结果

    1. 文件结构

Systrace的文件结构从上到下一般是:

1、内核信息(CPU片信息);

2、surfaceflinger(底层绘制信号等信息);

3、system_server等其他进程信息。

横坐标是以时间为单位,纵坐标是以进程-线程的方式来划分,同一进程的线程为一组放在一起,可收缩或展开

 


    1. 模式切换

 Select mode: 双击已选定区能将所有相同的块高亮选中;(对应数字1)

 Pan mode: 拖动平移视图(对应数字2)

 Zoom mode:通过上/下拖动鼠标来实现放大/缩小功能;(对应数字3)

 Timing mode:拖动来创建或移除时间窗口线。(对应数字4)

可通过按数字1~4,切换鼠标模式;另外,按住alt键,再滚动鼠标滚轮能实现放大/缩小功能。


    1. 常用快捷键

w: 放大,[+shift]速度更快

s: 缩小,[+shift]速度更快

a: 左移,[+shift]速度更快

d: 右移,[+shift]速度更快

f: 放大当前选定区域

m: 标记当前选定区域

v: 高亮VSync

g: 切换是否显示60hz的网格线

0: 恢复trace到初始态,这里是数字0而非字母o

h: 切换是否显示详情

/: 搜索关键字

enter: 显示搜索结果,可通过← →定位搜索结果

`: 显示/隐藏脚本控制台

?: 显示帮助功能


    1. 线程状态

在线程的上面有一条多色线条,代表了该线程的状态:

灰色: 睡眠

蓝色: 可以运行(它可以运行,但还未被调度运行)

绿色: 正在运行(调度程序认为它正在运行)

红色: 不间断的睡眠(通常发生在内核锁上), 指出I / O负载,对于性能问题的调试非常有用

橙色: 由于I / O负载导致的不间断睡眠


    1. 分析帧率

帧率是指每秒传输的帧数,每秒钟帧数越多,所显示的动作就会越流畅。一般来说安卓设备的屏幕刷新率为60帧/秒,要保持画面流畅不卡顿,要求每一帧的时间不超过1000/60=16.6ms,否则就会出现跳帧、画面卡顿。

在每个app进程,都有一个frames行,正常情况以绿色的圆点表示。当圆点颜色为黄色或者红色时,意味着这一帧超过16.6ms,这时需要通过放大那一帧进一步分析问题。对于Android 5.0(API level 21)或者更高的设备,该问题主要聚焦在UI Thread和Render Thread这两个线程当中,对于更早的版本,所有工作在UI Thread。

点击一个绿色的帧点,按m键,可以看到这一帧的时间是10.831ms

再点击一个红色的帧,按m键,可以看到这一帧的时间达到了52.709ms

按w键放大,在帧点下方可以看到具体的任务内容和占用时长

点击F,会在下栏显示相关内容


    1. 分析alert

单击窗口最右侧的alerts选项卡,可以查看工具在trace中发现的每个alert以及设备触发alert的次数。

选中alert,左侧页面会同时选中发生alert的帧

画面向上拉到最开头的alerts区域,会看到相应的alert也被选中


  1. 常见问题

    1. No module named win32con

执行systrace.py脚本时,遇到importError: No module named win32con报错

安装 win32con,使用命令:pip install pypiwin32


    1. No module named six

执行systrace.py脚本时,遇到importError: No module named six报错

安装 six,使用命令: pip install six


    1. 'pip' 不是内部或外部命令,也不是可运行的程序

在环境变量Path中添加pip命令路径。

D:Python27scripts


    1. device_errors.CommandFailedError

执行systrace.py脚本时,遇到如下错误

进行 *** 作时,使用的是模拟器,目前没有找到原因,替换真机进行systrace *** 作,可以成功。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5671985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存